()
| 77 | } |
| 78 | |
| 79 | const startPlainViteDev = async (): Promise<ViteDev> => { |
| 80 | const dataDir = mkdtempSync(join(tmpdir(), "executor-local-vite-e2e-")); |
| 81 | const port = await freePort(); |
| 82 | const origin = `http://127.0.0.1:${port}`; |
| 83 | let logs = ""; |
| 84 | const child = spawn( |
| 85 | "bunx", |
| 86 | ["--bun", "vite", "dev", "--host", "127.0.0.1", "--port", String(port), "--strictPort"], |
| 87 | { |
| 88 | cwd: localAppDir, |
| 89 | env: { ...process.env, EXECUTOR_DATA_DIR: dataDir, PORT: String(port) }, |
| 90 | stdio: ["ignore", "pipe", "pipe"], |
| 91 | detached: true, |
| 92 | }, |
| 93 | ); |
| 94 | child.stdout?.on("data", (chunk: Buffer) => { |
| 95 | logs += chunk.toString(); |
| 96 | }); |
| 97 | child.stderr?.on("data", (chunk: Buffer) => { |
| 98 | logs += chunk.toString(); |
| 99 | }); |
| 100 | |
| 101 | try { |
| 102 | await waitForHttp(origin, { timeoutMs: 90_000 }); |
| 103 | const token = await readToken(dataDir); |
| 104 | return { |
| 105 | origin, |
| 106 | token, |
| 107 | stop: async () => { |
| 108 | await stopTree(child); |
| 109 | rmSync(dataDir, { recursive: true, force: true }); |
| 110 | }, |
| 111 | }; |
| 112 | } catch (error) { |
| 113 | await stopTree(child); |
| 114 | rmSync(dataDir, { recursive: true, force: true }); |
| 115 | throw new Error(`plain Vite dev failed to boot:\n${logs}\n${String(error)}`); |
| 116 | } |
| 117 | }; |
| 118 | |
| 119 | scenario( |
| 120 | "Local Vite dev · local-only API routes match production routing", |
no test coverage detected