// 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);