-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.js
More file actions
116 lines (99 loc) · 4.09 KB
/
build.js
File metadata and controls
116 lines (99 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env node
// ==========================================================================
// nimble.css — Build Script
// Sass compile + Lightning CSS minify
// ==========================================================================
import * as sass from 'sass';
import { transform, Features } from 'lightningcss';
import { mkdirSync, writeFileSync } from 'node:fs';
import { resolve, basename } from 'node:path';
import { parseArgs } from 'node:util';
// ---------------------------------------------------------------------------
// CLI args
// ---------------------------------------------------------------------------
const { values: flags } = parseArgs({
options: {
prefix: { type: 'string', default: '' },
},
strict: false,
});
// ---------------------------------------------------------------------------
// Config
// ---------------------------------------------------------------------------
const ROOT = new URL('.', import.meta.url).pathname;
const DIST = resolve(ROOT, 'dist');
const SITE_DIST = resolve(ROOT, 'site/dist');
// Entry points → output filenames
const entries = [
{ input: 'src/nimble.scss', outName: 'nimble' },
{ input: 'src/nimble-core.scss', outName: 'nimble-core' },
{ input: 'src/nimble-base.scss', outName: 'nimble-base' },
{ input: 'src/nimble-reset.scss', outName: 'nimble-reset' },
{ input: 'src/nimble-utilities.scss', outName: 'nimble-utilities' },
{ input: 'src/nimble-shadow.scss', outName: 'nimble-shadow' },
{ input: 'src/nimble-progress.scss', outName: 'nimble-progress' },
{ input: 'src/nimble-meter.scss', outName: 'nimble-meter' },
{ input: 'src/nimble-select.scss', outName: 'nimble-select' },
];
// Browser targets for Lightning CSS (last 2 versions of modern browsers)
const targets = {
chrome: (120 << 16), // Chrome 120+
firefox: (120 << 16), // Firefox 120+
safari: (17 << 16) | (5 << 8), // Safari 17.5+
};
// ---------------------------------------------------------------------------
// Build
// ---------------------------------------------------------------------------
mkdirSync(DIST, { recursive: true });
mkdirSync(SITE_DIST, { recursive: true });
for (const entry of entries) {
const inputPath = resolve(ROOT, entry.input);
// --- Sass ---
const sassOptions = {
loadPaths: [resolve(ROOT, 'src')],
};
// Inject $prefix override if provided via CLI
if (flags.prefix) {
const prefixValue = flags.prefix;
// Create a virtual wrapper that @use's config with the prefix override,
// then @forward's the real entry point. The wrapper URL must differ from
// the entry to avoid a circular-import error.
const wrapper =
`@use 'config' with ($prefix: '${prefixValue}');\n` +
`@use '${entry.input.replace(/^src\//, '').replace(/\.scss$/, '')}';\n`;
const compiled = sass.compileString(wrapper, {
...sassOptions,
// Use a distinct virtual URL so Sass doesn't detect a self-import
url: new URL('file://' + resolve(ROOT, 'src', '_wrapper.scss')),
});
processOutput(compiled.css, entry.outName);
continue;
}
const compiled = sass.compile(inputPath, sassOptions);
processOutput(compiled.css, entry.outName);
}
function processOutput(css, outName) {
const cssBuffer = Buffer.from(css);
// Write unminified
writeFileSync(resolve(DIST, `${outName}.css`), css);
writeFileSync(resolve(SITE_DIST, `${outName}.css`), css);
// --- Lightning CSS minify ---
const minified = transform({
filename: `${outName}.css`,
code: cssBuffer,
minify: true,
targets,
// Don't transform modern features we intentionally use
exclude:
Features.Colors // keep oklch, light-dark() as-is
| Features.ColorFunction,
});
writeFileSync(resolve(DIST, `${outName}.min.css`), minified.code);
writeFileSync(resolve(SITE_DIST, `${outName}.min.css`), minified.code);
// Report sizes
const fullSize = cssBuffer.length;
const minSize = minified.code.length;
console.log(` ${outName}.css ${fullSize} B`);
console.log(` ${outName}.min.css ${minSize} B`);
}
console.log('\nBuild complete → dist/ + site/dist/');