1 | const Exclude = require('test-exclude')
|
2 | const libCoverage = require('istanbul-lib-coverage')
|
3 | const libReport = require('istanbul-lib-report')
|
4 | const reports = require('istanbul-reports')
|
5 | const { readdirSync, readFileSync } = require('fs')
|
6 | const { resolve, isAbsolute } = require('path')
|
7 | const v8CoverageMerge = require('v8-coverage-merge')
|
8 | const v8toIstanbul = require('v8-to-istanbul')
|
9 |
|
10 | class 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 |
|
92 | module.exports = function (opts) {
|
93 | const report = new Report(opts)
|
94 | report.run()
|
95 | }
|