wct-istanbub
Version:
Instanbuljs coverage reporting for projects being tested by web-component-tester
58 lines (48 loc) • 2.02 kB
JavaScript
const { createReporter, config } = require('istanbul-api');
const libSourceMaps = require('istanbul-lib-source-maps');
const istanbulCoverage = require('istanbul-lib-coverage');
const express = require('express');
const middleware = require('./middleware');
const Validator = require('./validator');
/**
* Tracks coverage objects and writes results by listening to events
* emitted from wct test runner.
*/
function Listener(emitter, pluginOptions) {
this.map = istanbulCoverage.createCoverageMap();
this.istanbulConfig = config.loadFile(pluginOptions.configFile, pluginOptions.configOverrides);
this.reporter = createReporter(this.istanbulConfig);
this.validator = new Validator(pluginOptions.thresholds);
this.reporter.addAll(pluginOptions.reporters)
pluginOptions.npm = pluginOptions.npm || emitter.options.npm;
emitter.on('sub-suite-end', function (browser, data) {
if (data && data.__coverage__) {
Object.keys(data.__coverage__).forEach(filename => {
this.map.addFileCoverage(data.__coverage__[filename])
});
}
middleware.cacheClear();
}.bind(this));
emitter.on('run-end', function (error) {
if (error && pluginOptions.onlyWriteSuccess) {
throw Error('Tests failed. Not writing coverage report.');
}
const mapStore = libSourceMaps.createSourceMapStore({});
const transformed = mapStore.transformCoverage(this.map);
// Log a new line to not overwrite the test results outputted by WCT
console.log('\n');
this.reporter.write(transformed.map);
mapStore.dispose();
if (!validator.validate(transformed.map)) {
throw Error('Coverage failed');
}
}.bind(this));
emitter.hook('define:webserver', function (app, assign, options, done) {
const newApp = express();
newApp.use(middleware.middleware(emitter.options.root, pluginOptions, emitter));
newApp.use(app);
assign(newApp);
done();
}.bind(this));
}
module.exports = Listener;