jest-coverage-badges
Version:
Create a group of coverage badges from jest
105 lines (85 loc) • 2.43 kB
JavaScript
/* eslint-disable semi */
const mkdirp = require('mkdirp');
const { get } = require('https');
const { readFile, writeFile } = require('fs');
/**
* Will lookup the argument in the cli arguments list and will return a
* value passed as CLI arg (if found)
* Otherwise will return default value passed
* @param argName - name of hte argument to look for
* @param defaultOutput - default value to return if could not find argument in cli command
* @private
*/
const findArgument = (argName, defaultOutput) => {
if (!argName) {
return defaultOutput;
}
const index = process.argv.findIndex(a => a.match(argName))
if (index < 0) {
return defaultOutput;
}
try {
return process.argv[index + 1];
} catch (e) {
return defaultOutput;
}
}
const outputPath = findArgument('output', './coverage');
const inputPath = findArgument('input', './coverage/coverage-summary.json');
const getColour = (coverage) => {
if (coverage < 80) {
return 'red';
}
if (coverage < 90) {
return 'yellow';
}
return 'brightgreen';
};
const reportKeys = ['lines', 'statements', 'functions', 'branches'];
const getBadge = (report, key) => {
if (!(report && report.total && report.total[key])) {
throw new Error('malformed coverage report');
}
const coverage = report.total[key].pct;
const colour = getColour(coverage);
return `https://img.shields.io/badge/Coverage${encodeURI(':')}${key}-${coverage}${encodeURI('%')}-${colour}.svg`;
}
const download = (url, cb) => {
get(url, (res) => {
let file = '';
res.on('data', (chunk) => {
file += chunk;
});
res.on('end', () => cb(null, file));
}).on('error', err => cb(err));
}
const writeBadgeInFolder = (key, res) => {
writeFile(`${outputPath}/badge-${key}.svg`, res, 'utf8', (writeError) => {
if (writeError) {
throw writeError;
}
});
}
const getBadgeByKey = report => (key) => {
const url = getBadge(report, key);
download(url, (err, res) => {
if (err) {
throw err;
}
mkdirp(outputPath, (folderError) => {
if (folderError) {
console.error(`Could not create output directory ${folderError}`);
} else {
writeBadgeInFolder(key, res);
}
})
})
}
readFile(`${inputPath}`, 'utf8', (err, res) => {
if (err) {
throw err;
}
const report = JSON.parse(res);
reportKeys.forEach(getBadgeByKey(report));
});