Something went wrong. Try again.
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071import { mkdirSync, writeFileSync } from "node:fs";import { join, resolve } from "node:path";import { pinnedChromePath, realChromePathDeps } from "./chromePath";import { parseExpectation, type SelfCheckResult, type SelfCheckScript } from "./selfCheck";import { SELFCHECK_USAGE, parseSelfCheckArgs } from "./selfCheckArgs";import { loadScripts, runRealSelfCheck, type RealSelfCheckOptions } from "./selfCheckRun";
export interface SelfCheckMainDeps { cwd: string; out(text: string): void; err(text: string): void; loadScripts(root: string): SelfCheckScript[]; chromePath(root: string): string; runCheck(options: RealSelfCheckOptions): Promise<SelfCheckResult>; makeDir(path: string): void; writeFile(path: string, content: string): void; resolve(path: string): string;}
export const realSelfCheckMainDeps = (): SelfCheckMainDeps => ({ cwd: process.cwd(), out: (s) => console.log(s), err: (s) => console.error(s), loadScripts: (root) => loadScripts(root), chromePath: (root) => pinnedChromePath(root, realChromePathDeps(root)), runCheck: runRealSelfCheck, makeDir: (p) => void mkdirSync(p, { recursive: true }), writeFile: (p, c) => writeFileSync(p, c), resolve: (p) => resolve(p),});
const describeExpectation = (script: SelfCheckScript): string => { const e = parseExpectation(script.text); if ("error" in e) return `MISTAKE: ${e.error}`; if (e.kind === "pass") return "pass"; if (e.kind === "fail") return `fail ${e.reason} ${e.verb}${e.file ? ` in ${e.file}` : ""}`; return `refused "${e.fragment}"`;};
/** The self-check command line. Exit codes: 0 every script behaved as expected, 1 one did not, 2 usage, 3 the check could not run (never a skip). */export async function selfCheckMain(argv: string[], deps: SelfCheckMainDeps): Promise<number> { const args = parseSelfCheckArgs(argv); if (args.kind === "help") { deps.out(args.text); return 0; } if (args.kind === "error") { deps.err(args.message || SELFCHECK_USAGE); return 2; } const root = deps.cwd; if (args.kind === "list") { for (const s of deps.loadScripts(root)) deps.out(`${s.name.padEnd(28)} ${describeExpectation(s)}`); return 0; } let chrome: string; try { chrome = deps.chromePath(root); } catch (e) { deps.err(`SELF-CHECK COULD NOT RUN: ${e instanceof Error ? e.message : String(e)}`); return 3; } const result = await deps.runCheck({ root, chrome, repeat: args.repeat, parallel: args.parallel, ...(args.sabotage !== undefined ? { sabotage: args.sabotage } : {}), ...(args.only !== undefined ? { only: args.only } : {}) }); const outDir = deps.resolve(args.outDir); deps.makeDir(outDir); deps.writeFile(join(outDir, "report.txt"), result.report + "\n"); deps.writeFile(join(outDir, "summary.json"), JSON.stringify({ exitCode: result.exitCode, sabotage: args.sabotage ?? null, scripts: result.scripts }, null, 2) + "\n"); deps.out(result.report); return result.exitCode;}