Fix packaged node entrypoint env preservation

This commit is contained in:
Mohamed Boudra
2026-04-26 18:34:29 +07:00
parent f79af3ffbf
commit d672bc19de
2 changed files with 59 additions and 17 deletions
@@ -1,18 +1,66 @@
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import path from "node:path";
import { describe, expect, it } from "vitest";
import { sanitizeNodeEntrypointEnv } from "./node-entrypoint-runner";
import { main } from "./node-entrypoint-runner";
declare global {
// eslint-disable-next-line no-var
var __PASEO_NODE_ENTRYPOINT_RUNNER_FIXTURE__:
| {
argv: string[];
electronRunAsNode: string | undefined;
electronNoAttachConsole: string | undefined;
}
| undefined;
}
describe("node-entrypoint-runner", () => {
it("removes Electron node-mode env before loading the target entrypoint", () => {
const env = {
ELECTRON_RUN_AS_NODE: "1",
ELECTRON_NO_ATTACH_CONSOLE: "1",
PATH: "/usr/bin",
};
it("preserves Electron node-mode env before loading the target entrypoint", async () => {
const originalArgv = process.argv;
const originalRunAsNode = process.env.ELECTRON_RUN_AS_NODE;
const originalNoAttachConsole = process.env.ELECTRON_NO_ATTACH_CONSOLE;
const originalFixture = globalThis.__PASEO_NODE_ENTRYPOINT_RUNNER_FIXTURE__;
const fixtureDir = mkdtempSync(path.join(tmpdir(), "paseo-node-entrypoint-runner-"));
const fixturePath = path.join(fixtureDir, "fixture.mjs");
writeFileSync(
fixturePath,
`
globalThis.__PASEO_NODE_ENTRYPOINT_RUNNER_FIXTURE__ = {
argv: process.argv,
electronRunAsNode: process.env.ELECTRON_RUN_AS_NODE,
electronNoAttachConsole: process.env.ELECTRON_NO_ATTACH_CONSOLE,
};
`,
);
sanitizeNodeEntrypointEnv(env);
process.argv = ["Paseo", "runner", "node-script", fixturePath, "daemon", "start"];
process.env.ELECTRON_RUN_AS_NODE = "1";
process.env.ELECTRON_NO_ATTACH_CONSOLE = "1";
delete globalThis.__PASEO_NODE_ENTRYPOINT_RUNNER_FIXTURE__;
expect(env).toEqual({
PATH: "/usr/bin",
});
try {
await main();
expect(globalThis.__PASEO_NODE_ENTRYPOINT_RUNNER_FIXTURE__).toEqual({
argv: ["Paseo", fixturePath, "daemon", "start"],
electronRunAsNode: "1",
electronNoAttachConsole: "1",
});
} finally {
process.argv = originalArgv;
if (originalRunAsNode === undefined) {
delete process.env.ELECTRON_RUN_AS_NODE;
} else {
process.env.ELECTRON_RUN_AS_NODE = originalRunAsNode;
}
if (originalNoAttachConsole === undefined) {
delete process.env.ELECTRON_NO_ATTACH_CONSOLE;
} else {
process.env.ELECTRON_NO_ATTACH_CONSOLE = originalNoAttachConsole;
}
globalThis.__PASEO_NODE_ENTRYPOINT_RUNNER_FIXTURE__ = originalFixture;
rmSync(fixtureDir, { recursive: true, force: true });
}
});
});
@@ -1,10 +1,5 @@
import { pathToFileURL } from "node:url";
export function sanitizeNodeEntrypointEnv(env: NodeJS.ProcessEnv = process.env): void {
delete env.ELECTRON_RUN_AS_NODE;
delete env.ELECTRON_NO_ATTACH_CONSOLE;
}
export async function main(): Promise<void> {
const [argvMode, entryPath, ...args] = process.argv.slice(2);
if (argvMode !== "bare" && argvMode !== "node-script") {
@@ -18,7 +13,6 @@ export async function main(): Promise<void> {
argvMode === "bare"
? [process.argv[0] ?? "node", ...args]
: [process.argv[0] ?? "node", entryPath, ...args];
sanitizeNodeEntrypointEnv();
await import(pathToFileURL(entryPath).href);
}