astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
83 lines (82 loc) • 2.46 kB
JavaScript
import { createRequire } from "node:module";
const BROWSER_MAP = {
chrome: "chrome",
edge: "edge",
firefox: "firefox",
hermes: false,
ie: "ie",
ios: "ios_saf",
node: false,
opera: "opera",
rhino: false,
safari: "safari"
};
const VERSION_RE = /\d/;
function convertTargets(esbuildTarget) {
if (!esbuildTarget) return {};
const targets = {};
const entries = Array.isArray(esbuildTarget) ? esbuildTarget : [esbuildTarget];
for (const entry of entries) {
if (entry === "esnext") continue;
const index = entry.search(VERSION_RE);
if (index >= 0) {
const browserName = entry.slice(0, index);
const browser = BROWSER_MAP[browserName];
if (browser === false) continue;
if (browser) {
const [major, minor = 0] = entry.slice(index).split(".").map((v) => Number.parseInt(v, 10));
if (!isNaN(major) && !isNaN(minor)) {
const version = major << 16 | minor << 8;
if (!targets[browser] || version < targets[browser]) {
targets[browser] = version;
}
}
}
}
}
return targets;
}
function pluginCssTargetLowering() {
let resolvedConfig;
return {
name: "astro:css-target-lowering",
enforce: "post",
configResolved(config) {
resolvedConfig = config;
},
async generateBundle(_outputOptions, bundle) {
if (resolvedConfig.build.cssMinify) return;
const cssTarget = resolvedConfig.build.cssTarget;
if (!cssTarget) return;
const targets = convertTargets(cssTarget);
if (Object.keys(targets).length === 0) return;
let lcssTransform;
try {
const requireFromVite = createRequire(import.meta.resolve("vite"));
lcssTransform = requireFromVite("lightningcss").transform;
} catch {
return;
}
for (const [, asset] of Object.entries(bundle)) {
if (asset.type !== "asset") continue;
if (!asset.fileName.endsWith(".css")) continue;
if (typeof asset.source !== "string") continue;
try {
const result = lcssTransform({
...resolvedConfig.css?.lightningcss,
targets,
cssModules: void 0,
filename: asset.fileName,
code: Buffer.from(asset.source),
minify: false
});
asset.source = new TextDecoder().decode(result.code);
} catch {
}
}
}
};
}
export {
pluginCssTargetLowering
};