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-what/lib/parse.js b/node_modules/css-what/lib/parse.js
new file mode 100644
index 0000000..9f8144c
--- /dev/null
+++ b/node_modules/css-what/lib/parse.js
@@ -0,0 +1,292 @@
+"use strict";
+var __spreadArrays = (this && this.__spreadArrays) || function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isTraversal = void 0;
+var reName = /^[^\\#]?(?:\\(?:[\da-f]{1,6}\s?|.)|[\w\-\u00b0-\uFFFF])+/;
+var reEscape = /\\([\da-f]{1,6}\s?|(\s)|.)/gi;
+// Modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87
+var reAttr = /^\s*(?:(\*|[-\w]*)\|)?((?:\\.|[\w\u00b0-\uFFFF-])+)\s*(?:(\S?)=\s*(?:(['"])((?:[^\\]|\\[^])*?)\4|(#?(?:\\.|[\w\u00b0-\uFFFF-])*)|)|)\s*([iI])?\]/;
+var actionTypes = {
+    undefined: "exists",
+    "": "equals",
+    "~": "element",
+    "^": "start",
+    $: "end",
+    "*": "any",
+    "!": "not",
+    "|": "hyphen",
+};
+var Traversals = {
+    ">": "child",
+    "<": "parent",
+    "~": "sibling",
+    "+": "adjacent",
+};
+var attribSelectors = {
+    "#": ["id", "equals"],
+    ".": ["class", "element"],
+};
+// Pseudos, whose data property is parsed as well.
+var unpackPseudos = new Set([
+    "has",
+    "not",
+    "matches",
+    "is",
+    "host",
+    "host-context",
+]);
+var traversalNames = new Set(__spreadArrays([
+    "descendant"
+], Object.keys(Traversals).map(function (k) { return Traversals[k]; })));
+/**
+ * Checks whether a specific selector is a traversal.
+ * This is useful eg. in swapping the order of elements that
+ * are not traversals.
+ *
+ * @param selector Selector to check.
+ */
+function isTraversal(selector) {
+    return traversalNames.has(selector.type);
+}
+exports.isTraversal = isTraversal;
+var stripQuotesFromPseudos = new Set(["contains", "icontains"]);
+var quotes = new Set(['"', "'"]);
+// Unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L152
+function funescape(_, escaped, escapedWhitespace) {
+    var high = parseInt(escaped, 16) - 0x10000;
+    // NaN means non-codepoint
+    return high !== high || escapedWhitespace
+        ? escaped
+        : high < 0
+            ? // BMP codepoint
+                String.fromCharCode(high + 0x10000)
+            : // Supplemental Plane codepoint (surrogate pair)
+                String.fromCharCode((high >> 10) | 0xd800, (high & 0x3ff) | 0xdc00);
+}
+function unescapeCSS(str) {
+    return str.replace(reEscape, funescape);
+}
+function isWhitespace(c) {
+    return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
+}
+/**
+ * Parses `selector`, optionally with the passed `options`.
+ *
+ * @param selector Selector to parse.
+ * @param options Options for parsing.
+ * @returns Returns a two-dimensional array.
+ * The first dimension represents selectors separated by commas (eg. `sub1, sub2`),
+ * the second contains the relevant tokens for that selector.
+ */
+function parse(selector, options) {
+    var subselects = [];
+    var endIndex = parseSelector(subselects, "" + selector, options, 0);
+    if (endIndex < selector.length) {
+        throw new Error("Unmatched selector: " + selector.slice(endIndex));
+    }
+    return subselects;
+}
+exports.default = parse;
+function parseSelector(subselects, selector, options, selectorIndex) {
+    var _a, _b;
+    if (options === void 0) { options = {}; }
+    var tokens = [];
+    var sawWS = false;
+    function getName(offset) {
+        var match = selector.slice(selectorIndex + offset).match(reName);
+        if (!match) {
+            throw new Error("Expected name, found " + selector.slice(selectorIndex));
+        }
+        var name = match[0];
+        selectorIndex += offset + name.length;
+        return unescapeCSS(name);
+    }
+    function stripWhitespace(offset) {
+        while (isWhitespace(selector.charAt(selectorIndex + offset)))
+            offset++;
+        selectorIndex += offset;
+    }
+    function isEscaped(pos) {
+        var slashCount = 0;
+        while (selector.charAt(--pos) === "\\")
+            slashCount++;
+        return (slashCount & 1) === 1;
+    }
+    function ensureNotTraversal() {
+        if (tokens.length > 0 && isTraversal(tokens[tokens.length - 1])) {
+            throw new Error("Did not expect successive traversals.");
+        }
+    }
+    stripWhitespace(0);
+    while (selector !== "") {
+        var firstChar = selector.charAt(selectorIndex);
+        if (isWhitespace(firstChar)) {
+            sawWS = true;
+            stripWhitespace(1);
+        }
+        else if (firstChar in Traversals) {
+            ensureNotTraversal();
+            tokens.push({ type: Traversals[firstChar] });
+            sawWS = false;
+            stripWhitespace(1);
+        }
+        else if (firstChar === ",") {
+            if (tokens.length === 0) {
+                throw new Error("Empty sub-selector");
+            }
+            subselects.push(tokens);
+            tokens = [];
+            sawWS = false;
+            stripWhitespace(1);
+        }
+        else {
+            if (sawWS) {
+                ensureNotTraversal();
+                tokens.push({ type: "descendant" });
+                sawWS = false;
+            }
+            if (firstChar in attribSelectors) {
+                var _c = attribSelectors[firstChar], name_1 = _c[0], action = _c[1];
+                tokens.push({
+                    type: "attribute",
+                    name: name_1,
+                    action: action,
+                    value: getName(1),
+                    ignoreCase: false,
+                    namespace: null,
+                });
+            }
+            else if (firstChar === "[") {
+                var attributeMatch = selector
+                    .slice(selectorIndex + 1)
+                    .match(reAttr);
+                if (!attributeMatch) {
+                    throw new Error("Malformed attribute selector: " + selector.slice(selectorIndex));
+                }
+                var completeSelector = attributeMatch[0], _d = attributeMatch[1], namespace = _d === void 0 ? null : _d, baseName = attributeMatch[2], actionType = attributeMatch[3], _e = attributeMatch[5], quotedValue = _e === void 0 ? "" : _e, _f = attributeMatch[6], value = _f === void 0 ? quotedValue : _f, ignoreCase = attributeMatch[7];
+                selectorIndex += completeSelector.length + 1;
+                var name_2 = unescapeCSS(baseName);
+                if ((_a = options.lowerCaseAttributeNames) !== null && _a !== void 0 ? _a : !options.xmlMode) {
+                    name_2 = name_2.toLowerCase();
+                }
+                tokens.push({
+                    type: "attribute",
+                    name: name_2,
+                    action: actionTypes[actionType],
+                    value: unescapeCSS(value),
+                    namespace: namespace,
+                    ignoreCase: !!ignoreCase,
+                });
+            }
+            else if (firstChar === ":") {
+                if (selector.charAt(selectorIndex + 1) === ":") {
+                    tokens.push({
+                        type: "pseudo-element",
+                        name: getName(2).toLowerCase(),
+                    });
+                    continue;
+                }
+                var name_3 = getName(1).toLowerCase();
+                var data = null;
+                if (selector.charAt(selectorIndex) === "(") {
+                    if (unpackPseudos.has(name_3)) {
+                        if (quotes.has(selector.charAt(selectorIndex + 1))) {
+                            throw new Error("Pseudo-selector " + name_3 + " cannot be quoted");
+                        }
+                        data = [];
+                        selectorIndex = parseSelector(data, selector, options, selectorIndex + 1);
+                        if (selector.charAt(selectorIndex) !== ")") {
+                            throw new Error("Missing closing parenthesis in :" + name_3 + " (" + selector + ")");
+                        }
+                        selectorIndex += 1;
+                    }
+                    else {
+                        selectorIndex += 1;
+                        var start = selectorIndex;
+                        var counter = 1;
+                        for (; counter > 0 && selectorIndex < selector.length; selectorIndex++) {
+                            if (selector.charAt(selectorIndex) === "(" &&
+                                !isEscaped(selectorIndex)) {
+                                counter++;
+                            }
+                            else if (selector.charAt(selectorIndex) === ")" &&
+                                !isEscaped(selectorIndex)) {
+                                counter--;
+                            }
+                        }
+                        if (counter) {
+                            throw new Error("Parenthesis not matched");
+                        }
+                        data = selector.slice(start, selectorIndex - 1);
+                        if (stripQuotesFromPseudos.has(name_3)) {
+                            var quot = data.charAt(0);
+                            if (quot === data.slice(-1) && quotes.has(quot)) {
+                                data = data.slice(1, -1);
+                            }
+                            data = unescapeCSS(data);
+                        }
+                    }
+                }
+                tokens.push({ type: "pseudo", name: name_3, data: data });
+            }
+            else {
+                var namespace = null;
+                var name_4 = void 0;
+                if (firstChar === "*") {
+                    selectorIndex += 1;
+                    name_4 = "*";
+                }
+                else if (reName.test(selector.slice(selectorIndex))) {
+                    name_4 = getName(0);
+                }
+                else {
+                    /*
+                     * We have finished parsing the selector.
+                     * Remove descendant tokens at the end if they exist,
+                     * and return the last index, so that parsing can be
+                     * picked up from here.
+                     */
+                    if (tokens.length &&
+                        tokens[tokens.length - 1].type === "descendant") {
+                        tokens.pop();
+                    }
+                    addToken(subselects, tokens);
+                    return selectorIndex;
+                }
+                if (selector.charAt(selectorIndex) === "|") {
+                    namespace = name_4;
+                    if (selector.charAt(selectorIndex + 1) === "*") {
+                        name_4 = "*";
+                        selectorIndex += 2;
+                    }
+                    else {
+                        name_4 = getName(1);
+                    }
+                }
+                if (name_4 === "*") {
+                    tokens.push({ type: "universal", namespace: namespace });
+                }
+                else {
+                    if ((_b = options.lowerCaseTags) !== null && _b !== void 0 ? _b : !options.xmlMode) {
+                        name_4 = name_4.toLowerCase();
+                    }
+                    tokens.push({ type: "tag", name: name_4, namespace: namespace });
+                }
+            }
+        }
+    }
+    addToken(subselects, tokens);
+    return selectorIndex;
+}
+function addToken(subselects, tokens) {
+    if (subselects.length > 0 && tokens.length === 0) {
+        throw new Error("Empty sub-selector");
+    }
+    subselects.push(tokens);
+}