unplugin-transform-we-class
Version:
124 lines (117 loc) • 3.78 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/webpack.ts
var webpack_exports = {};
__export(webpack_exports, {
default: () => webpack_default
});
module.exports = __toCommonJS(webpack_exports);
// src/index.ts
var import_unplugin = require("unplugin");
var import_pluginutils = require("@rollup/pluginutils");
// src/core/index.ts
var import_utils = require("@meoc/utils");
// src/utils.ts
var defaultRules = {
".": "-d-",
"/": "-s-",
":": "-c-",
"%": "-p-",
"!": "-e-",
"#": "-w-",
"(": "-bl-",
")": "-br-",
"[": "-fl-",
"]": "-fr-",
"$": "-r-",
",": "-co-"
};
var transformRegExp = /[,\.\/:%!#\(\)\[\]$]/;
var escapePrefix = "\\";
function transformSelector(selector, rules = defaultRules) {
if (transformRegExp.test(selector)) {
for (const transformRule in rules) {
const replaceReg = new RegExp(`${escapePrefix}${transformRule}`, "g");
selector = selector.replace(replaceReg, rules[transformRule]);
}
}
return selector;
}
// src/core/index.ts
function getClass(code) {
const matchs = [];
Array.from(code.matchAll(/\s:?class="((?:\n|.)*?)"/g)).forEach((m) => {
const classStr = m[1];
const sourceStr = (0, import_utils.trim)(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(/className=["']((?:\n|.)+?)["']/g)).forEach((m) => {
matchs.push([m[0], m[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(/(?<=[\?\:])\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, transformSelector(selector, rules));
});
code = code.replace(c[0], currentClass);
});
return code;
}
// src/index.ts
var src_default = (0, import_unplugin.createUnplugin)((options = {}) => {
const rules = options.rules;
const filter = (0, import_pluginutils.createFilter)(
options.include || [/\.[jt]sx?$/, /\.vue$/, /\.vue\?vue/],
options.exclude || [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/]
);
return {
name: "unplugin-transform-we-class",
enforce: "pre",
transformInclude(id) {
return filter(id);
},
transform(code) {
return transformCode(code, rules);
}
};
});
// src/webpack.ts
var webpack_default = src_default.webpack;
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {});
if (module.exports.default) module.exports = module.exports.default;