56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
import { expect, it } from "vitest";
|
|||
|
|
|
||
|
|
import { analyzeJavaScriptStaticSource } from "./javascriptStaticAnalysis.js";
|
||
|
|
|
||
|
|
it.each([
|
||
|
|
"handlers[key]()",
|
||
|
|
"handlers[key].call(null)",
|
||
|
|
"handlers[key].apply(null,[])",
|
||
|
|
])("selects a local table callee before its own opaque effects: %s", (call) => {
|
||
|
|
const result = analyzeJavaScriptStaticSource(
|
||
|
|
`const handlers={first(){},second(){}};${call};`,
|
||
|
|
);
|
||
|
|
expect(result.references).toEqual([]);
|
||
|
|
expect(result.parse_status).toBe("complete");
|
||
|
|
});
|
||
|
|
|
||
|
|
it.each([
|
||
|
|
'handlers[key]=module.require;handlers[key].call(module,"./shared.cjs");',
|
||
|
|
'handlers.first=module.require;handlers.first.call(module,"./shared.cjs");',
|
||
|
|
])("retains earlier uncertainty or a real delegate: %s", (use) => {
|
||
|
|
const result = analyzeJavaScriptStaticSource(
|
||
|
|
`const handlers={first(){},second(){}};${use}`,
|
||
|
|
);
|
||
|
|
expect(result.references).toContainEqual(
|
||
|
|
expect.objectContaining({ kind: "require", specifier: null }),
|
||
|
|
);
|
||
|
|
expect(result.parse_status).toBe("partial");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("retains complete coverage for an inline Electron factory export", () => {
|
||
|
|
const result = analyzeJavaScriptStaticSource(`(() => {
|
||
|
|
const modules={
|
||
|
|
5(module,exports){
|
||
|
|
exports.self=exports;
|
||
|
|
exports.events=require("electron").ipcMain;
|
||
|
|
},
|
||
|
|
9(module,exports,load){
|
||
|
|
const helper=load(5);
|
||
|
|
helper.self.events.addListener("test:copy",()=>{});
|
||
|
|
}
|
||
|
|
};
|
||
|
|
function load(id){
|
||
|
|
const m={exports:{}};
|
||
|
|
modules[id].call(m.exports,m,m.exports,load);
|
||
|
|
return m.exports;
|
||
|
|
}
|
||
|
|
load(9);
|
||
|
|
})();`);
|
||
|
|
expect(result.parse_status).toBe("complete");
|
||
|
|
expect(result.references.every(({ specifier }) => specifier !== null)).toBe(
|
||
|
|
true,
|
||
|
|
);
|
||
|
|
expect(result.electron.ipc).toContainEqual(
|
||
|
|
expect.objectContaining({ channel: "test:copy", side: "main" }),
|
||
|
|
);
|
||
|
|
});
|