-
Notifications
You must be signed in to change notification settings - Fork 0
/
report.js
131 lines (119 loc) · 3.51 KB
/
report.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
const Exclude = require('test-exclude')
const libCoverage = require('istanbul-lib-coverage')
const libReport = require('istanbul-lib-report')
const reports = require('istanbul-reports')
const { readdirSync, readFileSync } = require('fs')
const { resolve, isAbsolute } = require('path')
const { mergeProcessCovs } = require('@c88/v8-coverage')
const v8toIstanbul = require('v8-to-istanbul')
class Report {
constructor ({
exclude,
include,
reporter,
tempDirectory,
watermarks,
resolve,
omitRelative,
wrapperLength
}) {
this.reporter = reporter
this.tempDirectory = tempDirectory
this.watermarks = watermarks
this.resolve = resolve
this.exclude = Exclude({
exclude: exclude,
include: include
})
this.omitRelative = omitRelative
this.wrapperLength = wrapperLength
}
run () {
const map = this._getCoverageMapFromAllCoverageFiles()
var context = libReport.createContext({
dir: './coverage',
watermarks: this.watermarks
})
const tree = libReport.summarizers.pkg(map)
this.reporter.forEach(function (_reporter) {
tree.visit(reports.create(_reporter), context)
})
}
_getCoverageMapFromAllCoverageFiles () {
const v8ProcessCov = this._getMergedProcessCov()
const map = libCoverage.createCoverageMap({})
for (const v8ScriptCov of v8ProcessCov.result) {
try {
const path = resolve(this.resolve, v8ScriptCov.url)
const script = v8toIstanbul(path, this.wrapperLength)
script.applyCoverage(v8ScriptCov.functions)
map.merge(script.toIstanbul())
} catch (err) {
console.warn(`file: ${v8ScriptCov.url} error: ${err.stack}`)
}
}
return map
}
/**
* Returns the merged V8 process coverage.
*
* The result is computed from the individual process coverages generated
* by Node. It represents the sum of their counts.
*
* @return {ProcessCov} Merged V8 process coverage.
* @private
*/
_getMergedProcessCov () {
const v8ProcessCovs = []
for (const v8ProcessCov of this._loadReports()) {
v8ProcessCovs.push(this._filterProcessCov(v8ProcessCov))
}
return mergeProcessCovs(v8ProcessCovs)
}
/**
* Returns the list of V8 process coverages generated by Node.
*
* @return {ProcessCov[]} Process coverages generated by Node.
* @private
*/
_loadReports () {
const files = readdirSync(this.tempDirectory)
return files.map((f) => {
try {
return JSON.parse(readFileSync(
resolve(this.tempDirectory, f),
'utf8'
))
} catch (err) {
console.warn(`${err.stack}`)
}
})
}
/**
* Returns a filtered process coverage.
*
* The result is a copy of the input, with script coverages filtered based
* on their `url` and the current inclusion rules.
* There is no deep cloning.
*
* @param v8ProcessCov V8 process coverage to filter.
* @return {v8ProcessCov} Filtered V8 process coverage.
* @private
*/
_filterProcessCov (v8ProcessCov) {
const result = []
for (const v8ScriptCov of v8ProcessCov.result) {
// TODO: implement real fix from https://github.com/nodejs/node/issues/23783
v8ScriptCov.url = v8ScriptCov.url.replace(/^file:\/\//, '')
if (this.exclude.shouldInstrument(v8ScriptCov.url) &&
(!this.omitRelative || isAbsolute(v8ScriptCov.url))) {
result.push(v8ScriptCov)
}
}
return { result }
}
}
module.exports = function (opts) {
const report = new Report(opts)
report.run()
}