mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-11-01 22:08:18 +00:00
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:
1 parent
a0987016bb
commit
2433d117c2
91 files changed
+2219
-1615
No files matched your search
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user