all files / src/Match/ ElementMatcher.js

90.38% Statements 47/52
69.7% Branches 23/33
100% Functions 6/6
90.38% Lines 47/52
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99            1413× 1123×   1413×       5365×     5368× 5368× 5392× 5392× 5084×   308× 13×     284× 13×     271×       5392×                     14× 14×           12×     1409× 1409× 925×     484×     3965×                      
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("@opticss/util");
const SelectorParser = require("postcss-selector-parser");
const util_2 = require("util");
const AttributeMatcher_1 = require("./AttributeMatcher");
const Match_1 = require("./Match");
const Matcher_1 = require("./Matcher");
const TagMatcher_1 = require("./TagMatcher");
function isSelector(node) {
    Eif (node) {
        return node.type === SelectorParser.SELECTOR;
    }
    else {
        return false;
    }
}
exports.isSelector = isSelector;
function findAttr(element, name, namespaceURL = null) {
    let attr = element.attributes.find(attr => {
        return attr.name === name && attr.namespaceURL === namespaceURL;
    });
    return attr;
}
exports.findAttr = findAttr;
class ElementMatcher extends Matcher_1.Matcher {
    constructor() { super(); }
    static get instance() {
        return ElementMatcher._instance;
    }
    matchSelectorComponent(element, selector) {
        let maybe = false;
        for (let node of selector.nodes) {
            let match = this.matchSelectorNode(element, node);
            if (match === Match_1.Match.no) {
                return match;
            }
            else if (match === Match_1.Match.maybe) {
                maybe = true;
            }
        }
        if (maybe) {
            return Match_1.Match.maybe;
        }
        else {
            return Match_1.Match.yes;
        }
    }
    matchSelectorNode(element, node) {
        switch (node.type) {
            case "comment": // never matters
            case "string": // only used as a child of other selector nodes.
            case "selector": // only used as a child of other selector nodes.
                return Match_1.Match.pass;
            case "root":
            case "nesting":
            case "combinator":
                // This is indicative of some sort of programming error.
                throw new Error(`[Internal Error] Illegal selector node: ${util_2.inspect(node)}`);
            case "pseudo":
                let pseudo = node;
                if (pseudo.value === ":not") {
                    let negSelector = pseudo.nodes[0];
                    Eif (isSelector(negSelector)) {
                        return Match_1.negate(this.matchSelectorComponent(element, negSelector));
                    }
                }
            // falls through on purpose
            // most pseudos are equivalent to the universal selector
            case "universal":
                return Match_1.Match.yes;
            case "class":
            case "id":
                let idOrClass = findAttr(element, node.type);
                if (idOrClass) {
                    return AttributeMatcher_1.AttributeMatcher.instance.matchSelectorNode(idOrClass, node);
                }
                else {
                    return Match_1.Match.no;
                }
            case "tag":
                return TagMatcher_1.TagMatcher.instance.matchSelectorNode(element.tagname, node);
            case "attribute":
                let ns = node.namespaceString || null;
                let anAttr = findAttr(element, node.attribute, ns);
                Eif (anAttr) {
                    return AttributeMatcher_1.AttributeMatcher.instance.matchSelectorNode(anAttr, node);
                }
                else {
                    return Match_1.Match.no;
                }
            default:
                return util_1.assertNever(node);
        }
    }
}
ElementMatcher._instance = new ElementMatcher();
exports.ElementMatcher = ElementMatcher;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudE1hdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvTWF0Y2gvRWxlbWVudE1hdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSx3Q0FBNEM7QUFDNUMsMERBQTBEO0FBQzFELCtCQUErQjtBQUUvQix5REFBc0Q7QUFDdEQsbUNBQXdDO0FBQ3hDLHVDQUFzRDtBQUN0RCw2Q0FBMEM7QUFFMUMsb0JBQTJCLElBQWtDO0lBQzNELElBQUksSUFBSSxFQUFFO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxRQUFRLENBQUM7S0FDOUM7U0FBTTtRQUNMLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7QUFDSCxDQUFDO0FBTkQsZ0NBTUM7QUFFRCxrQkFBeUIsT0FBb0IsRUFBRSxJQUFZLEVBQUUsZUFBOEIsSUFBSTtJQUM3RixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssWUFBWSxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBTEQsNEJBS0M7QUFFRCxvQkFBNEIsU0FBUSxpQkFBZ0I7SUFDbEQsZ0JBQXdCLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUzQixNQUFNLEtBQUssUUFBUTtRQUN4QixPQUFPLGNBQWMsQ0FBQyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQUVELHNCQUFzQixDQUFDLE9BQWdCLEVBQUUsUUFBMEI7UUFDakUsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUMvQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFF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