@tiny-css/compiler
Version:
The compiler for compiling & reducing the bundle size of tiny-css
118 lines (117 loc) • 4.18 kB
JavaScript
;
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.groupSelector = exports.globSelectorRegex = exports.pseudoSelectorRegex = exports.idSelectors = exports.classSelectors = exports.nestOpRegex = exports.SelectorType = exports.sudoAttrSelectorRegex = void 0;
var htmltagsRegexp_1 = require("./htmltagsRegexp");
exports.sudoAttrSelectorRegex = /(:[:]?|\[).*\]?/g;
var SelectorType;
(function (SelectorType) {
SelectorType["class"] = "class";
SelectorType["id"] = "id";
SelectorType["tag"] = "tag";
SelectorType["pseudo"] = "pseudo";
SelectorType["invalid"] = "invalid";
})(SelectorType = exports.SelectorType || (exports.SelectorType = {}));
exports.nestOpRegex = />|\+|~/g;
exports.classSelectors = /\.(\w|\d|-|_)+/g;
exports.idSelectors = /#(\w|\d|-|_)+/g;
exports.pseudoSelectorRegex = /^:{1,2}(\w|\d|-|\(|\))+$/;
exports.globSelectorRegex = /\*(:{1,2}(\w|\d|\(|\)|-))?/g;
/**
* returns the correct type of a selector for given string
* @author KR Tirtho
* @param {string} str single selector string
* @return {*} {SelectorType}
* @example
* decide(".btn"); // would return "class"
*/
function decideType(str) {
var strWithOutPseudo = str.replace(exports.sudoAttrSelectorRegex, "");
var type = {
type: SelectorType.invalid,
};
if (exports.idSelectors.test(strWithOutPseudo)) {
type.type = SelectorType.id;
/**
* for Jvascript's weird closure RegExp.test doesn't
* work in function currying so used new RegExp(regex.source, flags)
*/
}
else if (new RegExp(exports.classSelectors.source, "g").test(strWithOutPseudo)) {
type.type = SelectorType.class;
}
else if (exports.globSelectorRegex.test(str) || exports.pseudoSelectorRegex.test(str)) {
type.type = SelectorType.pseudo;
}
else if (htmltagsRegexp_1.HtmlTags.split("|").includes(strWithOutPseudo)) {
type.type = SelectorType.tag;
}
return type.type;
}
/**
* recursively creates CSS selector relations Object
* @author KR Tirtho
* @param {string} src css selector string
* @return {*} {GroupSelectorObject}
* @example
* groupSelector(.class + div > button); //would return
{
nested: true,
type: "class"
selector: ".class",
child: {
nested: true,
type: "tag",
selector: "div",
child: {
nested: false,
type: "tag", selector: "button"
},
},
},
*/
function groupSelector(src) {
var e_1, _a;
var srcArr = src.replace(exports.nestOpRegex, " ").split(" ").filter(Boolean);
var returns = {
nested: false,
type: SelectorType.invalid,
selector: "",
};
try {
for (var srcArr_1 = __values(srcArr), srcArr_1_1 = srcArr_1.next(); !srcArr_1_1.done; srcArr_1_1 = srcArr_1.next()) {
var selector = srcArr_1_1.value;
if (srcArr.length === 1) {
returns.type = decideType(selector);
returns.nested = false;
returns.selector = selector;
}
else if (srcArr.length > 1 && srcArr.indexOf(selector) === 0) {
returns.type = decideType(selector);
returns.nested = true;
returns.selector = selector;
// CAUTION: Uses recursion
returns.child = groupSelector(srcArr.slice(1).join(">"));
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (srcArr_1_1 && !srcArr_1_1.done && (_a = srcArr_1.return)) _a.call(srcArr_1);
}
finally { if (e_1) throw e_1.error; }
}
return returns;
}
exports.groupSelector = groupSelector;