"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isTraversal = void 0; var css_what_1 = require("css-what"); var procedure = new Map([ [css_what_1.SelectorType.Universal, 50], [css_what_1.SelectorType.Tag, 30], [css_what_1.SelectorType.Attribute, 1], [css_what_1.SelectorType.Pseudo, 0], ]); function isTraversal(token) { return !procedure.has(token.type); } exports.isTraversal = isTraversal; var attributes = new Map([ [css_what_1.AttributeAction.Exists, 10], [css_what_1.AttributeAction.Equals, 8], [css_what_1.AttributeAction.Not, 7], [css_what_1.AttributeAction.Start, 6], [css_what_1.AttributeAction.End, 6], [css_what_1.AttributeAction.Any, 5], ]); /** * Sort the parts of the passed selector, * as there is potential for optimization * (some types of selectors are faster than others) * * @param arr Selector to sort */ function sortByProcedure(arr) { var procs = arr.map(getProcedure); for (var i = 1; i < arr.length; i++) { var procNew = procs[i]; if (procNew < 0) continue; for (var j = i - 1; j >= 0 && procNew < procs[j]; j--) { var token = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = token; procs[j + 1] = procs[j]; procs[j] = procNew; } } } exports.default = sortByProcedure; function getProcedure(token) { var _a, _b; var proc = (_a = procedure.get(token.type)) !== null && _a !== void 0 ? _a : -1; if (token.type === css_what_1.SelectorType.Attribute) { proc = (_b = attributes.get(token.action)) !== null && _b !== void 0 ? _b : 4; if (token.action === css_what_1.AttributeAction.Equals && token.name === "id") { // Prefer ID selectors (eg. #ID) proc = 9; } if (token.ignoreCase) { /* * IgnoreCase adds some overhead, prefer "normal" token * this is a binary operation, to ensure it's still an int */ proc >>= 1; } } else if (token.type === css_what_1.SelectorType.Pseudo) { if (!token.data) { proc = 3; } else if (token.name === "has" || token.name === "contains") { proc = 0; // Expensive in any case } else if (Array.isArray(token.data)) { // Eg. :matches, :not proc = Math.min.apply(Math, token.data.map(function (d) { return Math.min.apply(Math, d.map(getProcedure)); })); // If we have traversals, try to avoid executing this selector if (proc < 0) { proc = 0; } } else { proc = 2; } } return proc; } //# sourceMappingURL=sort.js.map