Files
PaperClipAI/tests/runner-e2e/web-server-command.ts
T

33 lines
1.5 KiB
TypeScript

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] };
}