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