Skip to content

Commit fb73dfa

Browse files
author
Alexander Kharkovey
committed
ci: add utils for merge coverage
1 parent f45d811 commit fb73dfa

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
const glob = require('glob')
2+
const path = require('path')
3+
const fs = require('fs-extra')
4+
const {execSync} = require('child_process')
5+
const { createReporter } = require('istanbul-api');
6+
const istanbulCoverage = require('istanbul-lib-coverage');
7+
8+
const coverageDir = path.resolve(process.cwd(), 'coverage')
9+
const mergedDir = path.resolve(coverageDir, 'merged')
10+
11+
fs.emptyDirSync(mergedDir)
12+
const files = glob(coverageDir + '/**/*.xml', {sync: true})
13+
const exludeFromName = ['apps', 'libs']
14+
15+
files.forEach((f, i) => {
16+
const x = f.split('/coverage/')[1].replace(/\//g, '-').split('/').pop()
17+
.split('-').filter(i => i !== 'apps' && i !== 'libs' && i !== 'cobertura').join('-')
18+
fs.copySync(f, `${mergedDir}/${x}`)
19+
})
20+
21+
const filesMerged = glob(mergedDir + '/**/*.xml', {sync: true})
22+
23+
const packages = filesMerged
24+
.map((f, i) => {
25+
const fileName = path.basename(f)
26+
const projectName = fileName.split('-')
27+
projectName.pop()
28+
29+
return `${projectName.join('-')}=${fileName}`
30+
})
31+
.join(' ')
32+
33+
34+
35+
const script = `npx cobertura-merge -o merged-cobertura-coverage.xml ${packages}`
36+
37+
execSync(script, {
38+
stdio: [0, 1, 2],
39+
cwd: mergedDir,
40+
})
41+
42+
43+
const reporter = createReporter();
44+
45+
/* [ Configuration ] */
46+
const rootDir = './coverage';
47+
const reportOut = './coverage/report';
48+
49+
const normalizeJestCoverage = ( obj ) => {
50+
const result = { ...obj };
51+
52+
Object
53+
.entries( result )
54+
.filter( ([k, v] ) => v.data )
55+
.forEach( ([k, v] ) => {
56+
result[k] = v.data;
57+
});
58+
59+
return result;
60+
};
61+
62+
const mergeAllReports = ( coverageMap, reports ) => {
63+
if ( Array.isArray( reports ) === false ) {
64+
return;
65+
}
66+
67+
reports.forEach( reportFile => {
68+
const coverageReport = fs.readJSONSync( reportFile );
69+
coverageMap.merge( normalizeJestCoverage( coverageReport ) );
70+
})
71+
};
72+
73+
const findAllCoverageReports = ( path, callback ) => {
74+
glob( path, {}, ( err, reports )=>{
75+
callback( reports, err );
76+
});
77+
};
78+
79+
const generateReport = ( coverageMap, types ) => {
80+
reporter.dir = reportOut;
81+
reporter.addAll(types || ['html', 'text'] );
82+
reporter.write( coverageMap );
83+
};
84+
85+
async function main () {
86+
const coverageMap = istanbulCoverage.createCoverageMap( {} );
87+
88+
findAllCoverageReports( rootDir + '/**/coverage-final.json', ( reports, err ) => {
89+
if ( Array.isArray( reports ) ) {
90+
mergeAllReports( coverageMap, reports );
91+
generateReport( coverageMap, [ 'text' ] )
92+
}
93+
});
94+
}
95+
96+
main().catch(err => {
97+
console.error(err);
98+
process.exit(1);
99+
});

0 commit comments

Comments
 (0)