/** * @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} 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()), }); }