import { fileURLToPath } from 'node:url'; import c from 'picocolors'; import { execa } from 'execa'; import { E as EXIT_CODE_RESTART } from './vendor/constants.i1PoEnhr.js'; const ENTRY = new URL("./cli.js", import.meta.url); const NODE_ARGS = [ "--trace-deprecation", "--experimental-wasm-threads", "--wasm-atomics-on-non-shared-memory" ]; const SegfaultErrors = [ { trigger: "Check failed: result.second.", url: "https://github.com/nodejs/node/issues/43617" }, { trigger: "FATAL ERROR: v8::FromJust Maybe value is Nothing.", url: "https://github.com/vitest-dev/vitest/issues/1191" }, { trigger: "FATAL ERROR: v8::ToLocalChecked Empty MaybeLocal.", url: "https://github.com/nodejs/node/issues/42407" } ]; main(); async function main() { var _a; let retries = 0; const args = process.argv.slice(2); if (process.env.VITEST_SEGFAULT_RETRY) { retries = +process.env.VITEST_SEGFAULT_RETRY; } else { for (let i = 0; i < args.length; i++) { if (args[i].startsWith("--segfault-retry=") || args[i].startsWith("--segfaultRetry=")) { retries = +args[i].split("=")[1]; break; } else if ((args[i] === "--segfault-retry" || args[i] === "--segfaultRetry") && ((_a = args[i + 1]) == null ? void 0 : _a.match(/^\d+$/))) { retries = +args[i + 1]; break; } } } if (retries <= 0) { await import('./cli.js'); return; } const nodeArgs = []; const vitestArgs = []; for (let i = 0; i < args.length; i++) { let matched = false; for (const nodeArg of NODE_ARGS) { if (args[i] === nodeArg || args[i].startsWith(`${nodeArg}=`)) { matched = true; nodeArgs.push(args[i]); break; } } if (!matched) vitestArgs.push(args[i]); } retries = Math.max(1, retries || 1); for (let i = 1; i <= retries; i++) { const result = await start(nodeArgs, vitestArgs); if (result === "restart") { i -= 1; continue; } if (i === 1 && retries === 1) { console.log(c.yellow(`It seems to be an upstream bug of Node.js. To improve the test stability, you could pass ${c.bold(c.green("--segfault-retry=3"))} or set env ${c.bold(c.green("VITEST_SEGFAULT_RETRY=3"))} to have Vitest auto retries on flaky segfaults. `)); } if (i !== retries) console.log(`${c.inverse(c.bold(c.magenta(" Retrying ")))} vitest ${args.join(" ")} ${c.gray(`(${i + 1} of ${retries})`)}`); } process.exit(1); } async function start(preArgs, postArgs) { var _a; const child = execa( "node", [ ...preArgs, fileURLToPath(ENTRY), ...postArgs ], { reject: false, stderr: "pipe", stdout: "inherit", stdin: "inherit", env: { ...process.env, VITEST_CLI_WRAPPER: "true" } } ); (_a = child.stderr) == null ? void 0 : _a.pipe(process.stderr); const { stderr = "" } = await child; if (child.exitCode === EXIT_CODE_RESTART) return "restart"; for (const error of SegfaultErrors) { if (stderr.includes(error.trigger)) { if (process.env.GITHUB_ACTIONS) console.log(`::warning:: Segmentfault Error Detected: ${error.trigger} Refer to ${error.url}`); const RED_BLOCK = c.inverse(c.red(" ")); console.log(` ${c.inverse(c.bold(c.red(" Segmentfault Error Detected ")))} ${RED_BLOCK} ${c.red(error.trigger)} ${RED_BLOCK} ${c.red(`Refer to ${error.url}`)} `); return "error"; } } process.exit(child.exitCode); }