all files / src/ query.js

91.43% Statements 32/35
71.43% Branches 5/7
85.71% Functions 6/7
91.43% Lines 32/35
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 100 101 102 103 104 105 106 107 108 109  34× 34× 40×   34×         34×       64×     758× 522×     236× 236× 236×             74×                       34× 34×     34×       34× 137× 137× 149× 149× 149×     137× 40×     34×                                                                            
"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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