// Converts coverage/lcov.info (Bun) to HTML and Cobertura. Run: bun scripts/coverage-reports.mjs
// shortcut: line coverage only, Bun's lcov has no usable branch/function data; revisit if Bun adds it.
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
import libCoverage from 'istanbul-lib-coverage';
import libReport from 'istanbul-lib-report';
import reports from 'istanbul-reports';
const map = libCoverage.createCoverageMap({});
const loc = (line) => ({ start: { line, column: 0 }, end: { line, column: 1 } });
for (const record of readFileSync('coverage/lcov.info', 'utf8').split('end_of_record')) {
const file = /^SF:(.+)$/m.exec(record)?.[1];
if (!file) continue;
const statementMap = {};
const s = {};
for (const [, line, hits] of record.matchAll(/^DA:(\d+),(\d+)/gm)) {
statementMap[line] = loc(+line);
s[line] = +hits;
}
map.addFileCoverage({
path: resolve(file),
statementMap,
s,
fnMap: {},
f: {},
branchMap: {},
b: {},
});
}
const context = libReport.createContext({ dir: 'coverage', coverageMap: map });
for (const name of ['html', 'cobertura']) reports.create(name).execute(context);