fix: resolve selected require call members

Fixes #6678
This commit is contained in:
morluto
2026-10-23 21:34:09 +08:00
parent e966b9f9a5
commit 9b598076e3
3 changed files with 74 additions and 5 deletions
@@ -77,3 +77,36 @@ it.each(cases)(
);
},
);
it.each(["call", "apply"] as const)(
"does not treat an owned local %s replacement as a loader invocation",
(method) => {
const args = method === "call" ? "null,'node:path'" : "null,['node:path']";
const analysis = analyzeJavaScriptStaticSource(
`${named}const load=make(import.meta.url);load.${method}=()=>({kind:'local'});load.${method}(${args});`,
);
expect(analysis.parse_error_count).toBe(0);
expect(
analysis.references.filter(({ kind }) => kind === "require"),
).toEqual([]);
},
);
it("keeps uncertainty for conditional call-member replacement", () => {
const analysis = analyzeJavaScriptStaticSource(
`${named}const load=make(import.meta.url);if(flag)load.call=()=>({kind:'local'});load.call(null,'node:path');`,
);
expect(analysis.parse_error_count).toBe(0);
expect(analysis.references.filter(({ kind }) => kind === "require")).toEqual([
expect.objectContaining({ kind: "require", specifier: null }),
]);
});
it("uses the restored call member after a local replacement", () => {
const source = `${named}const load=make(import.meta.url);load.call=()=>({kind:'local'});load.call=Function.prototype.call;load.call(null,'node:path');`;
const analysis = analyzeJavaScriptStaticSource(source);
expect(analysis.parse_error_count).toBe(0);
expect(analysis.references.filter(({ kind }) => kind === "require")).toEqual([
expect.objectContaining({ kind: "require", specifier: null }),
]);
});