Files
rea/src/domain/javascript/electronStaticAnalysisComputedPreferences.test.ts
T
morluto bdf865252c fix(electron): retain computed literal preference keys
Use the parsed semantic property key instead of treating all bracketed keys as dynamic. Preserve empty and numeric literal keys; unresolved computed expressions remain unknown.

Validation: exact named preference and dynamic coverage regressions pass. Fixes #2521.

Based on #3105.

Co-authored-by: ShuaixinHuang <1836656514@qq.com>
2026-10-14 13:58:13 +08:00

56 lines
1.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { analyzeJavaScriptStaticSource } from "./javascriptStaticAnalysis.js";
describe("computed Electron web preference keys", () => {
it("retains exact string, numeric, and empty literal keys", () => {
const analysis = analyzeJavaScriptStaticSource(`
const { BrowserWindow } = require("electron");
new BrowserWindow({ webPreferences: {
["sandbox"]: true,
["preload"]: "./preload.js",
[1]: "numeric",
[""]: false
} });
`);
expect(analysis.parse_status).toBe("complete");
expect(analysis.electron.browser_windows[0]).toMatchObject({
preload_path: "./preload.js",
web_preferences: [
{ name: "", value: { status: "literal", value: false } },
{ name: "1", value: { status: "literal", value: "numeric" } },
{
name: "preload",
value: { status: "literal", value: "./preload.js" },
},
{ name: "sandbox", value: { status: "literal", value: true } },
],
});
});
it("keeps genuinely dynamic computed keys unknown", () => {
const analysis = analyzeJavaScriptStaticSource(`
const { BrowserWindow } = require("electron");
new BrowserWindow({ webPreferences: {
[getKey()]: true,
["sandbox"]: true
} });
`);
expect(analysis.parse_status).toBe("partial");
expect(analysis.electron.browser_windows[0]?.web_preferences).toEqual(
expect.arrayContaining([
expect.objectContaining({
name: expect.stringMatching(/^\[dynamic@/u),
value: expect.objectContaining({ status: "dynamic" }),
}),
{
name: "sandbox",
value: { status: "literal", value: true, expression: null },
},
]),
);
});
});