1+ const Exclude = require ( 'test-exclude' )
12const libCoverage = require ( 'istanbul-lib-coverage' )
23const libReport = require ( 'istanbul-lib-report' )
34const reports = require ( 'istanbul-reports' )
4- const { readdirSync, readFileSync} = require ( 'fs' )
5- const { resolve} = require ( 'path' )
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' )
69
710class Report {
8- constructor ( { reporter, coverageDirectory, watermarks} ) {
11+ constructor ( {
12+ exclude,
13+ include,
14+ reporter,
15+ tempDirectory,
16+ watermarks,
17+ resolve
18+ } ) {
919 this . reporter = reporter
10- this . coverageDirectory = coverageDirectory
20+ this . tempDirectory = tempDirectory
1121 this . watermarks = watermarks
22+ this . resolve = resolve
23+ this . exclude = Exclude ( {
24+ exclude : exclude ,
25+ include : include
26+ } )
1227 }
1328 run ( ) {
1429 const map = this . _getCoverageMapFromAllCoverageFiles ( )
@@ -25,20 +40,39 @@ class Report {
2540 }
2641 _getCoverageMapFromAllCoverageFiles ( ) {
2742 const map = libCoverage . createCoverageMap ( { } )
43+ const mergedResults = { }
44+ this . _loadReports ( ) . forEach ( ( report ) => {
45+ report . result . forEach ( ( result ) => {
46+ if ( this . exclude . shouldInstrument ( result . url ) &&
47+ isAbsolute ( result . url ) ) {
48+ if ( mergedResults [ result . url ] ) {
49+ mergedResults [ result . url ] = v8CoverageMerge (
50+ mergedResults [ result . url ] ,
51+ result
52+ )
53+ } else {
54+ mergedResults [ result . url ] = result
55+ }
56+ }
57+ } )
58+ } )
2859
29- this . _loadReports ( ) . forEach ( function ( report ) {
30- map . merge ( report )
60+ Object . keys ( mergedResults ) . forEach ( ( url ) => {
61+ const result = mergedResults [ url ]
62+ const path = resolve ( this . resolve , result . url )
63+ const script = v8toIstanbul ( path )
64+ script . applyCoverage ( result . functions )
65+ map . merge ( script . toIstanbul ( ) )
3166 } )
3267
3368 return map
3469 }
3570 _loadReports ( ) {
36- const tmpDirctory = resolve ( this . coverageDirectory , './tmp' )
37- const files = readdirSync ( tmpDirctory )
71+ const files = readdirSync ( this . tempDirectory )
3872
3973 return files . map ( ( f ) => {
4074 return JSON . parse ( readFileSync (
41- resolve ( tmpDirctory , f ) ,
75+ resolve ( this . tempDirectory , f ) ,
4276 'utf8'
4377 ) )
4478 } )
0 commit comments