()
| 399 | } |
| 400 | |
| 401 | async function main() { |
| 402 | const muxRoot = await fs.mkdtemp(path.join(os.tmpdir(), "mux-web-repro-")); |
| 403 | const demoProject = prepareDemoProject(muxRoot); |
| 404 | const backendPort = await getFreePort(); |
| 405 | let vitePort = await getFreePort(); |
| 406 | while (vitePort === backendPort) vitePort = await getFreePort(); |
| 407 | const child = spawn("make", ["dev-server"], { |
| 408 | cwd: process.cwd(), |
| 409 | stdio: ["ignore", "ignore", "ignore"], |
| 410 | env: { |
| 411 | ...process.env, |
| 412 | MUX_ROOT: muxRoot, |
| 413 | MUX_MOCK_AI: "1", |
| 414 | BACKEND_PORT: String(backendPort), |
| 415 | VITE_PORT: String(vitePort), |
| 416 | MUX_ENABLE_TUTORIALS_IN_SANDBOX: "0", |
| 417 | VITE_ALLOWED_HOSTS: "all", |
| 418 | NODE_ENV: "development", |
| 419 | }, |
| 420 | }); |
| 421 | const terminateServer = () => { |
| 422 | if (child.exitCode == null && !child.killed) { |
| 423 | child.kill("SIGTERM"); |
| 424 | } |
| 425 | }; |
| 426 | for (const signal of ["SIGINT", "SIGTERM"] as const) { |
| 427 | process.on(signal, terminateServer); |
| 428 | } |
| 429 | |
| 430 | try { |
| 431 | await waitForHttpReady(`http://127.0.0.1:${vitePort}`); |
| 432 | const browser = await chromium.launch({ headless: true }); |
| 433 | try { |
| 434 | const page = await browser.newPage({ viewport: { width: 1600, height: 900 } }); |
| 435 | await page.goto(`http://127.0.0.1:${vitePort}`, { waitUntil: "domcontentloaded" }); |
| 436 | await page.evaluate(() => { |
| 437 | localStorage.setItem( |
| 438 | "tutorialState", |
| 439 | JSON.stringify({ |
| 440 | disabled: false, |
| 441 | completed: { settings: true, creation: true, workspace: true }, |
| 442 | }) |
| 443 | ); |
| 444 | }); |
| 445 | await page.reload({ waitUntil: "domcontentloaded" }); |
| 446 | |
| 447 | await waitForProjectPage(page); |
| 448 | const trunkBranch = readTrunkBranch(demoProject.projectPath); |
| 449 | const workspaceA = await createWorkspaceViaOrpc({ |
| 450 | page, |
| 451 | projectPath: demoProject.projectPath, |
| 452 | branchName: `switch-tear-a-${Date.now()}`, |
| 453 | trunkBranch, |
| 454 | }); |
| 455 | const workspaceB = await createWorkspaceViaOrpc({ |
| 456 | page, |
| 457 | projectPath: demoProject.projectPath, |
| 458 | branchName: `switch-tear-b-${Date.now()}`, |
no test coverage detected