UNPKG

@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
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; }; }, }); };