@11tyrocks/eleventy-plugin-sass-lightningcss
Version:
Compile Sass in Eleventy (11ty) and process it with LightningCSS to minify, prefix, and add future CSS support.
77 lines (65 loc) • 2.04 kB
JavaScript
const fs = require("node:fs");
const path = require("node:path");
const sass = require("sass");
const browserslist = require("browserslist");
const { transform, browserslistToTargets } = require("lightningcss");
// Set default transpiling targets
let browserslistTargets = "> 0.2% and not dead";
// Check for user's browserslist
try {
const package = path.resolve(__dirname, fs.realpathSync("package.json"));
const userPkgBrowserslist = require(package);
if (userPkgBrowserslist.browserslist) {
browserslistTargets = userPkgBrowserslist.browserslist;
} else {
try {
const browserslistrc = path.resolve(
__dirname,
fs.realpathSync(".browserslistrc")
);
fs.readFile(browserslistrc, "utf8", (_err, data) => {
if (data.length) {
browserslistTargets = [];
}
data.split(/\r?\n/).forEach((line) => {
if (line.length && !line.startsWith("#")) {
browserslistTargets.push(line);
}
});
});
} catch (err) {
// no .browserslistrc
}
}
} catch (err) {
// no package browserslist
}
module.exports = (eleventyConfig) => {
// Recognize Sass as a "template languages"
eleventyConfig.addTemplateFormats("scss");
// Compile Sass and process with LightningCSS
eleventyConfig.addExtension("scss", {
outputFileExtension: "css",
compile: async function (inputContent, inputPath) {
let parsed = path.parse(inputPath);
if (parsed.name.startsWith("_")) {
return;
}
let targets = browserslistToTargets(browserslist(browserslistTargets));
let result = sass.compileString(inputContent, {
loadPaths: [parsed.dir || "."],
sourceMap: false,
});
this.addDependencies(inputPath, result.loadedUrls);
return async () => {
let { code } = await transform({
code: Buffer.from(result.css),
minify: true,
sourceMap: false,
targets,
});
return code;
};
},
});
};