diff --git a/packages/desktop/src/daemon/node-entrypoint-runner.test.ts b/packages/desktop/src/daemon/node-entrypoint-runner.test.ts index 74ffd1ee9..9e505c939 100644 --- a/packages/desktop/src/daemon/node-entrypoint-runner.test.ts +++ b/packages/desktop/src/daemon/node-entrypoint-runner.test.ts @@ -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 }); + } }); }); diff --git a/packages/desktop/src/daemon/node-entrypoint-runner.ts b/packages/desktop/src/daemon/node-entrypoint-runner.ts index ed8930d7d..dae45077d 100644 --- a/packages/desktop/src/daemon/node-entrypoint-runner.ts +++ b/packages/desktop/src/daemon/node-entrypoint-runner.ts @@ -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 { const [argvMode, entryPath, ...args] = process.argv.slice(2); if (argvMode !== "bare" && argvMode !== "node-script") { @@ -18,7 +13,6 @@ export async function main(): Promise { argvMode === "bare" ? [process.argv[0] ?? "node", ...args] : [process.argv[0] ?? "node", entryPath, ...args]; - sanitizeNodeEntrypointEnv(); await import(pathToFileURL(entryPath).href); }