UNPKG

@tiny-css/compiler

Version:

The compiler for compiling & reducing the bundle size of tiny-css

102 lines (101 loc) 4.54 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCssObjects = void 0; var ASTTypes_1 = require("./utils/ASTTypes"); var groupSelectors_1 = require("./utils/groupSelectors"); var getSelectorRecursively = function (selectorAST) { var _a; if (selectorAST.type === groupSelectors_1.SelectorType.class) { if (!selectorAST.nested) { return [selectorAST.selector]; } if (selectorAST.nested && ((_a = selectorAST.child) === null || _a === void 0 ? void 0 : _a.type) === groupSelectors_1.SelectorType.class) { var classes = [selectorAST.selector].concat(getSelectorRecursively(selectorAST.child)); return classes; } } return []; }; function getASTRules(rule, classes) { if (!rule.selectors) { return undefined; } var selectorASTArr = rule.selectors.map(groupSelectors_1.groupSelector); var matchedSelector = selectorASTArr.filter(function (selectorAST) { if (selectorAST.type === groupSelectors_1.SelectorType.tag || selectorAST.type === groupSelectors_1.SelectorType.pseudo) { return true; } // const isValidClass = getSelectorRecursively(selectorAST).filter((selector) => { // const selectorPseudo = selector.match(sudoAttrSelectorRegex)?.join(""); // const classesWithSelectorPseudo = classes.map((_class) => `.${_class}${selectorPseudo}`); // return classesWithSelectorPseudo.includes(selector); // }); var isValidClass = classes.map(function (_class) { return "." + _class; }).some(function (_class) { var selectorClasses = getSelectorRecursively(selectorAST).map(function (selector) { return selector.replace(groupSelectors_1.sudoAttrSelectorRegex, ""); }); return selectorClasses.includes(_class); }); return isValidClass; }); if ((matchedSelector === null || matchedSelector === void 0 ? void 0 : matchedSelector.length) !== 0) { return rule; } } /** * returns `cssObject`. Doesn't check for availability in output css file. * `writeCssFile` function finishes the final check. This function only * returns * objects that lazily includes the css .{class} for that. * @author KR Tirtho * @param {string} stylesheetObj the file that includes all the css style declarations as string. * @param {string[]} classes all the classes that needs to be matched with css selectors * @returns {css.Rule} Rule */ function getCssObjects(stylesheetObj, classes) { var _a; var cssObjects = []; (_a = stylesheetObj.stylesheet) === null || _a === void 0 ? void 0 : _a.rules.forEach(function (rule) { /** * Checks if the rule.type is `rule` and filters CSSObject based on that */ if (rule.type === ASTTypes_1.ASTTypes.rule) { var availableRules = getASTRules(rule, classes); if (availableRules) { cssObjects.push(availableRules); } } else if (rule.type === ASTTypes_1.ASTTypes.media) { /** * rule.type of media is same but nested so checking it and the above is same just * execute the same logic same above to get the best output */ var mediaRules = rule.rules; var mediaRuleStore_1 = []; mediaRules === null || mediaRules === void 0 ? void 0 : mediaRules.forEach(function (mediaRule) { var availableMediaRules = getASTRules(mediaRule, classes); if (availableMediaRules) { mediaRuleStore_1.push(availableMediaRules); } }); if (mediaRuleStore_1.length !== 0) { cssObjects.push(__assign(__assign({}, rule), { rules: mediaRuleStore_1 })); } } /** * TODO: @Keyframes recognition & return them relatively * TODO: @CustomMedia recognition */ }); return cssObjects !== null && cssObjects !== void 0 ? cssObjects : false; } exports.getCssObjects = getCssObjects;