Migrate CLI E2E tests to Node.js 26

Run the CLI subprocess suites and benchmark tools as native TypeScript with
node:test, and move them under test/e2e-cli.

Update CI and Compose runners, run local smoke tests on Linux, macOS, and
Windows, and collect source-mapped CLI coverage with c8.
This commit is contained in:
vorotamoroz committed 2026-10-31 06:01:30 +00:00
1 parent a0987016bb
commit 2433d117c2
91 files changed
+2219 -1615

No files matched your search

+59
View File
@@ -0,0 +1,59 @@
import { existsSync } from "node:fs";
import { readFile } from "node:fs/promises";
import { fileURLToPath } from "node:url";
import { join } from "node:path";
import { CLI_DIR } from "./helpers/paths.ts";
import { spawnProcess } from "./helpers/process.ts";
type Task = { test?: string[]; filter?: string; script?: string; tasks?: string[]; command?: string; args?: string[] };
const taskDirectory = import.meta.dirname;
export async function runTask(name: string, extraArgs: string[] = []): Promise<number> {
if (Number(process.versions.node.split(".")[0]) < 26) throw new Error("CLI E2E tests require Node.js 26 or newer");
const tasks = JSON.parse(await readFile(new URL("./tasks.json", import.meta.url), "utf8")) as Record<string, Task>;
const task = tasks[name];
if (!task) throw new Error(`Unknown CLI task '${name}'. Available tasks: ${Object.keys(tasks).join(", ")}`);
if (task.tasks) {
for (const child of task.tasks) {
const code = await runTask(child, extraArgs);
if (code !== 0) return code;
}
return 0;
}
const envFile = join(CLI_DIR, ".test.env");
const envArgs = existsSync(envFile) ? [`--env-file=${envFile}`] : [];
let command = process.execPath;
let args: string[];
if (task.test) {
args = [
...envArgs,
"--test",
"--test-concurrency=1",
...(task.filter ? [`--test-name-pattern=${task.filter}`] : []),
...extraArgs,
...task.test.map((file) => fileURLToPath(new URL(file, import.meta.url))),
];
} else if (task.script) {
args = [...envArgs, fileURLToPath(new URL(task.script, import.meta.url)), ...extraArgs];
} else if (task.command) {
command = task.command;
args = [...(task.args ?? []), ...extraArgs];
} else throw new Error(`CLI task '${name}' has no executable entry point`);
const child = spawnProcess(command, {
args,
cwd: taskDirectory,
stdin: "inherit",
stdout: "inherit",
stderr: "inherit",
});
return (await child.status).code;
}
if (import.meta.main) {
try {
process.exitCode = await runTask(process.argv[2] ?? "test", process.argv.slice(3));
} catch (error) {
console.error(error);
process.exitCode = 1;
}
}