mirror of
https://github.com/olehomelchenko/astrolabe.git
synced 2026-08-08 02:02:33 +00:00
48 lines
2.1 KiB
JavaScript
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)`);
|