|
| 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