diff --git a/packages/istanbul-api/lib/reporter.js b/packages/istanbul-api/lib/reporter.js index 64709c6f..e4a8ebdc 100644 --- a/packages/istanbul-api/lib/reporter.js +++ b/packages/istanbul-api/lib/reporter.js @@ -6,7 +6,8 @@ var path = require('path'), configuration = require('./config'), inputError = require('./input-error'), libReport = require('istanbul-lib-report'), - libReports = require('istanbul-reports'); + libReports = require('istanbul-reports'), + minimatch = require('minimatch'); function Reporter(cfg, opts) { opts = opts || {}; @@ -81,6 +82,15 @@ Reporter.prototype = { 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]; diff --git a/packages/istanbul-api/package.json b/packages/istanbul-api/package.json index e443ab13..5378d80a 100644 --- a/packages/istanbul-api/package.json +++ b/packages/istanbul-api/package.json @@ -37,6 +37,7 @@ "istanbul-reports": "^2.0.3", "js-yaml": "^3.12.0", "make-dir": "^1.3.0", + "minimatch": "^3.0.4", "once": "^1.4.0" }, "engines": { diff --git a/packages/istanbul-api/test/reporter.test.js b/packages/istanbul-api/test/reporter.test.js index e69de29b..6b099419 100644 --- a/packages/istanbul-api/test/reporter.test.js +++ b/packages/istanbul-api/test/reporter.test.js @@ -0,0 +1,106 @@ +/* globals context, describe, it */ + +var assert = require('chai').assert, + configuration = require('../lib/config'), + coverage = require('istanbul-lib-coverage'), + Reporter = require('../lib/reporter'); + +describe('Reporter', function() { + describe('#write', function() { + context('config to exclude files is not defined', function() { + var config = configuration.loadObject(); + + it('does not exclude files from reports', function(done) { + var coverageMap = coverage.createCoverageMap({}); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/a/b/c.js') + ); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/d/e/f.js') + ); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/g/h/i.js') + ); + + var opts = { + summarizer: function(cm) { + assert.deepEqual(cm.files(), [ + '/a/b/c.js', + '/d/e/f.js', + '/g/h/i.js' + ]); + done(); + } + }; + + var reporter = new Reporter(config, opts); + + reporter.write(coverageMap); + }); + }); + + context('config to exclude files is defined', function() { + var config = configuration.loadObject({ + instrumentation: { + excludes: ['**/a/**/*.js', '**/h/**/*.js'] + } + }); + + context('files to be excluded found', function() { + var coverageMap = coverage.createCoverageMap(); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/a/b/c.js') + ); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/d/e/f.js') + ); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/g/h/i.js') + ); + + it('excludes files from reports', function(done) { + var opts = { + summarizer: function(cm) { + assert.deepEqual(cm.files(), ['/d/e/f.js']); + done(); + } + }; + + var reporter = new Reporter(config, opts); + + reporter.write(coverageMap); + }); + }); + + context('files to be excluded not found', function() { + var coverageMap = coverage.createCoverageMap(); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/x/b/c.js') + ); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/d/e/f.js') + ); + coverageMap.addFileCoverage( + coverage.createFileCoverage('/g/x/i.js') + ); + + it('does not exclude files from reports', function(done) { + var opts = { + summarizer: function(cm) { + assert.deepEqual(cm.files(), [ + '/x/b/c.js', + '/d/e/f.js', + '/g/x/i.js' + ]); + done(); + } + }; + + var reporter = new Reporter(config, opts); + + reporter.write(coverageMap); + }); + }); + }); + }); +});