"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Match_1 = require("./Match");
const parseSelector_1 = require("./parseSelector");
const cssIntrospection_1 = require("./util/cssIntrospection");
function allParsedSelectors(result) {
let selectors = new Array();
for (let s of result.main) {
selectors.push(s.parsedSelector);
}
for (let type of Object.keys(result.other)) {
for (let s of result.other[type]) {
selectors.push(s.parsedSelector);
}
}
return selectors;
}
exports.allParsedSelectors = allParsedSelectors;
class SelectorCache {
constructor() {
this._cache = new WeakMap();
}
getParsedSelectors(rule) {
if (this._cache.has(rule)) {
return this._cache.get(rule);
}
else {
let selectors = parseSelector_1.parseSelector(rule);
this._cache.set(rule, selectors);
return selectors;
}
}
clear() {
this._cache = new WeakMap();
}
reset(rule) {
this._cache.delete(rule);
}
}
exports.SelectorCache = SelectorCache;
/**
* This query finds all selectors for which the selector references the given
* target elements in any compound selector.
*
* When negated, it finds all selectors that can be proven to never reference
* any of the target elements.
*/
class QuerySelectorReferences {
constructor(elements, negate) {
this.targets = elements;
this.negate = !!negate;
}
execute(container, selectorFactory) {
let matchedSelectors = {
main: [],
other: {},
};
cssIntrospection_1.walkRules(container, (node) => {
let parsedSelectors = selectorFactory && selectorFactory.getParsedSelectors(node) || parseSelector_1.parseSelector(node);
let found = parsedSelectors.filter((value) => {
return this.targets.find((element) => {
let match = Match_1.ElementMatcher.instance.matchSelector(element, value, false);
return this.negate ? Match_1.rejects(match) : Match_1.matches(match);
}) !== undefined;
});
found.forEach((sel) => {
matchedSelectors.main.push({ parsedSelector: sel, rule: node });
});
});
return matchedSelectors;
}
}
exports.QuerySelectorReferences = QuerySelectorReferences;
/**
* This query finds all selectors for which the key selector may match the
* given element in any of its possible dynamic states.
*
* The returned selectors may not actually match depending on the selector
* context and various combinators.
*/
// export class QueryKeySelector implements SelectorQuery {
// target: Element;
// constructor(obj: Element) {
// this.target = obj;
// }
// execute(container: postcss.Container, selectorFactory?: SelectorFactory): ClassifiedParsedSelectors {
// let matchedSelectors: ClassifiedParsedSelectors = {
// main: [],
// other: {},
// };
// walkRules(container, (node) => {
// let parsedSelectors = selectorFactory && selectorFactory.getParsedSelectors(node) || parseSelector(node);
// let found = parsedSelectors.filter((value: ParsedSelector) => matches(ElementMatcher.instance.matchSelector(this.target, value, true)));
// found.forEach((sel) => {
// let key = sel.key;
// if (key.pseudoelement !== undefined) {
// if (matchedSelectors.other[key.pseudoelement.value] === undefined) {
// matchedSelectors.other[key.pseudoelement.value] = [];
// }
// matchedSelectors.other[key.pseudoelement.value].push({parsedSelector: sel, rule: node});
// } else {
// matchedSelectors.main.push({parsedSelector: sel, rule: node});
// }
// });
// });
// return matchedSelectors;
// }
// }
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxtQ0FBMkQ7QUFDM0QsbURBQWdFO0FBQ2hFLDhEQUFvRDtBQWtCcEQsNEJBQW1DLE1BQWlDO0lBQ2xFLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO0lBQzVDLEtBQUssSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtRQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUNsQztJQUNELEtBQUssSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDMUMsS0FBSyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2xDO0tBQ0Y7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBWEQsZ0RBV0M7QUFNRDtJQUVFO1FBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUFrQjtRQUNuQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUM7U0FDL0I7YUFBTTtZQUNMLElBQUksU0FBUyxHQUFHLDZCQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJ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 |