| /* |
| 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; |