bare-cov
Version:
Generate coverage reports using Bare and Node.js
46 lines (37 loc) • 1.53 kB
JavaScript
const { isBare } = require('which-runtime')
const { Session } = require('inspector')
const fs = require('fs')
const path = require('path')
const Transformer = require('./lib/transformer')
const process = require('process')
module.exports = async function setupCoverage(opts = {}) {
const cwd = process.cwd()
const dir = path.resolve(opts.dir ?? 'coverage')
const session = new Session()
session.connect()
const sessionPost = (...args) =>
new Promise((resolve, reject) =>
session.post(...args, (err, result) => (err ? reject(err) : resolve(result)))
)
await sessionPost('Profiler.enable')
await sessionPost('Profiler.startPreciseCoverage', {
callCount: true,
detailed: true
})
process.once('beforeExit', async () => {
const v8Report = await sessionPost('Profiler.takePreciseCoverage')
isBare ? session.destroy() : session.disconnect()
if (opts.skipRawDump !== true) {
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })
fs.writeFileSync(path.join(dir, 'v8-coverage.json'), JSON.stringify(v8Report))
}
const reporters = Array.isArray(opts.reporters) ? opts.reporters : ['text', 'json']
const transformer = new Transformer({ ...opts, cwd })
const coverageMap = await transformer.transformToCoverageMap(v8Report)
if (reporters.includes('json')) {
fs.writeFileSync(path.join(dir, 'coverage-final.json'), JSON.stringify(coverageMap))
}
if (reporters.includes('text')) transformer.report(coverageMap)
})
}