Add packages to optimize svgs dynamically

These packages will be used to dynamically optimize SVG images
during the build.

R=jacktfranklin@chromium.org

Bug: 1216402
Change-Id: I04e95aa7d79c9d67beaf8a7861182c52b16b7d0f
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2939992
Reviewed-by: Jack Franklin <jacktfranklin@chromium.org>
Commit-Queue: Tim van der Lippe <tvanderlippe@chromium.org>
diff --git a/node_modules/css-tree/data/index.js b/node_modules/css-tree/data/index.js
new file mode 100755
index 0000000..ff56c24
--- /dev/null
+++ b/node_modules/css-tree/data/index.js
@@ -0,0 +1,103 @@
+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)
+};