Files
astrolabe/scripts/check-light-entries.mjs
T

48 lines
2.1 KiB
JavaScript

// 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)`);