unplugin-transform-class
Version:
transform class by rule, support use in vite, rollup, webpack
135 lines (121 loc) • 4.59 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true});// src/core/index.ts
var _utils = require('@meoc/utils');
function getClass(code) {
const matchs = [];
Array.from(code.matchAll(/\s:?[A-Za-z0-9]*[c|C]lass="([\s\S]*?)"/g)).forEach((m) => {
const classStr = m[1];
const sourceStr = _utils.trim.call(void 0, m[0]);
let classArr = [sourceStr];
if (sourceStr.startsWith(":")) {
if (classStr.startsWith("{"))
classArr = classArr.concat(getObjClass(classStr));
else if (classStr.startsWith("["))
classArr = classArr.concat(getArrClass(classStr));
} else {
classArr.push(classStr);
}
matchs.push(classArr);
});
Array.from(code.matchAll(/\s:?[A-Za-z0-9]*[c|C]lassName=["']([\s\S]*?)["']/g)).forEach((m) => {
matchs.push([m[0], m[1]]);
});
Array.from(code.matchAll(/\s:?[A-Za-z0-9]*[c|C]lassName=\{([\s\S]*?)\}/g)).forEach((m) => {
matchs.push([m[0], ...Array.from(m[1].matchAll(/["']([\s\S]+?)["']/g)).map((v) => v[1])]);
});
return matchs;
}
function getObjClass(className) {
return Array.from(className.matchAll(/'([^']+)'\s*:/g)).map((v) => v[1]);
}
function getArrClass(className) {
return Array.from(className.matchAll(new RegExp("(?<=[?:&])\\s*'(.*?)'", "g"))).map((v) => v[1]);
}
function transformCode(code, rules = defaultRules) {
const classNames = getClass(code);
classNames.forEach((c) => {
let currentClass = c[0];
c.slice(1).forEach((selector) => {
currentClass = currentClass.replace(selector, cacheTransformSelector(selector, rules));
});
code = code.replace(c[0], currentClass);
});
return code;
}
// src/utils.ts
var defaultRules = {
".": "_dl_",
"/": "_sl_",
":": "_cl_",
"%": "_pes_",
"!": "_el_",
"#": "_wn_",
"(": "_lbl_",
")": "_lbr_",
"[": "_lfl_",
"]": "_lfr_",
"$": "_do_",
",": "_lco_",
"=": "_eqe_",
"+": "_plus_",
"*": "_star_"
};
function escapeRegExp(str = "") {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function createTransformRegExp(rules, needEscape = false) {
const escapePrefix = "\\";
return new RegExp(Object.keys(rules).map((rule) => escapeRegExp(`${needEscape ? escapePrefix : ""}${rule}`)).join("|"), "g");
}
function transformSelector(selector = "", rules = defaultRules) {
const transformRegExp = createTransformRegExp(rules);
return selector.replaceAll(transformRegExp, (m) => {
return rules[m];
});
}
var cacheTransformSelector = /* @__PURE__ */ (function() {
let transformRegExp;
return (selector = "", rules = defaultRules) => {
if (!transformRegExp)
transformRegExp = createTransformRegExp(rules);
return selector.replaceAll(transformRegExp, (m) => {
return rules[m];
});
};
})();
function transformEscapESelector(selector = "", rules = defaultRules) {
const transformRegExp = createTransformRegExp(rules, true);
return selector.replaceAll(transformRegExp, (m) => {
return rules[m.replace("\\", "")];
});
}
var cacheTransformEscapESelector = /* @__PURE__ */ (function() {
let transformRegExp;
return (selector = "", rules = defaultRules) => {
if (!transformRegExp)
transformRegExp = createTransformRegExp(rules, true);
return selector.replaceAll(transformRegExp, (m) => {
return rules[m.replace("\\", "")];
});
};
})();
function restoreSelector(selector = "", rules = defaultRules) {
const reverseRules = Object.fromEntries(Object.entries(rules).map(([key, value]) => [value, key]));
const transformRegExp = createTransformRegExp(reverseRules);
return selector.replaceAll(transformRegExp, (m) => {
return reverseRules[m];
});
}
var cacheRestoreSelector = /* @__PURE__ */ (function() {
let transformRegExp;
let reverseRules;
return (selector = "", rules = defaultRules) => {
if (!transformRegExp) {
reverseRules = Object.fromEntries(Object.entries(rules).map(([key, value]) => [value, key]));
transformRegExp = createTransformRegExp(reverseRules);
}
return selector.replaceAll(transformRegExp, (m) => {
return reverseRules[m];
});
};
})();
exports.defaultRules = defaultRules; exports.escapeRegExp = escapeRegExp; exports.transformSelector = transformSelector; exports.cacheTransformSelector = cacheTransformSelector; exports.transformEscapESelector = transformEscapESelector; exports.cacheTransformEscapESelector = cacheTransformEscapESelector; exports.restoreSelector = restoreSelector; exports.cacheRestoreSelector = cacheRestoreSelector; exports.getClass = getClass; exports.transformCode = transformCode;