unplugin-lightningcss
Version:
Lightning CSS integration for Vite, Rollup, esbuild, Webpack, Vue CLI, and more.
50 lines (48 loc) • 1.6 kB
JavaScript
import { Buffer } from "node:buffer";
import { readFile } from "node:fs/promises";
//#region src/core/transform.ts
const postfixRE = /[#?].*$/s;
function cleanUrl(url) {
return url.replace(postfixRE, "");
}
async function transformCss(id, code, options) {
const filename = cleanUrl(id);
const { transform } = await import("lightningcss");
const res = transform({
...options,
filename,
code: Buffer.from(code)
});
return {
code: res.code.toString(),
map: "map" in res ? res.map?.toString() : void 0
};
}
async function transformCssModule(id, options) {
const actualId = id.replace(/\?css_module$/, "");
const code = await readFile(actualId, "utf-8");
const filename = cleanUrl(actualId);
const { transform } = await import("lightningcss");
const res = transform({
cssModules: true,
...options,
filename,
code: Buffer.from(code)
});
const compiledId = actualId.replaceAll("\\", "/").replace(/\.module\.css$/, ".module_built.css");
const classes = Object.fromEntries(Object.entries(res.exports ?? {}).map(([key, value]) => [key, value.name]));
let exports = `const classes = ${JSON.stringify(classes)}\nexport default classes\n`;
const i = 0;
for (const key of Object.keys(classes)) {
const sanitizedKey = `_${key.replaceAll(/\W/g, "_")}${i}`;
exports += `\nconst ${sanitizedKey} = classes[${JSON.stringify(key)}]\nexport { ${sanitizedKey} as ${JSON.stringify(key)} }\n`;
}
return {
code: res.code.toString(),
map: "map" in res ? res.map?.toString() : void 0,
id: compiledId,
exports
};
}
//#endregion
export { transformCss, transformCssModule };