85 lines
3.4 KiB
JavaScript
85 lines
3.4 KiB
JavaScript
#!/usr/bin/env node
|
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
import path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
import {
|
|
parseSmokeArgs,
|
|
printSmokeHelp,
|
|
runDevCloudWorkbenchMobileSmoke,
|
|
runDevCloudWorkbenchQuickPromptsFixtureSmoke,
|
|
runDevCloudWorkbenchSmoke
|
|
} from "./src/dev-cloud-workbench-smoke-lib.mjs";
|
|
import { ensureNotRepoReportsPath, tempReportPath } from "./src/report-paths.mjs";
|
|
|
|
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
|
|
export function decideSmokeReportWrite(args, report, options = {}) {
|
|
if (!args.reportPath || report.status === "usage") {
|
|
return { status: "not_requested", write: false };
|
|
}
|
|
const root = options.repoRoot ?? repoRoot;
|
|
const cwd = options.cwd ?? process.cwd();
|
|
const reportPath = ensureNotRepoReportsPath(root, path.resolve(cwd, args.reportPath), "--report");
|
|
const liveReportPath = tempReportPath("dev-cloud-workbench-live.json");
|
|
const displayPath = displayReportPath(reportPath, root);
|
|
if (report.status === "skip") {
|
|
return {
|
|
status: "blocked",
|
|
write: false,
|
|
reportPath,
|
|
summary: `Refusing to write ${displayPath}: ${report.mode ?? "smoke"} skipped and does not contain required browser evidence.`
|
|
};
|
|
}
|
|
if (reportPath === liveReportPath && report.mode !== "live") {
|
|
return {
|
|
status: "blocked",
|
|
write: false,
|
|
reportPath,
|
|
summary: `Refusing to overwrite ${displayPath} with ${report.mode ?? "non-live"} evidence; run --live for the live report or choose a mode-specific report path.`
|
|
};
|
|
}
|
|
return { status: "pass", write: true, reportPath };
|
|
}
|
|
|
|
export function smokeCliExitCode(report, reportWriteDecision = { status: "not_requested" }) {
|
|
if (reportWriteDecision.status === "blocked") return 2;
|
|
return report.status === "pass" || report.status === "usage" ? 0 : 2;
|
|
}
|
|
|
|
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
try {
|
|
const args = parseSmokeArgs(process.argv.slice(2));
|
|
const report = args.help
|
|
? printSmokeHelp()
|
|
: args.mobile
|
|
? await runDevCloudWorkbenchMobileSmoke()
|
|
: args.mode === "quick-prompts-fixture"
|
|
? await runDevCloudWorkbenchQuickPromptsFixtureSmoke()
|
|
: await runDevCloudWorkbenchSmoke(process.argv.slice(2));
|
|
const reportWrite = decideSmokeReportWrite(args, report);
|
|
if (reportWrite.write) {
|
|
await mkdir(path.dirname(reportWrite.reportPath), { recursive: true });
|
|
report.artifacts = { ...(report.artifacts ?? {}), reportPath: reportWrite.reportPath };
|
|
await writeFile(reportWrite.reportPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
|
|
} else if (reportWrite.status === "blocked") {
|
|
report.reportWrite = {
|
|
status: "blocked",
|
|
reportPath: reportWrite.reportPath,
|
|
summary: reportWrite.summary
|
|
};
|
|
process.stderr.write(`[dev-cloud-workbench-smoke] ${reportWrite.summary}\n`);
|
|
}
|
|
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
process.exitCode = smokeCliExitCode(report, reportWrite);
|
|
} catch (error) {
|
|
process.stderr.write(`[dev-cloud-workbench-smoke] ${error instanceof Error ? error.stack : String(error)}\n`);
|
|
process.exitCode = 1;
|
|
}
|
|
}
|
|
|
|
function displayReportPath(reportPath, root) {
|
|
const relative = path.relative(root, reportPath);
|
|
return relative && !relative.startsWith("..") && !path.isAbsolute(relative) ? relative : reportPath;
|
|
}
|