fix(javascript): retain unbound CommonJS semantic imports

Collect unbound literal CommonJS dependencies at the semantic module-link owner, retain null binding names and source provenance, and avoid duplicate links for calls already represented by bindings or re-exports. Preserve distinct nested calls, shadowing exclusions, dynamic binding uncertainty, and existing static asset references.

Fixes #1793.
This commit is contained in:
Ysopwnable authored and GitHub committed 2026-10-11 19:16:32 +08:00
1 parent 40d9c7b836
commit 3a17882cc4
10 files changed
+388 -33

No files matched your search

@@ -112,28 +112,6 @@ describe("JavaScript semantic analysis: structure 1", () => {
},
);
it("preserves unshadowed require origins through aliases and assignments", () => {
const ir = analyzeJavaScriptSemantics(`
const { ipcMain: bus } = require("electron");
const forwarded = bus;
let assigned;
assigned = require("electron").ipcMain;
{ const require = localLoader; require("./local.js"); }
`);
for (const name of ["bus", "forwarded"])
expect(origin(topLevelBinding(ir, name))).toEqual({
specifier: "electron",
importedPath: ["ipcMain"],
});
expect(topLevelBinding(ir, "assigned").provenance).toMatchObject({
status: "ambiguous",
origins: [{ specifier: "electron", importedPath: ["ipcMain"] }],
});
expect(
ir.moduleLinks.filter(({ kind }) => kind === "require"),
).toHaveLength(1);
});
it("propagates literal, template, object, conditional, and destructured values", () => {
const ir = analyzeJavaScriptSemantics(`
const prefix = "rea";