import path from "node:path"; // Let the restart-aware supervisor reap Paperclip and finish its log streams. // Its stop path allows 30 seconds for SIGTERM and 5 seconds for SIGKILL. export const runnerE2EWebServerGracefulShutdown = { signal: "SIGTERM" as const, timeout: 45_000, }; function shellQuote(value: string) { return `'${value.replaceAll("'", `'\\''`)}'`; } export function runnerE2EWebServerCommand(repositoryRoot: string) { const tsx = path.join(repositoryRoot, "cli/node_modules/tsx/dist/cli.mjs"); const server = path.join(repositoryRoot, "tests/runner-e2e/server.ts"); return `node ${shellQuote(tsx)} ${shellQuote(server)}`; } // Keep the supervisor's child PID equal to the actual TypeScript process. export function runnerE2ETypeScriptProcessArgs(repositoryRoot: string, entry: string, args: string[] = []) { return ["--import", path.join(repositoryRoot, "cli/node_modules/tsx/dist/loader.mjs"), entry, ...args]; } // pnpm's generated playwright bin shim adds NODE_PATH, even when the caller // rejected ambient injection. The installed lane invokes the public JS bin // with the current Node directly, keeping the WebServer environment closed. export function runnerE2EPlaywrightInvocation(repositoryRoot: string, args: string[], installed: boolean) { return installed ? { command: process.execPath, args: [path.join(repositoryRoot, "node_modules/@playwright/test/cli.js"), ...args] } : { command: "pnpm", args: ["exec", "playwright", ...args] }; }