| /* |
| Copyright 2012-2015, Yahoo Inc. |
| Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. |
| */ |
| const path = require('path'); |
| const libReport = require('istanbul-lib-report'); |
| const libReports = require('istanbul-reports'); |
| const minimatch = require('minimatch'); |
| const inputError = require('./input-error'); |
| const configuration = require('./config'); |
| |
| function Reporter(cfg, opts) { |
| opts = opts || {}; |
| this.config = cfg || configuration.loadFile(); |
| this.dir = path.resolve(this.config.reporting.dir()); |
| this.reports = {}; |
| |
| let summarizer = opts.summarizer; |
| const 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(fmt) { |
| if (this.reports[fmt]) { |
| // already added |
| return; |
| } |
| const config = this.config; |
| const 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(fmts) { |
| fmts.forEach(f => { |
| this.add(f); |
| }); |
| }, |
| /** |
| * writes all reports added |
| * @method write |
| */ |
| write(coverageMap, opts) { |
| opts = opts || {}; |
| const sourceFinder = opts.sourceFinder || null; |
| |
| const context = libReport.createContext({ |
| dir: this.dir, |
| watermarks: this.config.reporting.watermarks(), |
| sourceFinder |
| }); |
| |
| const excludes = this.config.instrumentation.excludes() || []; |
| |
| coverageMap.filter( |
| file => |
| !excludes.some(exclude => |
| minimatch(file, exclude, { dot: true }) |
| ) |
| ); |
| |
| const tree = this.summarizer(coverageMap); |
| Object.keys(this.reports).forEach(name => { |
| const report = this.reports[name]; |
| tree.visit(report, context); |
| }); |
| } |
| }; |
| |
| module.exports = Reporter; |