"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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 |