UNPKG

@jobber/jest-a-coverage-slip-detector

Version:

Ensures that new files have jest coverage and that legacy files only increase

74 lines (59 loc) 2.13 kB
const fs = require("fs"); const path = require("path"); const libCoverage = require("istanbul-lib-coverage"); const libReport = require("istanbul-lib-report"); const reports = require("istanbul-reports"); const { loadConfig } = require("./config"); const JSON_SUMMARY_REPORT_KEY = "json-summary"; function loadData(filePath) { const json = fs.readFileSync(filePath); return JSON.parse(json); } function mergeCoverageMaps(files, alwaysMerge) { let initialData = {}; if (files.length === 1 && alwaysMerge) { initialData = loadData(files[0]); } const coverageMap = libCoverage.createCoverageMap(initialData); files.forEach(covergeFinalFile => { coverageMap.merge(loadData(covergeFinalFile)); }); return coverageMap; } function mergeCoverage(config) { if (!config.mergeCoveragePath) { throw "Missing required configuration option: `mergeCoveragePath`"; } if (!fs.existsSync(config.mergeCoveragePath)) { throw `Merge coverage path does not exist: ${config.mergeCoveragePath}`; } const files = fs.readdirSync(config.mergeCoveragePath); const filePaths = files .filter( file => path.basename(file).startsWith(config.input.mergePrefix) && path.extname(file) === ".json", ) .map(file => path.join(config.mergeCoveragePath, file)); return mergeCoverageMaps(filePaths, config.input.alwaysMerge); } exports.mergeCoverageAndGenerateReports = function mergeCoverageAndGenerateReports() { const config = loadConfig(); const mergedCoverage = mergeCoverage(config); // We always want to produce the json-summary report // because it is required for the validation phase. const reportOutputDirectories = { ...config.output.additionalReports, [JSON_SUMMARY_REPORT_KEY]: path.dirname(config.input.coverageSummaryPath), }; for (const [reportType, outputDirectory] of Object.entries( reportOutputDirectories, )) { const context = libReport.createContext({ dir: outputDirectory, coverageMap: mergedCoverage, }); reports.create(reportType).execute(context); } };