import { mkdir, readFile, writeFile } from "node:fs/promises"; import path from "node:path"; import type { BenchmarkPairInput, BuildResult, RuntimeResult } from "./benchmark-pair-lib.mts"; import { compareBenchmarkPair } from "./benchmark-pair-lib.mts"; const values = new Map(); for (let index = 2; index < process.argv.length; index += 2) { const flag = process.argv[index]; const value = process.argv[index + 1]; if (!flag?.startsWith("--") || !value) throw new Error(`Invalid argument at ${String(flag)}`); values.set(flag, [...(values.get(flag) ?? []), value]); } const requireMany = (flag: string) => { const result = values.get(flag) ?? []; if (result.length === 0) throw new Error(`${flag} is required`); return result; }; const requireOne = (flag: string) => { const result = requireMany(flag); if (result.length !== 1) throw new Error(`${flag} must be provided exactly once`); return result[0] as string; }; const readJson = async (file: string) => JSON.parse(await readFile(path.resolve(file), "utf8")) as T; const input: BenchmarkPairInput = { baselineWarmup: await readJson(requireOne("--baseline-warmup")), candidateWarmup: await readJson(requireOne("--candidate-warmup")), baselineBuilds: await Promise.all(requireMany("--baseline-build").map(readJson)), candidateBuilds: await Promise.all(requireMany("--candidate-build").map(readJson)), baselineRuntime: await readJson(requireOne("--baseline-runtime")), candidateRuntime: await readJson(requireOne("--candidate-runtime")), }; const result = compareBenchmarkPair(input); const outputPath = path.resolve(requireOne("--output")); await mkdir(path.dirname(outputPath), { recursive: true }); await writeFile(outputPath, `${JSON.stringify(result, null, 2)}\n`); console.log(JSON.stringify({ outputPath, ...result }, null, 2)); if (!result.claimEligible) process.exitCode = 1;