diff options
Diffstat (limited to 'node_modules/nyc/index.js')
-rwxr-xr-x | node_modules/nyc/index.js | 573 |
1 files changed, 0 insertions, 573 deletions
diff --git a/node_modules/nyc/index.js b/node_modules/nyc/index.js deleted file mode 100755 index be11aa59b..000000000 --- a/node_modules/nyc/index.js +++ /dev/null @@ -1,573 +0,0 @@ -'use strict' - -/* global __coverage__ */ - -const arrify = require('arrify') -const cachingTransform = require('caching-transform') -const debugLog = require('debug-log')('nyc') -const findCacheDir = require('find-cache-dir') -const fs = require('fs') -const glob = require('glob') -const Hash = require('./lib/hash') -const js = require('default-require-extensions/js') -const libCoverage = require('istanbul-lib-coverage') -const libHook = require('istanbul-lib-hook') -const libReport = require('istanbul-lib-report') -const md5hex = require('md5-hex') -const mkdirp = require('mkdirp') -const Module = require('module') -const onExit = require('signal-exit') -const path = require('path') -const reports = require('istanbul-reports') -const resolveFrom = require('resolve-from') -const rimraf = require('rimraf') -const SourceMaps = require('./lib/source-maps') -const testExclude = require('test-exclude') - -var ProcessInfo -try { - ProcessInfo = require('./lib/process.covered.js') -} catch (e) { - /* istanbul ignore next */ - ProcessInfo = require('./lib/process.js') -} - -/* istanbul ignore next */ -if (/index\.covered\.js$/.test(__filename)) { - require('./lib/self-coverage-helper') -} - -function NYC (config) { - config = config || {} - this.config = config - - 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 || 'coverage' - this._sourceMap = typeof config.sourceMap === 'boolean' ? config.sourceMap : true - this._showProcessTree = config.showProcessTree || false - this._eagerInstantiation = config.eager || false - this.cwd = config.cwd || process.cwd() - this.reporter = arrify(config.reporter || 'text') - - this.cacheDirectory = (config.cacheDir && path.resolve(config.cacheDir)) || findCacheDir({name: 'nyc', cwd: this.cwd}) - this.cache = Boolean(this.cacheDirectory && config.cache) - - this.exclude = testExclude({ - cwd: this.cwd, - include: config.include, - exclude: config.exclude - }) - - this.sourceMaps = new SourceMaps({ - cache: this.cache, - cacheDirectory: this.cacheDirectory - }) - - // require extensions can be provided as config in package.json. - this.require = arrify(config.require) - - this.extensions = arrify(config.extension).concat('.js').map(function (ext) { - return ext.toLowerCase() - }).filter(function (item, pos, arr) { - // avoid duplicate extensions - return arr.indexOf(item) === pos - }) - - this.transforms = this.extensions.reduce(function (transforms, ext) { - transforms[ext] = this._createTransform(ext) - return transforms - }.bind(this), {}) - - this.hookRunInContext = config.hookRunInContext - this.hookRunInThisContext = config.hookRunInThisContext - this.fakeRequire = null - - this.processInfo = new ProcessInfo(config && config._processInfo) - this.rootId = this.processInfo.root || this.generateUniqueID() - - this.hashCache = {} -} - -NYC.prototype._createTransform = function (ext) { - var _this = this - var opts = { - salt: Hash.salt, - hash: function (code, metadata, salt) { - var hash = Hash(code, metadata.filename) - _this.hashCache[metadata.filename] = hash - return hash - }, - cacheDir: this.cacheDirectory, - // when running --all we should not load source-file from - // cache, we want to instead return the fake source. - disableCache: this._disableCachingTransform(), - ext: ext - } - if (this._eagerInstantiation) { - opts.transform = this._transformFactory(this.cacheDirectory) - } else { - opts.factory = this._transformFactory.bind(this) - } - return cachingTransform(opts) -} - -NYC.prototype._disableCachingTransform = function () { - return !(this.cache && this.config.isChildProcess) -} - -NYC.prototype._loadAdditionalModules = function () { - var _this = this - this.require.forEach(function (r) { - // first attempt to require the module relative to - // the directory being instrumented. - var p = resolveFrom(_this.cwd, r) - if (p) { - require(p) - return - } - // now try other locations, .e.g, the nyc node_modules folder. - require(r) - }) -} - -NYC.prototype.instrumenter = function () { - return this._instrumenter || (this._instrumenter = this._createInstrumenter()) -} - -NYC.prototype._createInstrumenter = function () { - return this._instrumenterLib(this.cwd, { - ignoreClassMethods: [].concat(this.config.ignoreClassMethod).filter(a => a), - produceSourceMap: this.config.produceSourceMap, - compact: this.config.compact, - preserveComments: this.config.preserveComments - }) -} - -NYC.prototype.addFile = function (filename) { - var relFile = path.relative(this.cwd, filename) - var source = this._readTranspiledSource(path.resolve(this.cwd, filename)) - var instrumentedSource = this._maybeInstrumentSource(source, filename, relFile) - - return { - instrument: !!instrumentedSource, - relFile: relFile, - content: instrumentedSource || source - } -} - -NYC.prototype._readTranspiledSource = function (filePath) { - var source = null - var ext = path.extname(filePath) - if (typeof Module._extensions[ext] === 'undefined') { - ext = '.js' - } - Module._extensions[ext]({ - _compile: function (content, filename) { - source = content - } - }, filePath) - return source -} - -NYC.prototype.addAllFiles = function () { - var _this = this - - this._loadAdditionalModules() - - this.fakeRequire = true - this.walkAllFiles(this.cwd, function (filename) { - filename = path.resolve(_this.cwd, filename) - _this.addFile(filename) - var coverage = coverageFinder() - var lastCoverage = _this.instrumenter().lastFileCoverage() - if (lastCoverage) { - filename = lastCoverage.path - } - if (lastCoverage && _this.exclude.shouldInstrument(filename)) { - coverage[filename] = lastCoverage - } - }) - this.fakeRequire = false - - this.writeCoverageFile() -} - -NYC.prototype.instrumentAllFiles = function (input, output, cb) { - var _this = this - var inputDir = '.' + path.sep - var visitor = function (filename) { - var ext - var transform - var inFile = path.resolve(inputDir, filename) - var code = fs.readFileSync(inFile, 'utf-8') - - for (ext in _this.transforms) { - if (filename.toLowerCase().substr(-ext.length) === ext) { - transform = _this.transforms[ext] - break - } - } - - if (transform) { - code = transform(code, {filename: filename, relFile: inFile}) - } - - if (!output) { - console.log(code) - } else { - var outFile = path.resolve(output, filename) - mkdirp.sync(path.dirname(outFile)) - fs.writeFileSync(outFile, code, 'utf-8') - } - } - - this._loadAdditionalModules() - - try { - var stats = fs.lstatSync(input) - if (stats.isDirectory()) { - inputDir = input - this.walkAllFiles(input, visitor) - } else { - visitor(input) - } - } catch (err) { - return cb(err) - } - cb() -} - -NYC.prototype.walkAllFiles = function (dir, visitor) { - var pattern = null - if (this.extensions.length === 1) { - pattern = '**/*' + this.extensions[0] - } else { - pattern = '**/*{' + this.extensions.join() + '}' - } - - glob.sync(pattern, {cwd: dir, nodir: true, ignore: this.exclude.exclude}).forEach(function (filename) { - visitor(filename) - }) -} - -NYC.prototype._maybeInstrumentSource = function (code, filename, relFile) { - var instrument = this.exclude.shouldInstrument(filename, relFile) - if (!instrument) { - return null - } - - var ext, transform - for (ext in this.transforms) { - if (filename.toLowerCase().substr(-ext.length) === ext) { - transform = this.transforms[ext] - break - } - } - - return transform ? transform(code, {filename: filename, relFile: relFile}) : null -} - -NYC.prototype._transformFactory = function (cacheDir) { - const instrumenter = this.instrumenter() - let instrumented - - return (code, metadata, hash) => { - const filename = metadata.filename - let sourceMap = null - - if (this._sourceMap) sourceMap = this.sourceMaps.extractAndRegister(code, filename, hash) - - try { - instrumented = instrumenter.instrumentSync(code, filename, sourceMap) - } catch (e) { - debugLog('failed to instrument ' + filename + 'with error: ' + e.stack) - if (this.config.exitOnError) { - process.exit(1) - } else { - instrumented = code - } - } - - if (this.fakeRequire) { - return 'function x () {}' - } else { - return instrumented - } - } -} - -NYC.prototype._handleJs = function (code, filename) { - var relFile = path.relative(this.cwd, filename) - // ensure the path has correct casing (see istanbuljs/nyc#269 and nodejs/node#6624) - filename = path.resolve(this.cwd, relFile) - return this._maybeInstrumentSource(code, filename, relFile) || code -} - -NYC.prototype._addHook = function (type) { - var handleJs = this._handleJs.bind(this) - var dummyMatcher = function () { return true } // we do all processing in transformer - libHook['hook' + type](dummyMatcher, handleJs, { extensions: this.extensions }) -} - -NYC.prototype._wrapRequire = function () { - this.extensions.forEach(function (ext) { - require.extensions[ext] = js - }) - this._addHook('Require') -} - -NYC.prototype._addOtherHooks = function () { - if (this.hookRunInContext) { - this._addHook('RunInContext') - } - if (this.hookRunInThisContext) { - this._addHook('RunInThisContext') - } -} - -NYC.prototype.cleanup = function () { - if (!process.env.NYC_CWD) rimraf.sync(this.tempDirectory()) -} - -NYC.prototype.clearCache = function () { - if (this.cache) { - rimraf.sync(this.cacheDirectory) - } -} - -NYC.prototype.createTempDirectory = function () { - mkdirp.sync(this.tempDirectory()) - if (this.cache) mkdirp.sync(this.cacheDirectory) - - if (this._showProcessTree) { - mkdirp.sync(this.processInfoDirectory()) - } -} - -NYC.prototype.reset = function () { - this.cleanup() - this.createTempDirectory() -} - -NYC.prototype._wrapExit = function () { - var _this = this - - // we always want to write coverage - // regardless of how the process exits. - onExit(function () { - _this.writeCoverageFile() - }, {alwaysLast: true}) -} - -NYC.prototype.wrap = function (bin) { - this._wrapRequire() - this._addOtherHooks() - this._wrapExit() - this._loadAdditionalModules() - return this -} - -NYC.prototype.generateUniqueID = function () { - return md5hex( - process.hrtime().concat(process.pid).map(String) - ) -} - -NYC.prototype.writeCoverageFile = function () { - var coverage = coverageFinder() - if (!coverage) return - - // Remove any files that should be excluded but snuck into the coverage - Object.keys(coverage).forEach(function (absFile) { - if (!this.exclude.shouldInstrument(absFile)) { - delete coverage[absFile] - } - }, this) - - if (this.cache) { - Object.keys(coverage).forEach(function (absFile) { - if (this.hashCache[absFile] && coverage[absFile]) { - coverage[absFile].contentHash = this.hashCache[absFile] - } - }, this) - } else { - coverage = this.sourceMaps.remapCoverage(coverage) - } - - var id = this.generateUniqueID() - var coverageFilename = path.resolve(this.tempDirectory(), id + '.json') - - fs.writeFileSync( - coverageFilename, - JSON.stringify(coverage), - 'utf-8' - ) - - if (!this._showProcessTree) { - return - } - - this.processInfo.coverageFilename = coverageFilename - - fs.writeFileSync( - path.resolve(this.processInfoDirectory(), id + '.json'), - JSON.stringify(this.processInfo), - 'utf-8' - ) -} - -function coverageFinder () { - var coverage = global.__coverage__ - if (typeof __coverage__ === 'object') coverage = __coverage__ - if (!coverage) coverage = global['__coverage__'] = {} - return coverage -} - -NYC.prototype.getCoverageMapFromAllCoverageFiles = function (baseDirectory) { - var _this = this - var map = libCoverage.createCoverageMap({}) - - this.eachReport(undefined, (report) => { - map.merge(report) - }, baseDirectory) - // depending on whether source-code is pre-instrumented - // or instrumented using a JIT plugin like babel-require - // you may opt to exclude files after applying - // source-map remapping logic. - if (this.config.excludeAfterRemap) { - map.filter(function (filename) { - return _this.exclude.shouldInstrument(filename) - }) - } - map.data = this.sourceMaps.remapCoverage(map.data) - return map -} - -NYC.prototype.report = function () { - var tree - var map = this.getCoverageMapFromAllCoverageFiles() - var context = libReport.createContext({ - dir: this.reportDirectory(), - watermarks: this.config.watermarks - }) - - tree = libReport.summarizers.pkg(map) - - this.reporter.forEach((_reporter) => { - tree.visit(reports.create(_reporter, { - skipEmpty: this.config.skipEmpty - }), context) - }) - - if (this._showProcessTree) { - this.showProcessTree() - } -} - -NYC.prototype.showProcessTree = function () { - var processTree = ProcessInfo.buildProcessTree(this._loadProcessInfos()) - - console.log(processTree.render(this)) -} - -NYC.prototype.checkCoverage = function (thresholds, perFile) { - var map = this.getCoverageMapFromAllCoverageFiles() - var nyc = this - - if (perFile) { - map.files().forEach(function (file) { - // ERROR: Coverage for lines (90.12%) does not meet threshold (120%) for index.js - nyc._checkCoverage(map.fileCoverageFor(file).toSummary(), thresholds, file) - }) - } else { - // ERROR: Coverage for lines (90.12%) does not meet global threshold (120%) - nyc._checkCoverage(map.getCoverageSummary(), thresholds) - } - - // process.exitCode was not implemented until v0.11.8. - if (/^v0\.(1[0-1]\.|[0-9]\.)/.test(process.version) && process.exitCode !== 0) process.exit(process.exitCode) -} - -NYC.prototype._checkCoverage = function (summary, thresholds, file) { - Object.keys(thresholds).forEach(function (key) { - var coverage = summary[key].pct - if (coverage < thresholds[key]) { - process.exitCode = 1 - if (file) { - console.error('ERROR: Coverage for ' + key + ' (' + coverage + '%) does not meet threshold (' + thresholds[key] + '%) for ' + file) - } else { - console.error('ERROR: Coverage for ' + key + ' (' + coverage + '%) does not meet global threshold (' + thresholds[key] + '%)') - } - } - }) -} - -NYC.prototype._loadProcessInfos = function () { - var _this = this - var files = fs.readdirSync(this.processInfoDirectory()) - - return files.map(function (f) { - try { - return new ProcessInfo(JSON.parse(fs.readFileSync( - path.resolve(_this.processInfoDirectory(), f), - 'utf-8' - ))) - } catch (e) { // handle corrupt JSON output. - return {} - } - }) -} - -NYC.prototype.eachReport = function (filenames, iterator, baseDirectory) { - baseDirectory = baseDirectory || this.tempDirectory() - - if (typeof filenames === 'function') { - iterator = filenames - filenames = undefined - } - - var _this = this - var files = filenames || fs.readdirSync(baseDirectory) - - files.forEach(function (f) { - var report - try { - report = JSON.parse(fs.readFileSync( - path.resolve(baseDirectory, f), - 'utf-8' - )) - - _this.sourceMaps.reloadCachedSourceMaps(report) - } catch (e) { // handle corrupt JSON output. - report = {} - } - - iterator(report) - }) -} - -NYC.prototype.loadReports = function (filenames) { - var reports = [] - - this.eachReport(filenames, (report) => { - reports.push(report) - }) - - return reports -} - -NYC.prototype.tempDirectory = function () { - return path.resolve(this.cwd, this._tempDirectory) -} - -NYC.prototype.reportDirectory = function () { - return path.resolve(this.cwd, this._reportDir) -} - -NYC.prototype.processInfoDirectory = function () { - return path.resolve(this.tempDirectory(), 'processinfo') -} - -module.exports = NYC |