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 | 1× 1× 1× 1× 111× 1× 1× 118× 430× 407× 23× 15× 7× 1× 67× 75× 18× 57× 27× 1× 1× 67× 1× 1× 9× 1× 1× 67× 1× 1× 24× 1× 1× 804× 1× 1× 5× 1× | "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= |