UNPKG

wct-istanbul

Version:

Istanbul coverage reporting for projects being tested by web-component-tester

73 lines (63 loc) 2.47 kB
var middleware = require('./middleware'); var libCoverage = require('istanbul-lib-coverage'); var libReport = require('istanbul-lib-report'); var reports = require('istanbul-reports'); var Validator = require('./validator'); var sync = true; var package = require('../package.json'); /** * Tracks coverage objects and writes results by listening to events * emitted from wct test runner. */ function Listener(emitter, pluginOptions) { this.options = pluginOptions; this.map = libCoverage.createCoverageMap({}); this.context = libReport.createContext({ dir: this.options.dir }); this.validator = new Validator(this.options.thresholds); this.reporters = this.options.reporters || [ 'text-summary', 'lcov' ]; this.chain = false; emitter.on('sub-suite-end', function(browser, data) { if (data) { for (var prop in data) { if (prop.indexOf('__coverage__') === 0) { emitter.emit('log:debug', 'coverage', 'sub-suite-end', 'map.merge(data.' + prop + ')'); this.map.merge(data[prop]); } } } }.bind(this)); emitter.on('run-end', function(error) { if (!error) { var tree = libReport.summarizers.pkg(this.map); this.reporters.forEach(function (reporter) { tree.visit(reports.create(reporter), this.context); }, this); if (!this.validator.validate(this.map)) { throw new Error('Coverage failed'); } } }.bind(this)); emitter.hook('define:webserver', function(express, substitute, options) { this.chain = true; emitter.emit('log:debug', 'coverage', 'define:webserver', package.name, package.version); express.use(middleware(emitter.options.root, this.options, emitter, options, this.chain)); var layer = express._router.stack.pop(); for (var i = express._router.stack.length - 1; i >= 0; i--) { var current = express._router.stack[i]; if (current.handle.toString().startsWith('(req, res, next) => {')) { express._router.stack.splice(i + 1, 0, layer); break; } } substitute(express); return Promise.resolve(); }.bind(this)); emitter.hook('prepare:webserver', function(express) { emitter.emit('log:debug', 'coverage', 'prepare:webserver', package.name, package.version); if (!this.chain) { express.use(middleware(emitter.options.root, this.options, emitter, null, this.chain)); } return Promise.resolve(); }.bind(this)); }; module.exports = Listener;