112 lines
3.6 KiB
JavaScript
112 lines
3.6 KiB
JavaScript
|
/*
|
||
|
Copyright (c) 2014, Yahoo! Inc. All rights reserved.
|
||
|
Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
|
||
|
*/
|
||
|
var Report = require('./report'),
|
||
|
configuration = require('./config'),
|
||
|
inputError = require('./util/input-error');
|
||
|
|
||
|
/**
|
||
|
* convenience mechanism to write one or more reports ensuring that config
|
||
|
* options are respected.
|
||
|
* Usage
|
||
|
* -----
|
||
|
*
|
||
|
* var fs = require('fs'),
|
||
|
* reporter = new require('istanbul').Reporter(),
|
||
|
* collector = new require('istanbul').Collector(),
|
||
|
* sync = true;
|
||
|
*
|
||
|
* collector.add(JSON.parse(fs.readFileSync('coverage.json', 'utf8')));
|
||
|
* reporter.add('lcovonly');
|
||
|
* reporter.addAll(['clover', 'cobertura']);
|
||
|
* reporter.write(collector, sync, function () { console.log('done'); });
|
||
|
*
|
||
|
* @class Reporter
|
||
|
* @param {Configuration} cfg the config object, a falsy value will load the
|
||
|
* default configuration instead
|
||
|
* @param {String} dir the directory in which to write the reports, may be falsy
|
||
|
* to use config or global defaults
|
||
|
* @constructor
|
||
|
* @module main
|
||
|
*/
|
||
|
function Reporter(cfg, dir) {
|
||
|
this.config = cfg || configuration.loadFile();
|
||
|
this.dir = dir || this.config.reporting.dir();
|
||
|
this.reports = {};
|
||
|
}
|
||
|
|
||
|
Reporter.prototype = {
|
||
|
/**
|
||
|
* adds a report to be generated. Must be one of the entries returned
|
||
|
* by `Report.getReportList()`
|
||
|
* @method add
|
||
|
* @param {String} fmt the format of the report to generate
|
||
|
*/
|
||
|
add: function (fmt) {
|
||
|
if (this.reports[fmt]) { // already added
|
||
|
return;
|
||
|
}
|
||
|
var config = this.config,
|
||
|
rptConfig = config.reporting.reportConfig()[fmt] || {};
|
||
|
rptConfig.verbose = config.verbose;
|
||
|
rptConfig.dir = this.dir;
|
||
|
rptConfig.watermarks = config.reporting.watermarks();
|
||
|
try {
|
||
|
this.reports[fmt] = Report.create(fmt, rptConfig);
|
||
|
} catch (ex) {
|
||
|
throw inputError.create('Invalid report format [' + fmt + ']');
|
||
|
}
|
||
|
},
|
||
|
/**
|
||
|
* adds an array of report formats to be generated
|
||
|
* @method addAll
|
||
|
* @param {Array} fmts an array of report formats
|
||
|
*/
|
||
|
addAll: function (fmts) {
|
||
|
var that = this;
|
||
|
fmts.forEach(function (f) {
|
||
|
that.add(f);
|
||
|
});
|
||
|
},
|
||
|
/**
|
||
|
* writes all reports added and calls the callback when done
|
||
|
* @method write
|
||
|
* @param {Collector} collector the collector having the coverage data
|
||
|
* @param {Boolean} sync true to write reports synchronously
|
||
|
* @param {Function} callback the callback to call when done. When `sync`
|
||
|
* is true, the callback will be called in the same process tick.
|
||
|
*/
|
||
|
write: function (collector, sync, callback) {
|
||
|
var reports = this.reports,
|
||
|
verbose = this.config.verbose,
|
||
|
handler = this.handleDone.bind(this, callback);
|
||
|
|
||
|
this.inProgress = Object.keys(reports).length;
|
||
|
|
||
|
Object.keys(reports).forEach(function (name) {
|
||
|
var report = reports[name];
|
||
|
if (verbose) {
|
||
|
console.error('Write report: ' + name);
|
||
|
}
|
||
|
report.on('done', handler);
|
||
|
report.writeReport(collector, sync);
|
||
|
});
|
||
|
},
|
||
|
/*
|
||
|
* handles listening on all reports to be completed before calling the callback
|
||
|
* @method handleDone
|
||
|
* @private
|
||
|
* @param {Function} callback the callback to call when all reports are
|
||
|
* written
|
||
|
*/
|
||
|
handleDone: function (callback) {
|
||
|
this.inProgress -= 1;
|
||
|
if (this.inProgress === 0) {
|
||
|
return callback();
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
module.exports = Reporter;
|