@tiny-css/compiler
Version:
The compiler for compiling & reducing the bundle size of tiny-css
102 lines (101 loc) • 4.54 kB
JavaScript
;
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;