UNPKG

bare-cov

Version:

Generate coverage reports using Bare and Node.js

67 lines (53 loc) 1.93 kB
'use strict' const { isAbsolute } = require('path') const { fileURLToPath } = require('url') const v8ToIstanbul = require('bare-v8-to-istanbul') const TestExclude = require('./test-exclude') const summarize = require('./summarize') const report = require('./report') const merge = require('./merge') class Transformer { constructor(opts = {}) { this.includeRelative = opts.includeRelative ?? false this.exclude = new TestExclude({ cwd: opts.cwd }) this.includedUrlCache = new Map() } normalizeUrl(v8ReportResult) { if (/^node:/.test(v8ReportResult.url)) { v8ReportResult.url = `${v8ReportResult.url.replace(/^node:/, '')}.js` } if (/^file:\/\//.test(v8ReportResult.url)) { v8ReportResult.url = fileURLToPath(v8ReportResult.url) } return v8ReportResult } isResultUrlIncluded(url) { const cacheResult = this.includedUrlCache.get(url) if (cacheResult !== undefined) return cacheResult const result = (this.includeRelative || isAbsolute(url)) && this.exclude.shouldInstrument(url) this.includedUrlCache.set(url, result) return result } async transformToCoverageMap(rawV8Report) { const v8Report = { result: rawV8Report.result .map((v8ReportResult) => this.normalizeUrl(v8ReportResult)) .filter((v8ReportResult) => this.isResultUrlIncluded(v8ReportResult.url)) } const coverages = {} for (const v8ReportResult of v8Report.result) { const converter = v8ToIstanbul(v8ReportResult.url) await converter.load() converter.applyCoverage(v8ReportResult.functions) const converted = converter.toIstanbul() for (const [path, coverage] of Object.entries(converted)) { coverages[path] = coverages[path] ? merge(coverages[path], coverage) : coverage } } return coverages } report(coverage) { report(summarize(coverage)) } } module.exports = Transformer