|
4 | 4 | // Build JS and CSS using esbuild and PostCSS |
5 | 5 | import { promises as fs } from 'node:fs'; |
6 | 6 | import path from 'node:path'; |
| 7 | +import browserslist from 'browserslist'; |
7 | 8 | import esbuild from 'esbuild'; |
8 | | -import postcss from 'postcss'; |
9 | | -import postcssConfig from './postcss.config.js'; |
| 9 | +import * as lightningcss from 'lightningcss'; |
10 | 10 |
|
11 | 11 | // Packages to build but exclude from bundle |
12 | 12 | const externalPackages = ['chart.js/auto', 'alpinejs/dist/cdn.min.js']; |
@@ -69,11 +69,39 @@ async function processCSS(inputFile, outputFile) { |
69 | 69 | try { |
70 | 70 | await ensureDir(path.dirname(outputFile)); |
71 | 71 | const css = await fs.readFile(inputFile); |
72 | | - const result = await postcss(postcssConfig.plugins).process(css, { |
73 | | - from: inputFile, |
74 | | - to: outputFile, |
| 72 | + const bundle = await lightningcss.bundleAsync({ |
| 73 | + filename: inputFile, |
| 74 | + sourceMap: true, |
| 75 | + code: Buffer.from(css), |
| 76 | + minify: true, |
| 77 | + targets: lightningcss.browserslistToTargets(browserslist()), |
| 78 | + drafts: { customMedia: true, nesting: true }, |
| 79 | + visitor: { |
| 80 | + Url: (node) => { |
| 81 | + // Fix relative paths for webfonts |
| 82 | + if (node.url.startsWith('../webfonts/')) { |
| 83 | + return { |
| 84 | + url: node.url.replace('../webfonts/', '/webfonts/'), |
| 85 | + loc: node.loc, |
| 86 | + }; |
| 87 | + } |
| 88 | + return node; |
| 89 | + }, |
| 90 | + }, |
| 91 | + resolver: { |
| 92 | + resolve(specifier, from) { |
| 93 | + if (!specifier.endsWith('.css')) { |
| 94 | + specifier += '.css'; |
| 95 | + } |
| 96 | + if (specifier.startsWith('node:')) { |
| 97 | + return `node_modules/${specifier.replace('node:', '')}`; |
| 98 | + } |
| 99 | + return `${path.dirname(from)}/${specifier}`; |
| 100 | + }, |
| 101 | + }, |
75 | 102 | }); |
76 | | - await fs.writeFile(outputFile, result.css); |
| 103 | + await fs.writeFile(outputFile, bundle.code); |
| 104 | + await fs.writeFile(`${outputFile}.map`, bundle.map); |
77 | 105 | console.log(`✅ CSS build completed for ${inputFile}`); |
78 | 106 | } catch (error) { |
79 | 107 | console.error(`❌ Error processing CSS for ${inputFile}:`, error); |
|
0 commit comments