@@ -4,7 +4,7 @@ const libReport = require('istanbul-lib-report')
4
4
const reports = require ( 'istanbul-reports' )
5
5
const { readdirSync, readFileSync } = require ( 'fs' )
6
6
const { resolve, isAbsolute } = require ( 'path' )
7
- const v8CoverageMerge = require ( 'v8-coverage-merge ' )
7
+ const { mergeProcessCovs } = require ( '@c88/ v8-coverage' )
8
8
const v8toIstanbul = require ( 'v8-to-istanbul' )
9
9
10
10
class Report {
@@ -41,38 +41,47 @@ class Report {
41
41
} )
42
42
}
43
43
_getCoverageMapFromAllCoverageFiles ( ) {
44
+ const v8ProcessCov = this . _getMergedProcessCov ( )
45
+
44
46
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
47
62
- Object . keys ( mergedResults ) . forEach ( ( url ) => {
48
+ for ( const v8ScriptCov of v8ProcessCov . result ) {
63
49
try {
64
- const result = mergedResults [ url ]
65
- const path = resolve ( this . resolve , result . url )
50
+ const path = resolve ( this . resolve , v8ScriptCov . url )
66
51
const script = v8toIstanbul ( path )
67
- script . applyCoverage ( result . functions )
52
+ script . applyCoverage ( v8ScriptCov . functions )
68
53
map . merge ( script . toIstanbul ( ) )
69
54
} catch ( err ) {
70
- console . warn ( `file: ${ url } error: ${ err . stack } ` )
55
+ console . warn ( `file: ${ v8ScriptCov . url } error: ${ err . stack } ` )
71
56
}
72
- } )
57
+ }
73
58
74
59
return map
75
60
}
61
+
62
+ /**
63
+ * Returns the merged V8 process coverage.
64
+ *
65
+ * The result is computed from the individual process coverages generated
66
+ * by Node. It represents the sum of their counts.
67
+ *
68
+ * @return {ProcessCov } Merged V8 process coverage.
69
+ * @private
70
+ */
71
+ _getMergedProcessCov ( ) {
72
+ const v8ProcessCovs = [ ]
73
+ for ( const v8ProcessCov of this . _loadReports ( ) ) {
74
+ v8ProcessCovs . push ( this . _filterProcessCov ( v8ProcessCov ) )
75
+ }
76
+ return mergeProcessCovs ( v8ProcessCovs )
77
+ }
78
+
79
+ /**
80
+ * Returns the list of V8 process coverages generated by Node.
81
+ *
82
+ * @return {ProcessCov[] } Process coverages generated by Node.
83
+ * @private
84
+ */
76
85
_loadReports ( ) {
77
86
const files = readdirSync ( this . tempDirectory )
78
87
@@ -87,6 +96,28 @@ class Report {
87
96
}
88
97
} )
89
98
}
99
+
100
+ /**
101
+ * Returns a filtered process coverage.
102
+ *
103
+ * The result is a copy of the input, with script coverages filtered based
104
+ * on their `url` and the current inclusion rules.
105
+ * There is no deep cloning.
106
+ *
107
+ * @param v8ProcessCov V8 process coverage to filter.
108
+ * @return {v8ProcessCov } Filtered V8 process coverage.
109
+ * @private
110
+ */
111
+ _filterProcessCov ( v8ProcessCov ) {
112
+ const result = [ ]
113
+ for ( const v8ScriptCov of v8ProcessCov . result ) {
114
+ if ( this . exclude . shouldInstrument ( v8ScriptCov . url ) &&
115
+ ( ! this . omitRelative || isAbsolute ( v8ScriptCov . url ) ) ) {
116
+ result . push ( v8ScriptCov )
117
+ }
118
+ }
119
+ return { result }
120
+ }
90
121
}
91
122
92
123
module . exports = function ( opts ) {
0 commit comments