diff --git a/src/domain/javascript/javascriptStaticAnalysisCalls.ts b/src/domain/javascript/javascriptStaticAnalysisCalls.ts index 8abf7a9354..ae69f61c2d 100644 --- a/src/domain/javascript/javascriptStaticAnalysisCalls.ts +++ b/src/domain/javascript/javascriptStaticAnalysisCalls.ts @@ -398,7 +398,14 @@ export const indexVitePreloadDependencyTable = ( if (tables.length !== 1) return []; const table = tables[0]; if (table === undefined) return []; - const dependencies = table.elements.map((element) => + // A spread contributes an unknown number of entries, so every later slot + // has an unknown index; leave those out instead of shifting them. + const spread = table.elements.findIndex((element) => + t.isSpreadElement(element), + ); + const dependencies = ( + spread === -1 ? table.elements : table.elements.slice(0, spread) + ).map((element) => element === null || t.isSpreadElement(element) ? undefined : stringValue(element), diff --git a/src/domain/javascript/javascriptVitePreloadDependencies.test.ts b/src/domain/javascript/javascriptVitePreloadDependencies.test.ts index 4995dd06c8..f22e81b052 100644 --- a/src/domain/javascript/javascriptVitePreloadDependencies.test.ts +++ b/src/domain/javascript/javascriptVitePreloadDependencies.test.ts @@ -83,4 +83,19 @@ describe("Vite preload dependency recovery", () => { .map(({ specifier }) => specifier), ).toEqual(["./original.js"]); }); + + it("keeps table slots from a spread onward unknown", () => { + const analysis = analyzeJavaScriptStaticSource(` + const __vite__mapDeps = (indexes, map = __vite__mapDeps, dependencies = + (map.f || (map.f = ["./first.js", ...["./middle-a.js", "./middle-b.js"], "./last.js"]))) => + indexes.map((index) => dependencies[index]); + __vite__mapDeps([0, 2]); + `); + + expect( + analysis.references + .filter(({ kind }) => kind === "dynamic-import") + .map(({ specifier }) => specifier), + ).toEqual(["./first.js", null]); + }); });