blob: e4a8ebdc844ea5c83227af9fbcad29b7fa95f4d4 [file] [log] [blame]
/*
Copyright 2012-2015, Yahoo Inc.
Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
*/
var path = require('path'),
configuration = require('./config'),
inputError = require('./input-error'),
libReport = require('istanbul-lib-report'),
libReports = require('istanbul-reports'),
minimatch = require('minimatch');
function Reporter(cfg, opts) {
opts = opts || {};
this.config = cfg || configuration.loadFile();
this.dir = path.resolve(this.config.reporting.dir());
this.reports = {};
var summarizer = opts.summarizer,
s = this.config.reporting.summarizer();
if (summarizer && typeof summarizer === 'function') {
this.summarizer = summarizer;
} else {
summarizer = libReport.summarizers[s];
if (!summarizer) {
throw inputError.create(
'Invalid summarizer in report config: ' + s
);
}
this.summarizer = summarizer;
}
}
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;
try {
if (this.config.verbose) {
console.error('Create report', fmt, ' with', rptConfig);
}
this.reports[fmt] = libReports.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
* @method write
*/
write: function(coverageMap, opts) {
opts = opts || {};
var that = this,
sourceFinder = opts.sourceFinder || null,
context,
tree;
context = libReport.createContext({
dir: this.dir,
watermarks: this.config.reporting.watermarks(),
sourceFinder: sourceFinder
});
var excludes = this.config.instrumentation.excludes() || [];
coverageMap.filter(function(file) {
return !excludes.some(function(exclude) {
return minimatch(file, exclude, { dot: true });
});
});
tree = this.summarizer(coverageMap);
Object.keys(this.reports).forEach(function(name) {
var report = that.reports[name];
tree.visit(report, context);
});
}
};
module.exports = Reporter;