From 9fd22950380cf107af1dbab97237485af91e4230 Mon Sep 17 00:00:00 2001 From: "Benjamin E. Coe" Date: Sun, 12 Jun 2016 20:52:21 -0700 Subject: [PATCH] feat: make `__coverage__` the default approach we advocate for ES2015 coverage (#268) * feat: make nyc behave better when used with babel-plugin-__coverage__ (see #266) * feat: abstract test include/exclude logic into its own module * fix: add text-exclude dependency * fix: should have instrumenters in files list * fix: fix remapping issue with source-maps * fix: typo was causing argument not to propagate * docs: add section introducing __coverage__ for ES6/ES7 * docs: a couple small edits --- README.md | 38 +++++++++- bin/nyc.js | 17 ++++- bin/wrap.js | 4 +- index.js | 98 +++++++------------------- lib/instrumenters/istanbul.js | 23 ++++++ lib/instrumenters/noop.js | 9 +++ lib/source-map-cache.js | 5 ++ package.json | 3 + screen2.png | Bin 0 -> 63728 bytes test/fixtures/cli/env.js | 1 + test/src/nyc-bin.js | 42 +++++++++++ test/src/nyc-test.js | 129 +++++++++++++--------------------- 12 files changed, 213 insertions(+), 156 deletions(-) create mode 100644 lib/instrumenters/istanbul.js create mode 100644 lib/instrumenters/noop.js create mode 100644 screen2.png create mode 100755 test/fixtures/cli/env.js diff --git a/README.md b/README.md index 07175b02c..1fecbb0f1 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,42 @@ of the pre-transpiled code. You'll have to configure your custom require hook to inline the source map in the transpiled code. For Babel that means setting the `sourceMaps` option to `inline`. +## Use babel-plugin__coverage__ for Better ES6/ES7 Support + +[`babel-plugin-__coverage__`](https://github.com/dtinth/babel-plugin-__coverage__) can be used to enable better first-class ES6 support. + +1. enable the `__coverage__` plugin: + + ```json + { + "babel": { + "presets": ["es2015"], + "plugins": ["__coverage__"] + } + } + ``` + +2. disable nyc's instrumentation and source-maps: + + ```json + { + "nyc": { + "include": [ + "src/*.js" + ], + "require": [ + "babel-register" + ], + "sourceMap": false, + "instrumenter": "./lib/instrumenters/noop" + } + } + ``` + +That's all there is to it, better ES6 syntax highlighting awaits: + + + ## Support For Custom File Extensions (.jsx, .es6) Supporting file extensions can be configured through either the configuration arguments or with the `nyc` config section in `package.json`. @@ -249,8 +285,6 @@ That's all there is to it! [codecov](https://codecov.io/) is a great tool for adding coverage reports to your GitHub project, even viewing them inline on GitHub with a browser extension: -![browser extension](https://d234q63orb21db.cloudfront.net/ad63907877249140772dff929ad1c340e424962a/media/images/next/extension.png) - Here's how to get `nyc` integrated with codecov and travis-ci.org: 1. add the codecov and nyc dependencies to your module: diff --git a/bin/nyc.js b/bin/nyc.js index e1b70f589..5fa50f8ea 100755 --- a/bin/nyc.js +++ b/bin/nyc.js @@ -97,6 +97,16 @@ var yargs = require('yargs/yargs')(process.argv.slice(2)) description: 'what % of statements must be covered?', global: true }) + .option('source-map', { + default: true, + type: 'boolean', + description: 'should nyc detect and handle source maps?' + }) + .option('instrumenter', { + default: './lib/instrumenters/istanbul', + type: 'string', + description: 'what library should be used to instrument coverage?' + }) .help('h') .alias('h', 'help') .version() @@ -125,7 +135,8 @@ if (argv._[0] === 'report') { var nyc = (new NYC({ require: argv.require, include: argv.include, - exclude: argv.exclude + exclude: argv.exclude, + sourceMap: !!argv.sourceMap })) nyc.reset() @@ -133,7 +144,9 @@ if (argv._[0] === 'report') { var env = { NYC_CWD: process.cwd(), - NYC_CACHE: argv.cache ? 'enable' : 'disable' + NYC_CACHE: argv.cache ? 'enable' : 'disable', + NYC_SOURCE_MAP: argv.sourceMap ? 'enable' : 'disable', + NYC_INSTRUMENTER: argv.instrumenter } if (argv.require.length) { env.NYC_REQUIRE = argv.require.join(',') diff --git a/bin/wrap.js b/bin/wrap.js index c0c326763..16372ae3d 100644 --- a/bin/wrap.js +++ b/bin/wrap.js @@ -11,7 +11,9 @@ try { extension: process.env.NYC_EXTENSION ? process.env.NYC_EXTENSION.split(',') : [], exclude: process.env.NYC_EXCLUDE ? process.env.NYC_EXCLUDE.split(',') : [], include: process.env.NYC_INCLUDE ? process.env.NYC_INCLUDE.split(',') : [], - enableCache: process.env.NYC_CACHE === 'enable' + enableCache: process.env.NYC_CACHE === 'enable', + sourceMap: process.env.NYC_SOURCE_MAP === 'enable', + instrumenter: process.env.NYC_INSTRUMENTER })).wrap() sw.runMain() diff --git a/index.js b/index.js index 4f72eec28..617791a6d 100755 --- a/index.js +++ b/index.js @@ -1,7 +1,6 @@ /* global __coverage__ */ var fs = require('fs') var glob = require('glob') -var micromatch = require('micromatch') var mkdirp = require('mkdirp') var Module = require('module') var appendTransform = require('append-transform') @@ -17,7 +16,8 @@ var md5hex = require('md5-hex') var findCacheDir = require('find-cache-dir') var js = require('default-require-extensions/js') var pkgUp = require('pkg-up') -var yargs = require('yargs/yargs') +var testExclude = require('test-exclude') +var yargs = require('yargs') /* istanbul ignore next */ if (/index\.covered\.js$/.test(__filename)) { @@ -30,29 +30,23 @@ function NYC (opts) { this._istanbul = config.istanbul this.subprocessBin = config.subprocessBin || path.resolve(__dirname, './bin/nyc.js') this._tempDirectory = config.tempDirectory || './.nyc_output' + this._instrumenterLib = require(config.instrumenter || './lib/instrumenters/istanbul') this._reportDir = config.reportDir + this._sourceMap = config.sourceMap this.cwd = config.cwd this.reporter = arrify(config.reporter || 'text') - // load exclude stanza from config. - this.include = false - if (config.include && config.include.length > 0) { - this.include = this._prepGlobPatterns(arrify(config.include)) - } - - this.exclude = this._prepGlobPatterns( - ['**/node_modules/**'].concat(arrify( - config.exclude && config.exclude.length > 0 - ? config.exclude - : ['test/**', 'test{,-*}.js', '**/*.test.js', '**/__tests__/**'] - )) - ) - this.cacheDirectory = findCacheDir({name: 'nyc', cwd: this.cwd}) this.enableCache = Boolean(this.cacheDirectory && (config.enableCache === true || process.env.NYC_CACHE === 'enable')) + this.exclude = testExclude({ + cwd: this.cwd, + include: config.include, + exclude: config.exclude + }) + // require extensions can be provided as config in package.json. this.require = arrify(config.require) @@ -129,43 +123,7 @@ NYC.prototype.instrumenter = function () { } NYC.prototype._createInstrumenter = function () { - var configFile = path.resolve(this.cwd, './.istanbul.yml') - - if (!fs.existsSync(configFile)) configFile = undefined - - var istanbul = this.istanbul() - - var instrumenterConfig = istanbul.config.loadFile(configFile).instrumentation.config - - return new istanbul.Instrumenter({ - coverageVariable: '__coverage__', - embedSource: instrumenterConfig['embed-source'], - noCompact: !instrumenterConfig.compact, - preserveComments: instrumenterConfig['preserve-comments'] - }) -} - -NYC.prototype._prepGlobPatterns = function (patterns) { - if (!patterns) return patterns - - var result = [] - - function add (pattern) { - if (result.indexOf(pattern) === -1) { - result.push(pattern) - } - } - - patterns.forEach(function (pattern) { - // Allow gitignore style of directory exclusion - if (!/\/\*\*$/.test(pattern)) { - add(pattern.replace(/\/$/, '') + '/**') - } - - add(pattern) - }) - - return result + return this._instrumenterLib(this.cwd) } NYC.prototype.addFile = function (filename) { @@ -190,14 +148,6 @@ NYC.prototype._readTranspiledSource = function (path) { return source } -NYC.prototype.shouldInstrumentFile = function (filename, relFile) { - // Don't instrument files that are outside of the current working directory. - if (/^\.\./.test(path.relative(this.cwd, filename))) return false - - relFile = relFile.replace(/^\.[\\\/]/, '') // remove leading './' or '.\'. - return (!this.include || micromatch.any(relFile, this.include)) && !micromatch.any(relFile, this.exclude) -} - NYC.prototype.addAllFiles = function () { var _this = this @@ -210,7 +160,7 @@ NYC.prototype.addAllFiles = function () { pattern = '**/*{' + this.extensions.join() + '}' } - glob.sync(pattern, {cwd: this.cwd, nodir: true, ignore: this.exclude}).forEach(function (filename) { + glob.sync(pattern, {cwd: this.cwd, nodir: true, ignore: this.exclude.exclude}).forEach(function (filename) { var obj = _this.addFile(path.join(_this.cwd, filename)) if (obj.instrument) { module._compile( @@ -224,7 +174,7 @@ NYC.prototype.addAllFiles = function () { } NYC.prototype._maybeInstrumentSource = function (code, filename, relFile) { - var instrument = this.shouldInstrumentFile(filename, relFile) + var instrument = this.exclude.shouldInstrument(filename, relFile) if (!instrument) { return null @@ -248,20 +198,24 @@ NYC.prototype._transformFactory = function (cacheDir) { return function (code, metadata, hash) { var filename = metadata.filename - var sourceMap = convertSourceMap.fromSource(code) || convertSourceMap.fromMapFileSource(code, path.dirname(filename)) - if (sourceMap) { - if (hash) { - var mapPath = path.join(cacheDir, hash + '.map') - fs.writeFileSync(mapPath, sourceMap.toJSON()) - } else { - _this.sourceMapCache.addMap(filename, sourceMap.toJSON()) - } - } + if (_this._sourceMap) _this._handleSourceMap(cacheDir, code, hash, filename) return instrumenter.instrumentSync(code, filename) } } +NYC.prototype._handleSourceMap = function (cacheDir, code, hash, filename) { + var sourceMap = convertSourceMap.fromSource(code) || convertSourceMap.fromMapFileSource(code, path.dirname(filename)) + if (sourceMap) { + if (hash) { + var mapPath = path.join(cacheDir, hash + '.map') + fs.writeFileSync(mapPath, sourceMap.toJSON()) + } else { + this.sourceMapCache.addMap(filename, sourceMap.toJSON()) + } + } +} + NYC.prototype._handleJs = function (code, filename) { var relFile = path.relative(this.cwd, filename) return this._maybeInstrumentSource(code, filename, relFile) || code diff --git a/lib/instrumenters/istanbul.js b/lib/instrumenters/istanbul.js new file mode 100644 index 000000000..12a22a628 --- /dev/null +++ b/lib/instrumenters/istanbul.js @@ -0,0 +1,23 @@ +var fs = require('fs') +var path = require('path') + +function InstrumenterIstanbul (cwd) { + var configFile = path.resolve(cwd, './.istanbul.yml') + + if (!fs.existsSync(configFile)) configFile = undefined + var istanbul = InstrumenterIstanbul.istanbul() + var instrumenterConfig = istanbul.config.loadFile(configFile).instrumentation.config + + return new istanbul.Instrumenter({ + coverageVariable: '__coverage__', + embedSource: instrumenterConfig['embed-source'], + noCompact: !instrumenterConfig.compact, + preserveComments: instrumenterConfig['preserve-comments'] + }) +} + +InstrumenterIstanbul.istanbul = function () { + return InstrumenterIstanbul._istanbul || (InstrumenterIstanbul._istanbul = require('istanbul')) +} + +module.exports = InstrumenterIstanbul diff --git a/lib/instrumenters/noop.js b/lib/instrumenters/noop.js new file mode 100644 index 000000000..3159e4870 --- /dev/null +++ b/lib/instrumenters/noop.js @@ -0,0 +1,9 @@ +function NOOP () { + return { + instrumentSync: function (code) { + return code + } + } +} + +module.exports = NOOP diff --git a/lib/source-map-cache.js b/lib/source-map-cache.js index 5bedd894d..fbfd8dea6 100644 --- a/lib/source-map-cache.js +++ b/lib/source-map-cache.js @@ -165,6 +165,11 @@ SourceMapCache.prototype._rewriteBranches = function (fileReport, sourceMap) { if (locations.length > 0) { b[index + ''] = fileReport.b[k] + + /* istanbul ignore next: hard to test for edge-case, + counts for more statements than exist post remapping */ + while (b[index + ''].length > locations.length) b[index + ''].pop() + branchMap[index + ''] = { line: locations[0].start.line, type: item.type, diff --git a/package.json b/package.json index fd9c08cf9..e25ed97d8 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "index.js", "bin/*.js", "lib/*.js", + "lib/instrumenters/*.js", "!**/*covered.js" ], "nyc": { @@ -85,6 +86,7 @@ "signal-exit": "^2.1.1", "source-map": "^0.5.3", "spawn-wrap": "^1.2.2", + "test-exclude": "^1.1.0", "yargs": "^4.7.0" }, "devDependencies": { @@ -131,6 +133,7 @@ "signal-exit", "source-map", "spawn-wrap", + "test-exclude", "yargs" ] } diff --git a/screen2.png b/screen2.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdd87e93ba73076a1afa77269b5537c537d8762 GIT binary patch literal 63728 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

^#(rlI*;M<1ba$g=}wm{vb=ikez?Ii-f6 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/cli/env.js b/test/fixtures/cli/env.js new file mode 100755 index 000000000..df181cbff --- /dev/null +++ b/test/fixtures/cli/env.js @@ -0,0 +1 @@ +console.log(JSON.stringify(process.env)) diff --git a/test/src/nyc-bin.js b/test/src/nyc-bin.js index 69477b943..3a16c28ca 100644 --- a/test/src/nyc-bin.js +++ b/test/src/nyc-bin.js @@ -197,4 +197,46 @@ describe('the nyc cli', function () { }) }) }) + + it('passes configuration via environment variables', function (done) { + var args = [ + bin, + '--silent', + '--require=mkdirp', + '--include=env.js', + '--exclude=batman.js', + '--extension=.js', + '--cache=true', + '--source-map=true', + '--instrumenter=./lib/instrumenters/istanbul.js', + process.execPath, + './env.js' + ] + var expected = { + NYC_REQUIRE: 'mkdirp', + NYC_INCLUDE: 'env.js', + NYC_EXCLUDE: 'batman.js', + NYC_EXTENSION: '.js', + NYC_CACHE: 'enable', + NYC_SOURCE_MAP: 'enable', + NYC_INSTRUMENTER: './lib/instrumenters/istanbul.js' + } + + var proc = spawn(process.execPath, args, { + cwd: fixturesCLI, + env: env + }) + + var stdout = '' + proc.stdout.on('data', function (chunk) { + stdout += chunk + }) + + proc.on('close', function (code) { + code.should.equal(0) + var env = JSON.parse(stdout) + env.should.include(expected) + done() + }) + }) }) diff --git a/test/src/nyc-test.js b/test/src/nyc-test.js index 5a12d8d34..b4d686e4b 100644 --- a/test/src/nyc-test.js +++ b/test/src/nyc-test.js @@ -69,7 +69,7 @@ describe('nyc', function () { cwd: path.resolve(__dirname, '../fixtures') }) - nyc.exclude.length.should.eql(5) + nyc.exclude.exclude.length.should.eql(5) }) it("loads 'extension' patterns from package.json#nyc", function () { @@ -85,14 +85,14 @@ describe('nyc', function () { cwd: path.resolve(__dirname, '../fixtures/conf-empty') }) - nyc1.include.should.equal(false) + nyc1.exclude.include.should.equal(false) var nyc2 = new NYC({ cwd: path.resolve(__dirname, '../fixtures/conf-empty'), include: [] }) - nyc2.include.should.equal(false) + nyc2.exclude.include.should.equal(false) }) it("ignores 'exclude' option if it's falsy or []", function () { @@ -100,127 +100,98 @@ describe('nyc', function () { cwd: path.resolve(__dirname, '../fixtures/conf-empty') }) - nyc1.exclude.length.should.eql(7) + nyc1.exclude.exclude.length.should.eql(7) var nyc2 = new NYC({ cwd: path.resolve(__dirname, '../fixtures/conf-empty'), exclude: [] }) - nyc2.exclude.length.should.eql(7) - }) - }) - - describe('_prepGlobPatterns', function () { - it('should adjust patterns appropriately', function () { - var _prepGlobPatterns = new NYC()._prepGlobPatterns - - var result = _prepGlobPatterns(['./foo', 'bar/**', 'baz/']) - - result.should.deep.equal([ - './foo/**', // Appended `/**` - './foo', - 'bar/**', - 'baz/**', // Removed trailing slash before appending `/**` - 'baz/' - ]) + nyc2.exclude.exclude.length.should.eql(7) }) }) describe('shouldInstrumentFile', function () { it('should exclude appropriately with defaults', function () { var nyc = new NYC({ - cwd: '/cwd/' + cwd: '/cwd/', + exclude: [ + '**/node_modules/**', + 'test/**', + 'test{,-*}.js', + '**/*.test.js', + '**/__tests__/**' + ] }) - // Root package contains config.exclude - // Restore exclude to default patterns - nyc.exclude = nyc._prepGlobPatterns([ - '**/node_modules/**', - 'test/**', - 'test{,-*}.js', - '**/*.test.js', - '**/__tests__/**' - ]) - - var shouldInstrumentFile = nyc.shouldInstrumentFile.bind(nyc) - // nyc always excludes "node_modules/**" - shouldInstrumentFile('/cwd/foo', 'foo').should.equal(true) - shouldInstrumentFile('/cwd/node_modules/bar', 'node_modules/bar').should.equal(false) - shouldInstrumentFile('/cwd/foo/node_modules/bar', 'foo/node_modules/bar').should.equal(false) - shouldInstrumentFile('/cwd/test.js', 'test.js').should.equal(false) - shouldInstrumentFile('/cwd/testfoo.js', 'testfoo.js').should.equal(true) - shouldInstrumentFile('/cwd/test-foo.js', 'test-foo.js').should.equal(false) - shouldInstrumentFile('/cwd/lib/test.js', 'lib/test.js').should.equal(true) - shouldInstrumentFile('/cwd/foo/bar/test.js', './test.js').should.equal(false) - shouldInstrumentFile('/cwd/foo/bar/test.js', '.\\test.js').should.equal(false) - shouldInstrumentFile('/cwd/foo/bar/foo.test.js', './foo.test.js').should.equal(false) - shouldInstrumentFile('/cwd/foo/bar/__tests__/foo.js', './__tests__/foo.js').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/foo', 'foo').should.equal(true) + nyc.exclude.shouldInstrument('/cwd/node_modules/bar', 'node_modules/bar').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/foo/node_modules/bar', 'foo/node_modules/bar').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/test.js', 'test.js').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/testfoo.js', 'testfoo.js').should.equal(true) + nyc.exclude.shouldInstrument('/cwd/test-foo.js', 'test-foo.js').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/lib/test.js', 'lib/test.js').should.equal(true) + nyc.exclude.shouldInstrument('/cwd/foo/bar/test.js', './test.js').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/foo/bar/test.js', '.\\test.js').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/foo/bar/foo.test.js', './foo.test.js').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/foo/bar/__tests__/foo.js', './__tests__/foo.js').should.equal(false) }) it('should exclude appropriately with config.exclude', function () { var nyc = new NYC({ cwd: fixtures }) - var shouldInstrumentFile = nyc.shouldInstrumentFile.bind(nyc) // fixtures/package.json configures excludes: "blarg", "blerg" - shouldInstrumentFile('blarg', 'blarg').should.equal(false) - shouldInstrumentFile('blarg/foo.js', 'blarg/foo.js').should.equal(false) - shouldInstrumentFile('blerg', 'blerg').should.equal(false) - shouldInstrumentFile('./blerg', './blerg').should.equal(false) - shouldInstrumentFile('./blerg', '.\\blerg').should.equal(false) + nyc.exclude.shouldInstrument('blarg', 'blarg').should.equal(false) + nyc.exclude.shouldInstrument('blarg/foo.js', 'blarg/foo.js').should.equal(false) + nyc.exclude.shouldInstrument('blerg', 'blerg').should.equal(false) + nyc.exclude.shouldInstrument('./blerg', './blerg').should.equal(false) + nyc.exclude.shouldInstrument('./blerg', '.\\blerg').should.equal(false) }) it('should exclude outside of the current working directory', function () { var nyc = new NYC({ cwd: '/cwd/foo/' }) - nyc.shouldInstrumentFile('/cwd/bar', '../bar').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/bar', '../bar').should.equal(false) }) it('should not exclude if the current working directory is inside node_modules', function () { var nyc = new NYC({ cwd: '/cwd/node_modules/foo/' }) - nyc.shouldInstrumentFile('/cwd/node_modules/foo/bar', './bar').should.equal(true) - nyc.shouldInstrumentFile('/cwd/node_modules/foo/bar', '.\\bar').should.equal(true) + nyc.exclude.shouldInstrument('/cwd/node_modules/foo/bar', './bar').should.equal(true) + nyc.exclude.shouldInstrument('/cwd/node_modules/foo/bar', '.\\bar').should.equal(true) }) it('allows files to be explicitly included, rather than excluded', function () { var nyc = new NYC({ - cwd: '/cwd/' + cwd: '/cwd/', + include: 'foo.js' }) - nyc.include = nyc._prepGlobPatterns([ - 'foo.js' - ]) - - var shouldInstrumentFile = nyc.shouldInstrumentFile.bind(nyc) - shouldInstrumentFile('/cwd/foo.js', 'foo.js').should.equal(true) - shouldInstrumentFile('/cwd/index.js', 'index.js').should.equal(false) + nyc.exclude.shouldInstrument('/cwd/foo.js', 'foo.js').should.equal(true) + nyc.exclude.shouldInstrument('/cwd/index.js', 'index.js').should.equal(false) }) it('exclude overrides include', function () { var nyc = new NYC({ - cwd: '/cwd/' - }) - - nyc.include = nyc._prepGlobPatterns([ - 'foo.js', - 'test.js' - ]) - // Ensure default exclude patterns apply, which excludes test.js - nyc.exclude = nyc._prepGlobPatterns([ - '**/node_modules/**', - 'test/**', - 'test{,-*}.js' - ]) - - var shouldInstrumentFile = nyc.shouldInstrumentFile.bind(nyc) - shouldInstrumentFile('/cwd/foo.js', 'foo.js').should.equal(true) - shouldInstrumentFile('/cwd/test.js', 'test.js').should.equal(false) + cwd: '/cwd/', + include: [ + 'foo.js', + 'test.js' + ], + exclude: [ + '**/node_modules/**', + 'test/**', + 'test{,-*}.js' + ] + }) + + nyc.exclude.shouldInstrument('/cwd/foo.js', 'foo.js').should.equal(true) + nyc.exclude.shouldInstrument('/cwd/test.js', 'test.js').should.equal(false) }) })