| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.compileGeneralSelector = void 0; |
| var attributes_1 = require("./attributes"); |
| var pseudo_selectors_1 = require("./pseudo-selectors"); |
| /* |
| * All available rules |
| */ |
| function compileGeneralSelector(next, selector, options, context, compileToken) { |
| var adapter = options.adapter, equals = options.equals; |
| switch (selector.type) { |
| case "pseudo-element": |
| throw new Error("Pseudo-elements are not supported by css-select"); |
| case "attribute": |
| return attributes_1.attributeRules[selector.action](next, selector, options); |
| case "pseudo": |
| return (0, pseudo_selectors_1.compilePseudoSelector)(next, selector, options, context, compileToken); |
| // Tags |
| case "tag": |
| return function tag(elem) { |
| return adapter.getName(elem) === selector.name && next(elem); |
| }; |
| // Traversal |
| case "descendant": |
| if (options.cacheResults === false || |
| typeof WeakSet === "undefined") { |
| return function descendant(elem) { |
| var current = elem; |
| while ((current = adapter.getParent(current))) { |
| if (adapter.isTag(current) && next(current)) { |
| return true; |
| } |
| } |
| return false; |
| }; |
| } |
| // @ts-expect-error `ElementNode` is not extending object |
| // eslint-disable-next-line no-case-declarations |
| var isFalseCache_1 = new WeakSet(); |
| return function cachedDescendant(elem) { |
| var current = elem; |
| while ((current = adapter.getParent(current))) { |
| if (!isFalseCache_1.has(current)) { |
| if (adapter.isTag(current) && next(current)) { |
| return true; |
| } |
| isFalseCache_1.add(current); |
| } |
| } |
| return false; |
| }; |
| case "_flexibleDescendant": |
| // Include element itself, only used while querying an array |
| return function flexibleDescendant(elem) { |
| var current = elem; |
| do { |
| if (adapter.isTag(current) && next(current)) |
| return true; |
| } while ((current = adapter.getParent(current))); |
| return false; |
| }; |
| case "parent": |
| return function parent(elem) { |
| return adapter |
| .getChildren(elem) |
| .some(function (elem) { return adapter.isTag(elem) && next(elem); }); |
| }; |
| case "child": |
| return function child(elem) { |
| var parent = adapter.getParent(elem); |
| return parent != null && adapter.isTag(parent) && next(parent); |
| }; |
| case "sibling": |
| return function sibling(elem) { |
| var siblings = adapter.getSiblings(elem); |
| for (var i = 0; i < siblings.length; i++) { |
| var currentSibling = siblings[i]; |
| if (equals(elem, currentSibling)) |
| break; |
| if (adapter.isTag(currentSibling) && next(currentSibling)) { |
| return true; |
| } |
| } |
| return false; |
| }; |
| case "adjacent": |
| return function adjacent(elem) { |
| var siblings = adapter.getSiblings(elem); |
| var lastElement; |
| for (var i = 0; i < siblings.length; i++) { |
| var currentSibling = siblings[i]; |
| if (equals(elem, currentSibling)) |
| break; |
| if (adapter.isTag(currentSibling)) { |
| lastElement = currentSibling; |
| } |
| } |
| return !!lastElement && next(lastElement); |
| }; |
| case "universal": |
| return next; |
| } |
| } |
| exports.compileGeneralSelector = compileGeneralSelector; |