// 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} 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); });