|
|
@@ -4,9 +4,9 @@
|
|
|
// Build JS and CSS using esbuild and PostCSS
|
|
|
import { promises as fs } from 'node:fs';
|
|
|
import path from 'node:path';
|
|
|
+import browserslist from 'browserslist';
|
|
|
import esbuild from 'esbuild';
|
|
|
-import postcss from 'postcss';
|
|
|
-import postcssConfig from './postcss.config.js';
|
|
|
+import * as lightningcss from 'lightningcss';
|
|
|
|
|
|
// Packages to build but exclude from bundle
|
|
|
const externalPackages = ['chart.js/auto', 'alpinejs/dist/cdn.min.js'];
|
|
|
@@ -69,11 +69,39 @@ async function processCSS(inputFile, outputFile) {
|
|
|
try {
|
|
|
await ensureDir(path.dirname(outputFile));
|
|
|
const css = await fs.readFile(inputFile);
|
|
|
- const result = await postcss(postcssConfig.plugins).process(css, {
|
|
|
- from: inputFile,
|
|
|
- to: outputFile,
|
|
|
+ const bundle = await lightningcss.bundleAsync({
|
|
|
+ filename: inputFile,
|
|
|
+ sourceMap: true,
|
|
|
+ code: Buffer.from(css),
|
|
|
+ minify: true,
|
|
|
+ targets: lightningcss.browserslistToTargets(browserslist()),
|
|
|
+ drafts: { customMedia: true, nesting: true },
|
|
|
+ visitor: {
|
|
|
+ Url: (node) => {
|
|
|
+ // Fix relative paths for webfonts
|
|
|
+ if (node.url.startsWith('../webfonts/')) {
|
|
|
+ return {
|
|
|
+ url: node.url.replace('../webfonts/', '/webfonts/'),
|
|
|
+ loc: node.loc,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return node;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ resolver: {
|
|
|
+ resolve(specifier, from) {
|
|
|
+ if (!specifier.endsWith('.css')) {
|
|
|
+ specifier += '.css';
|
|
|
+ }
|
|
|
+ if (specifier.startsWith('node:')) {
|
|
|
+ return `node_modules/${specifier.replace('node:', '')}`;
|
|
|
+ }
|
|
|
+ return `${path.dirname(from)}/${specifier}`;
|
|
|
+ },
|
|
|
+ },
|
|
|
});
|
|
|
- await fs.writeFile(outputFile, result.css);
|
|
|
+ await fs.writeFile(outputFile, bundle.code);
|
|
|
+ await fs.writeFile(`${outputFile}.map`, bundle.map);
|
|
|
console.log(`✅ CSS build completed for ${inputFile}`);
|
|
|
} catch (error) {
|
|
|
console.error(`❌ Error processing CSS for ${inputFile}:`, error);
|