// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Takes raw v8 coverage files and converts to IstanbulJS
* compliant coverage files.
*/
// Relative path to the node modules.
const NODE_MODULES = [
'..', '..', '..', 'third_party', 'js_code_coverage', 'node_modules'];
const {Worker} = require('worker_threads');
const {join} = require('path');
const {readFile, mkdir} = require('fs').promises;
const {ArgumentParser} = require(join(...NODE_MODULES, 'argparse'));
function createWorker(coverageDir, sourceDir, outputDir, urlToPathMap) {
return new Promise(function(resolve, reject) {
const worker = new Worker(join(__dirname, 'coverage_worker.js'), {
workerData: {
coverageDir: coverageDir,
sourceDir: sourceDir,
outputDir: outputDir,
urlToPathMap: urlToPathMap
},
});
worker.on('message', (data) => {
resolve(data);
});
worker.on('error', (msg) => {
reject(`An error ocurred: ${msg}`);
});
});
}
/**
* The entry point to the function to enable the async functionality throughout.
* @param {Object} args The parsed CLI arguments.
* @return {!Promise<string>} Directory containing istanbul reports.
*/
async function main(args) {
const urlToPathMapFile =
await readFile(join(args.source_dir, 'parsed_scripts.json'));
const urlToPathMap = JSON.parse(urlToPathMapFile.toString());
const outputDir = join(args.output_dir, 'istanbul')
await mkdir(outputDir, {recursive: true});
const workerPromises = [];
for (const coverageDir of args.raw_coverage_dirs) {
workerPromises.push(
createWorker(coverageDir, args.source_dir, outputDir, urlToPathMap));
}
const results = await Promise.all(workerPromises);
console.log(`Result from workers: ${results}`)
return outputDir;
}
const parser = new ArgumentParser({
description: 'Converts raw v8 coverage into IstanbulJS compliant files.',
});
parser.add_argument('-s', '--source-dir', {
required: true,
help: 'Root directory where source files live. The corresponding ' +
'coverage files must refer to these files. Currently source ' +
'maps are not supported.',
});
parser.add_argument('-o', '--output-dir', {
required: true,
help: 'Root directory to output all the converted istanbul coverage ' +
'reports.',
});
parser.add_argument('-c', '--raw-coverage-dirs', {
required: true,
nargs: '*',
help: 'Directory that contains the raw v8 coverage files (files ' +
'ending in .cov.json)',
});
const args = parser.parse_args();
main(args)
.then(outputDir => {
console.log(`Successfully converted from v8 to IstanbulJS: ${outputDir}`);
})
.catch(error => {
console.error(error);
process.exit(1);
});