50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
/**
|
|
* @typedef {{
|
|
* file: string,
|
|
* isEntry?: boolean,
|
|
* imports?: string[]
|
|
* }} ViteManifestEntry
|
|
*/
|
|
|
|
/**
|
|
* Static imports of an entry are part of initial JavaScript. Every remaining
|
|
* JavaScript output is governed by the lazy-chunk budget.
|
|
*
|
|
* @param {Record<string, ViteManifestEntry>} manifest
|
|
*/
|
|
export function classifyViteJavascript(manifest) {
|
|
const initialFiles = new Set();
|
|
const visitedKeys = new Set();
|
|
const pendingKeys = Object.entries(manifest)
|
|
.filter(([, entry]) => entry.isEntry)
|
|
.map(([key]) => key);
|
|
const missingImports = [];
|
|
|
|
while (pendingKeys.length > 0) {
|
|
const key = /** @type {string} */ (pendingKeys.pop());
|
|
if (visitedKeys.has(key)) continue;
|
|
visitedKeys.add(key);
|
|
const entry = manifest[key];
|
|
if (!entry) {
|
|
missingImports.push(key);
|
|
continue;
|
|
}
|
|
if (entry.file.endsWith(".js")) initialFiles.add(entry.file);
|
|
pendingKeys.push(...(entry.imports ?? []));
|
|
}
|
|
|
|
const allJavaScript = new Set(
|
|
Object.values(manifest)
|
|
.map((entry) => entry.file)
|
|
.filter((file) => file.endsWith(".js")),
|
|
);
|
|
const lazyFiles = [...allJavaScript].filter(
|
|
(file) => !initialFiles.has(file),
|
|
);
|
|
return Object.freeze({
|
|
initialFiles: Object.freeze([...initialFiles].sort()),
|
|
lazyFiles: Object.freeze(lazyFiles.sort()),
|
|
missingImports: Object.freeze(missingImports.sort()),
|
|
});
|
|
}
|