mirror of
https://github.com/olehomelchenko/astrolabe.git
synced 2026-08-08 02:02:33 +00:00
Build: landing/learn shed eager Monaco+Vega; post-build gate + immutable asset caching
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
// Post-build gate: the marketing entries stay light. The landing (/) and the
|
||||
// learning section (/learn/) must never gain a static edge into the heavy
|
||||
// vendor chunks — this shipped once (Vite's preload helper emitted inside the
|
||||
// monaco chunk chained every lazy import() to it; a vega-scale import in
|
||||
// theme-controls was reachable from Landing). Vite lists an entry's full
|
||||
// static graph as modulepreload links / module scripts in its HTML, so
|
||||
// grepping the emitted HTML catches any regression regardless of cause.
|
||||
//
|
||||
// Runs as part of `npm run build` (after `vite build`). Exit 1 on violation.
|
||||
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
||||
import { join } from 'node:path';
|
||||
|
||||
const pages = ['dist/index.html', 'dist/learn/index.html'];
|
||||
if (existsSync('dist/learn')) {
|
||||
for (const entry of readdirSync('dist/learn', { withFileTypes: true })) {
|
||||
if (entry.isDirectory()) pages.push(join('dist/learn', entry.name, 'index.html'));
|
||||
}
|
||||
}
|
||||
|
||||
const HEAVY = /vendor-(?:monaco|vega)-[^"']*\.js/;
|
||||
const missing = pages.filter((p) => !existsSync(p));
|
||||
if (missing.length > 0) {
|
||||
console.error(
|
||||
`check-light-entries: expected pages missing from dist/:\n ${missing.join('\n ')}`,
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
// The gate bans chunks by name, so it must not fail open: if the names minted in
|
||||
// vite.config.ts (manualChunks) ever change, this makes the rename update the gate
|
||||
// instead of silently disarming it.
|
||||
const assets = readdirSync('dist/assets');
|
||||
for (const chunk of ['vendor-monaco', 'vendor-vega']) {
|
||||
if (!assets.some((f) => f.startsWith(`${chunk}-`) && f.endsWith('.js'))) {
|
||||
console.error(
|
||||
`check-light-entries: no ${chunk}-*.js in dist/assets — chunk naming changed; update vite.config.ts manualChunks and this gate together.`,
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
const offenders = pages.filter((p) => HEAVY.test(readFileSync(p, 'utf8')));
|
||||
if (offenders.length > 0) {
|
||||
console.error(
|
||||
`check-light-entries: light entries reference heavy vendor chunks:\n ${offenders.join('\n ')}`,
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
console.log(`check-light-entries: OK (${pages.length} pages clean of vendor-monaco/vendor-vega)`);
|
||||
Reference in New Issue
Block a user