Files
5chan/scripts/write-coverage-badge.mjs
T

52 lines
1.6 KiB
JavaScript

import fs from "fs";
import path from "path";
const CWD = process.cwd();
const COVERAGE_SUMMARY_PATHS = [
path.join(CWD, "coverage", "coverage-summary.json"),
path.join(CWD, "src", "coverage", "coverage-summary.json"),
];
const BADGE_OUTPUT_PATH = path.join(CWD, "badges", "coverage.json");
const coverageSummaryPath = COVERAGE_SUMMARY_PATHS.find((candidate) => fs.existsSync(candidate));
if (!coverageSummaryPath) {
const checkedPaths = COVERAGE_SUMMARY_PATHS.map((candidate) => `"${candidate}"`).join(", ");
console.error(`[coverage-badge] Missing coverage summary. Checked: ${checkedPaths}.`);
process.exit(1);
}
const summary = JSON.parse(fs.readFileSync(coverageSummaryPath, "utf8"));
const lineCoveragePct = summary?.total?.lines?.pct;
if (typeof lineCoveragePct !== "number") {
console.error(`[coverage-badge] Missing total.lines.pct in "${coverageSummaryPath}".`);
process.exit(1);
}
const roundedPct = Number(lineCoveragePct.toFixed(1));
const color =
lineCoveragePct >= 95
? "brightgreen"
: lineCoveragePct >= 90
? "green"
: lineCoveragePct >= 80
? "yellowgreen"
: lineCoveragePct >= 70
? "yellow"
: lineCoveragePct >= 60
? "orange"
: "red";
const badge = {
schemaVersion: 1,
label: "coverage",
message: `${roundedPct}%`,
color,
};
fs.mkdirSync(path.dirname(BADGE_OUTPUT_PATH), { recursive: true });
fs.writeFileSync(BADGE_OUTPUT_PATH, `${JSON.stringify(badge, null, 2)}\n`);
console.log(
`[coverage-badge] Wrote "${BADGE_OUTPUT_PATH}" from "${coverageSummaryPath}" (${roundedPct}%).`,
);