| "use strict"; | 
| var __importDefault = (this && this.__importDefault) || function (mod) { | 
|     return (mod && mod.__esModule) ? mod : { "default": mod }; | 
| }; | 
| Object.defineProperty(exports, "__esModule", { value: true }); | 
| exports.compileToken = exports.compileUnsafe = exports.compile = void 0; | 
| var css_what_1 = require("css-what"); | 
| var boolbase_1 = require("boolbase"); | 
| var sort_1 = __importDefault(require("./sort")); | 
| var procedure_1 = require("./procedure"); | 
| var general_1 = require("./general"); | 
| var subselects_1 = require("./pseudo-selectors/subselects"); | 
| /** | 
|  * Compiles a selector to an executable function. | 
|  * | 
|  * @param selector Selector to compile. | 
|  * @param options Compilation options. | 
|  * @param context Optional context for the selector. | 
|  */ | 
| function compile(selector, options, context) { | 
|     var next = compileUnsafe(selector, options, context); | 
|     return (0, subselects_1.ensureIsTag)(next, options.adapter); | 
| } | 
| exports.compile = compile; | 
| function compileUnsafe(selector, options, context) { | 
|     var token = typeof selector === "string" ? (0, css_what_1.parse)(selector) : selector; | 
|     return compileToken(token, options, context); | 
| } | 
| exports.compileUnsafe = compileUnsafe; | 
| function includesScopePseudo(t) { | 
|     return (t.type === "pseudo" && | 
|         (t.name === "scope" || | 
|             (Array.isArray(t.data) && | 
|                 t.data.some(function (data) { return data.some(includesScopePseudo); })))); | 
| } | 
| var DESCENDANT_TOKEN = { type: css_what_1.SelectorType.Descendant }; | 
| var FLEXIBLE_DESCENDANT_TOKEN = { | 
|     type: "_flexibleDescendant", | 
| }; | 
| var SCOPE_TOKEN = { | 
|     type: css_what_1.SelectorType.Pseudo, | 
|     name: "scope", | 
|     data: null, | 
| }; | 
| /* | 
|  * CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector | 
|  * http://www.w3.org/TR/selectors4/#absolutizing | 
|  */ | 
| function absolutize(token, _a, context) { | 
|     var adapter = _a.adapter; | 
|     // TODO Use better check if the context is a document | 
|     var hasContext = !!(context === null || context === void 0 ? void 0 : context.every(function (e) { | 
|         var parent = adapter.isTag(e) && adapter.getParent(e); | 
|         return e === subselects_1.PLACEHOLDER_ELEMENT || (parent && adapter.isTag(parent)); | 
|     })); | 
|     for (var _i = 0, token_1 = token; _i < token_1.length; _i++) { | 
|         var t = token_1[_i]; | 
|         if (t.length > 0 && (0, procedure_1.isTraversal)(t[0]) && t[0].type !== "descendant") { | 
|             // Don't continue in else branch | 
|         } | 
|         else if (hasContext && !t.some(includesScopePseudo)) { | 
|             t.unshift(DESCENDANT_TOKEN); | 
|         } | 
|         else { | 
|             continue; | 
|         } | 
|         t.unshift(SCOPE_TOKEN); | 
|     } | 
| } | 
| function compileToken(token, options, context) { | 
|     var _a; | 
|     token = token.filter(function (t) { return t.length > 0; }); | 
|     token.forEach(sort_1.default); | 
|     context = (_a = options.context) !== null && _a !== void 0 ? _a : context; | 
|     var isArrayContext = Array.isArray(context); | 
|     var finalContext = context && (Array.isArray(context) ? context : [context]); | 
|     absolutize(token, options, finalContext); | 
|     var shouldTestNextSiblings = false; | 
|     var query = token | 
|         .map(function (rules) { | 
|         if (rules.length >= 2) { | 
|             var first = rules[0], second = rules[1]; | 
|             if (first.type !== "pseudo" || first.name !== "scope") { | 
|                 // Ignore | 
|             } | 
|             else if (isArrayContext && second.type === "descendant") { | 
|                 rules[1] = FLEXIBLE_DESCENDANT_TOKEN; | 
|             } | 
|             else if (second.type === "adjacent" || | 
|                 second.type === "sibling") { | 
|                 shouldTestNextSiblings = true; | 
|             } | 
|         } | 
|         return compileRules(rules, options, finalContext); | 
|     }) | 
|         .reduce(reduceRules, boolbase_1.falseFunc); | 
|     query.shouldTestNextSiblings = shouldTestNextSiblings; | 
|     return query; | 
| } | 
| exports.compileToken = compileToken; | 
| function compileRules(rules, options, context) { | 
|     var _a; | 
|     return rules.reduce(function (previous, rule) { | 
|         return previous === boolbase_1.falseFunc | 
|             ? boolbase_1.falseFunc | 
|             : (0, general_1.compileGeneralSelector)(previous, rule, options, context, compileToken); | 
|     }, (_a = options.rootFunc) !== null && _a !== void 0 ? _a : boolbase_1.trueFunc); | 
| } | 
| function reduceRules(a, b) { | 
|     if (b === boolbase_1.falseFunc || a === boolbase_1.trueFunc) { | 
|         return a; | 
|     } | 
|     if (a === boolbase_1.falseFunc || b === boolbase_1.trueFunc) { | 
|         return b; | 
|     } | 
|     return function combine(elem) { | 
|         return a(elem) || b(elem); | 
|     }; | 
| } |