UNPKG

2.53 kBJavaScriptView Raw
1const Exclude = require('test-exclude')
2const libCoverage = require('istanbul-lib-coverage')
3const libReport = require('istanbul-lib-report')
4const reports = require('istanbul-reports')
5const { readdirSync, readFileSync } = require('fs')
6const { resolve, isAbsolute } = require('path')
7const v8CoverageMerge = require('v8-coverage-merge')
8const v8toIstanbul = require('v8-to-istanbul')
9
10class Report {
11 constructor ({
12 exclude,
13 include,
14 reporter,
15 tempDirectory,
16 watermarks,
17 resolve,
18 omitRelative
19 }) {
20 this.reporter = reporter
21 this.tempDirectory = tempDirectory
22 this.watermarks = watermarks
23 this.resolve = resolve
24 this.exclude = Exclude({
25 exclude: exclude,
26 include: include
27 })
28 this.omitRelative = omitRelative
29 }
30 run () {
31 const map = this._getCoverageMapFromAllCoverageFiles()
32 var context = libReport.createContext({
33 dir: './coverage',
34 watermarks: this.watermarks
35 })
36
37 const tree = libReport.summarizers.pkg(map)
38
39 this.reporter.forEach(function (_reporter) {
40 tree.visit(reports.create(_reporter), context)
41 })
42 }
43 _getCoverageMapFromAllCoverageFiles () {
44 const map = libCoverage.createCoverageMap({})
45 const mergedResults = {}
46 this._loadReports().forEach((report) => {
47 report.result.forEach((result) => {
48 if (this.exclude.shouldInstrument(result.url) &&
49 (!this.omitRelative || isAbsolute(result.url))) {
50 if (mergedResults[result.url]) {
51 mergedResults[result.url] = v8CoverageMerge(
52 mergedResults[result.url],
53 result
54 )
55 } else {
56 mergedResults[result.url] = result
57 }
58 }
59 })
60 })
61
62 Object.keys(mergedResults).forEach((url) => {
63 try {
64 const result = mergedResults[url]
65 const path = resolve(this.resolve, result.url)
66 const script = v8toIstanbul(path)
67 script.applyCoverage(result.functions)
68 map.merge(script.toIstanbul())
69 } catch (err) {
70 console.warn(`file: ${url} error: ${err.stack}`)
71 }
72 })
73
74 return map
75 }
76 _loadReports () {
77 const files = readdirSync(this.tempDirectory)
78
79 return files.map((f) => {
80 try {
81 return JSON.parse(readFileSync(
82 resolve(this.tempDirectory, f),
83 'utf8'
84 ))
85 } catch (err) {
86 console.warn(`${err.stack}`)
87 }
88 })
89 }
90}
91
92module.exports = function (opts) {
93 const report = new Report(opts)
94 report.run()
95}