import test from "node:test"; import assert from "node:assert/strict"; import path from "node:path"; import { existsSync, mkdtempSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { getBrokerLaunchSpec, getBrokerSpawnOptions, getTsxCliPath, getWindowsHiddenLauncherScript, getWindowsBrokerCommandLine, getWindowsHiddenLauncherPath, } from "./spawn.js"; test("getTsxCliPath points at local tsx cli", () => { const cliPath = getTsxCliPath("C:/repo"); assert.equal(cliPath, path.join("C:/repo", "node_modules", "tsx", "dist", "cli.mjs")); }); test("getWindowsHiddenLauncherPath points at the broker launcher script", () => { const launcherPath = getWindowsHiddenLauncherPath("C:/tmp/intercom"); assert.equal(launcherPath, path.join("C:/tmp/intercom", "broker-launch.vbs")); }); test("getWindowsBrokerCommandLine wraps node, tsx cli, and broker path", () => { const commandLine = getWindowsBrokerCommandLine( "C:/repo/broker.ts", "C:/repo", "C:/Program Files/nodejs/node.exe", ); assert.equal( commandLine, `"C:/Program Files/nodejs/node.exe" "${path.join("C:/repo", "node_modules", "tsx", "dist", "cli.mjs")}" "C:/repo/broker.ts"`, ); }); test("getWindowsHiddenLauncherScript runs the broker command without showing a console", () => { const script = getWindowsHiddenLauncherScript('"C:/Program Files/nodejs/node.exe" "C:/repo/node_modules/tsx/dist/cli.mjs" "C:/repo/broker.ts"'); assert.match(script, /WshShell\.Run/); assert.match(script, /, 0, False/); }); test("getBrokerLaunchSpec uses wscript launcher on Windows without writing files", () => { const intercomDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-")); try { const spec = getBrokerLaunchSpec( "C:/repo/broker.ts", "npx", ["--no-install", "tsx"], "C:/repo", "win32", intercomDir, "C:/Program Files/nodejs/node.exe", ); assert.equal(spec.command, "wscript.exe"); assert.deepEqual(spec.args, [path.join(intercomDir, "broker-launch.vbs")]); assert.equal(spec.kind, "windows-launcher"); assert.equal(spec.launcherCommandLine, `"C:/Program Files/nodejs/node.exe" "${path.join("C:/repo", "node_modules", "tsx", "dist", "cli.mjs")}" "C:/repo/broker.ts"`); assert.equal(existsSync(path.join(intercomDir, "broker-launch.vbs")), false); } finally { rmSync(intercomDir, { recursive: true, force: true }); } }); test("getBrokerLaunchSpec uses custom broker command on Windows", () => { const intercomDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-")); try { const spec = getBrokerLaunchSpec("C:/repo/broker.ts", "bun", ["--smol"], "C:/repo", "win32", intercomDir, "C:/Program Files/nodejs/node.exe"); assert.equal(spec.command, "wscript.exe"); assert.equal(spec.kind, "windows-launcher"); assert.equal(spec.launcherCommandLine, `"bun" "--smol" "C:/repo/broker.ts"`); } finally { rmSync(intercomDir, { recursive: true, force: true }); } }); test("getBrokerLaunchSpec uses npx + tsx on non-Windows", () => { const spec = getBrokerLaunchSpec("C:/repo/broker.ts", "npx", ["--no-install", "tsx"], "C:/repo", "linux", "/tmp/intercom", "/usr/bin/node"); assert.equal(spec.command, "npx"); assert.deepEqual(spec.args, [ "--no-install", "tsx", "C:/repo/broker.ts", ]); assert.equal(spec.kind, "direct"); }); test("getBrokerLaunchSpec uses custom broker command on non-Windows", () => { const spec = getBrokerLaunchSpec("/repo/broker.ts", "bun", [], "/repo", "linux", "/tmp/intercom", "/usr/bin/node"); assert.equal(spec.command, "bun"); assert.deepEqual(spec.args, ["/repo/broker.ts"]); assert.equal(spec.kind, "direct"); }); test("getBrokerSpawnOptions hides the broker console window on Windows", () => { const options = getBrokerSpawnOptions("C:/repo"); assert.equal(options.windowsHide, true); assert.equal(options.detached, true); assert.equal(options.stdio, "ignore"); assert.equal(options.cwd, "C:/repo"); }); test("getBrokerSpawnOptions keeps portable defaults on non-Windows platforms", () => { const options = getBrokerSpawnOptions("/repo"); assert.equal(options.windowsHide, true); assert.equal(options.detached, true); assert.equal(options.stdio, "ignore"); assert.equal(options.cwd, "/repo"); });