| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.compileGeneralSelector = void 0;var attributes_1 = require("./attributes");var pseudo_selectors_1 = require("./pseudo-selectors");var css_what_1 = require("css-what");/* * All available rules */function compileGeneralSelector(next, selector, options, context, compileToken) {    var adapter = options.adapter, equals = options.equals;    switch (selector.type) {        case css_what_1.SelectorType.PseudoElement: {            throw new Error("Pseudo-elements are not supported by css-select");        }        case css_what_1.SelectorType.ColumnCombinator: {            throw new Error("Column combinators are not yet supported by css-select");        }        case css_what_1.SelectorType.Attribute: {            if (selector.namespace != null) {                throw new Error("Namespaced attributes are not yet supported by css-select");            }            if (!options.xmlMode || options.lowerCaseAttributeNames) {                selector.name = selector.name.toLowerCase();            }            return attributes_1.attributeRules[selector.action](next, selector, options);        }        case css_what_1.SelectorType.Pseudo: {            return (0, pseudo_selectors_1.compilePseudoSelector)(next, selector, options, context, compileToken);        }        // Tags        case css_what_1.SelectorType.Tag: {            if (selector.namespace != null) {                throw new Error("Namespaced tag names are not yet supported by css-select");            }            var name_1 = selector.name;            if (!options.xmlMode || options.lowerCaseTags) {                name_1 = name_1.toLowerCase();            }            return function tag(elem) {                return adapter.getName(elem) === name_1 && next(elem);            };        }        // Traversal        case css_what_1.SelectorType.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            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 css_what_1.SelectorType.Parent: {            return function parent(elem) {                return adapter                    .getChildren(elem)                    .some(function (elem) { return adapter.isTag(elem) && next(elem); });            };        }        case css_what_1.SelectorType.Child: {            return function child(elem) {                var parent = adapter.getParent(elem);                return parent != null && adapter.isTag(parent) && next(parent);            };        }        case css_what_1.SelectorType.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 css_what_1.SelectorType.Adjacent: {            if (adapter.prevElementSibling) {                return function adjacent(elem) {                    var previous = adapter.prevElementSibling(elem);                    return previous != null && next(previous);                };            }            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 css_what_1.SelectorType.Universal: {            if (selector.namespace != null && selector.namespace !== "*") {                throw new Error("Namespaced universal selectors are not yet supported by css-select");            }            return next;        }    }}exports.compileGeneralSelector = compileGeneralSelector;
 |