| const mdnAtrules = require('mdn-data/css/at-rules.json'); | 
| const mdnProperties = require('mdn-data/css/properties.json'); | 
| const mdnSyntaxes = require('mdn-data/css/syntaxes.json'); | 
| const patch = require('./patch.json'); | 
| const extendSyntax = /^\s*\|\s*/; | 
|   | 
| function preprocessAtrules(dict) { | 
|     const result = Object.create(null); | 
|   | 
|     for (const atruleName in dict) { | 
|         const atrule = dict[atruleName]; | 
|         let descriptors = null; | 
|   | 
|         if (atrule.descriptors) { | 
|             descriptors = Object.create(null); | 
|   | 
|             for (const descriptor in atrule.descriptors) { | 
|                 descriptors[descriptor] = atrule.descriptors[descriptor].syntax; | 
|             } | 
|         } | 
|   | 
|         result[atruleName.substr(1)] = { | 
|             prelude: atrule.syntax.trim().match(/^@\S+\s+([^;\{]*)/)[1].trim() || null, | 
|             descriptors | 
|         }; | 
|     } | 
|   | 
|     return result; | 
| } | 
|   | 
| function patchDictionary(dict, patchDict) { | 
|     const result = {}; | 
|   | 
|     // copy all syntaxes for an original dict | 
|     for (const key in dict) { | 
|         result[key] = dict[key].syntax || dict[key]; | 
|     } | 
|   | 
|     // apply a patch | 
|     for (const key in patchDict) { | 
|         if (key in dict) { | 
|             if (patchDict[key].syntax) { | 
|                 result[key] = extendSyntax.test(patchDict[key].syntax) | 
|                     ? result[key] + ' ' + patchDict[key].syntax.trim() | 
|                     : patchDict[key].syntax; | 
|             } else { | 
|                 delete result[key]; | 
|             } | 
|         } else { | 
|             if (patchDict[key].syntax) { | 
|                 result[key] = patchDict[key].syntax.replace(extendSyntax, ''); | 
|             } | 
|         } | 
|     } | 
|   | 
|     return result; | 
| } | 
|   | 
| function unpackSyntaxes(dict) { | 
|     const result = {}; | 
|   | 
|     for (const key in dict) { | 
|         result[key] = dict[key].syntax; | 
|     } | 
|   | 
|     return result; | 
| } | 
|   | 
| function patchAtrules(dict, patchDict) { | 
|     const result = {}; | 
|   | 
|     // copy all syntaxes for an original dict | 
|     for (const key in dict) { | 
|         const patchDescriptors = (patchDict[key] && patchDict[key].descriptors) || null; | 
|   | 
|         result[key] = { | 
|             prelude: key in patchDict && 'prelude' in patchDict[key] | 
|                 ? patchDict[key].prelude | 
|                 : dict[key].prelude || null, | 
|             descriptors: dict[key].descriptors | 
|                 ? patchDictionary(dict[key].descriptors, patchDescriptors || {}) | 
|                 : patchDescriptors && unpackSyntaxes(patchDescriptors) | 
|         }; | 
|     } | 
|   | 
|     // apply a patch | 
|     for (const key in patchDict) { | 
|         if (!hasOwnProperty.call(dict, key)) { | 
|             result[key] = { | 
|                 prelude: patchDict[key].prelude || null, | 
|                 descriptors: patchDict[key].descriptors && unpackSyntaxes(patchDict[key].descriptors) | 
|             }; | 
|         } | 
|     } | 
|   | 
|     return result; | 
| } | 
|   | 
| module.exports = { | 
|     types: patchDictionary(mdnSyntaxes, patch.syntaxes), | 
|     atrules: patchAtrules(preprocessAtrules(mdnAtrules), patch.atrules), | 
|     properties: patchDictionary(mdnProperties, patch.properties) | 
| }; |