all files / src/util/ cssIntrospection.js

100% Statements 43/43
100% Branches 22/22
100% Functions 9/9
100% Lines 38/38
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 110 111 112 113 114  111×   118× 430× 407×   23× 15×                               67× 75× 18×   57× 27×                     67×                             67×             24×             804×                                          
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("@opticss/util");
const postcss_selector_parser_1 = require("postcss-selector-parser");
function walkRules(container, eachRule) {
    _walkRulesWithScope(container, eachRule, []);
}
exports.walkRules = walkRules;
function _walkRulesWithScope(container, eachRule, scope) {
    container.each((node) => {
        if (isRule(node)) {
            eachRule(node, scope);
        }
        else if (isAtRule(node)) {
            if (node.name.includes("keyframes") || node.name.includes("font-face")) {
                // skip it, keyframe and font-face at-rules aren't optimizable.
            }
            else {
                _walkRulesWithScope(node, eachRule, scope.concat(node));
            }
        }
        // Otherwise skip it, other possible ChildNode types are `Declaration`
        // or `CommentNode`, we don't care about those.
    });
}
/**
 * Iterate over all identifiers (ex: .class and #id) in a given selector.
 * @param sel ParsedSelector to walk.
 * @param idents Object of type IdentTypes to indicate idents to traverse over.
 * @param cb Callback function passed the IdentNode.
 */
function eachSelectorIdent(sel, idents, cb) {
    sel.eachSelectorNode((node) => {
        if (idents.id && postcss_selector_parser_1.isIdentifier(node)) {
            cb(node);
        }
        else if (idents.class && postcss_selector_parser_1.isClassName(node)) {
            cb(node);
        }
    });
}
exports.eachSelectorIdent = eachSelectorIdent;
/**
 * Iterate over all identifiers (ex: .class and #id) in a given list of CSS files.
 * @param files List of files to parse.
 * @param cache SelectorCache to ensure we are working with the same selector instances.
 * @param idents Object of type IdentTypes to indicate idents to traverse over.
 * @param cb Callback function passed the identifier, rule and parsed selector.
 */
function eachFileIdent(files, cache, idents, cb) {
    eachFileSelector(files, cache, (rule, sel) => eachSelectorIdent(sel, idents, (node) => cb(node, rule, sel)));
}
exports.eachFileIdent = eachFileIdent;
/**
 * Iterate over all selectors in a list of CSS files.
 * @param files List of ParsedCssFile files to iterate over.
 * @param cache SelectorCache to ensure we are working with the same selector instances.
 * @param cb Callback function passed the rule and parsed selector.
 */
function eachFileSelector(files, cache, cb) {
    files.forEach(file => eachSelector(file.content.root, cache, cb));
}
exports.eachFileSelector = eachFileSelector;
/**
 * Iterate over all selectors in a single postcss tree.
 * @param root Postcss root to walk.
 * @param cache SelectorCache to ensure we are working with the same selector instances.
 * @param cb Callback function passed the rule and parsed selector.
 */
function eachSelector(root, cache, cb) {
    walkRules(root, (rule) => cache.getParsedSelectors(rule).forEach((sel) => cb(rule, sel)));
}
exports.eachSelector = eachSelector;
/**
 * Test if a postcss node is an at-rule.
 * @param node postcss node to test.
 * @returns True or false if node is an at-rule.
 */
function isAtRule(node) {
    return (util_1.isObject(node) && node.type === "atrule");
}
exports.isAtRule = isAtRule;
/**
 * Test if a postcss node is a rule.
 * @param node postcss node to test.
 * @returns True or false if node is a rule.
 */
function isRule(node) {
    return (util_1.isObject(node) && node.type === "rule");
}
exports.isRule = isRule;
/**
 * Test if a postcss node is a declaration.
 */
function isDeclaration(node) {
    return (util_1.isObject(node) && node.type === "decl");
}
exports.isDeclaration = isDeclaration;
// const NODE_TYPES = {
//   "root": true,
//   "atrule": true,
//   "rule": true,
//   "decl": true,
//   "comment": true,
// };
/**
 * Test if a postcss node is a container (Root, At-Rule, or Rule).
 * @param node postcss node to test.
 * @returns whether the node is a container.
 */
// export function isContainer(node: whatever): node is postcss.Container {
//   return NODE_TYPES[node] && (<postcss.Container>node).each !== undefined;
// }
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzSW50cm9zcGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsL2Nzc0ludHJvc3BlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx3Q0FBbUQ7QUFHbkQscUVBQW9FO0FBU3BFLG1CQUEwQixTQUE0QixFQUFFLFFBQStCO0lBQ3JGLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUZELDhCQUVDO0FBRUQsNkJBQTZCLFNBQTRCLEVBQUUsUUFBK0IsRUFBRSxLQUFnQjtJQUMxRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBdUIsRUFBRSxFQUFFO1FBQ3pDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdkI7YUFDSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN0RSwrREFBK0Q7YUFDaEU7aUJBQU07Z0JBQ0wsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDekQ7U0FDRjtRQUNELHNFQUFzRTtRQUN0RSwrQ0FBK0M7SUFDakQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBU0Q7Ozs7O0dBS0c7QUFDSCwyQkFBa0MsR0FBbUIsRUFBRSxNQUFrQixFQUFFLEVBQTZCO0lBQ3RHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzVCLElBQUksTUFBTSxDQUFDLEVBQUUsSUFBSSxzQ0FBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQUU7YUFDN0MsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLHFDQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7U0FBRTtJQUMzRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFMRCw4Q0FLQztBQUVEOzs7Ozs7R0FNRztBQUNILHVCQUE4QixLQUFzQixFQUFFLEtBQW9CLEVBQUUsTUFBa0IsRUFBRSxFQUFzRTtJQUNwSyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9HLENBQUM7QUFGRCxzQ0FFQztBQUVEOzs7OztHQUtHO0FBQ0gsMEJBQWlDLEtBQXNCLEVBQUUsS0FBb0IsRUFBRSxFQUFxRDtJQUNsSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFGRCw0Q0FFQztBQUVEOzs7OztHQUtHO0FBQ0gsc0JBQTZCLElBQWtCLEVBQUUsS0FBb0IsRUFBRSxFQUFxRDtJQUMxSCxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBbUIsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQUZELG9DQUVDO0FBSUQ7Ozs7R0FJRztBQUNILGtCQUF5QixJQUFjO0lBQ3JDLE9BQU8sQ0FBQyxlQUFRLENBQUMsSUFBSSxDQUFDLElBQWdCLElBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUZELDRCQUVDO0FBRUQ7Ozs7R0FJRztBQUNILGdCQUF1QixJQUFjO0lBQ25DLE9BQU8sQ0FBQyxlQUFRLENBQUMsSUFBSSxDQUFDLElBQWdCLElBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUZELHdCQUVDO0FBRUQ7O0dBRUc7QUFDSCx1QkFBOEIsSUFBYztJQUMxQyxPQUFPLENBQUMsZUFBUSxDQUFDLElBQUksQ0FBQyxJQUFnQixJQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFGRCxzQ0FFQztBQUVELHVCQUF1QjtBQUN2QixrQkFBa0I7QUFDbEIsb0JBQW9CO0FBQ3BCLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEIscUJBQXFCO0FBQ3JCLEtBQUs7QUFFTDs7OztHQUlHO0FBQ0gsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSxJQUFJIn0=