123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- 'use strict'
- const arrify = require('arrify')
- const fs = require('fs')
- const path = require('path')
- const findUp = require('find-up')
- const testExclude = require('test-exclude')
- const Yargs = require('yargs/yargs')
- var Config = {}
- function guessCWD (cwd) {
- cwd = cwd || process.env.NYC_CWD || process.cwd()
- const pkgPath = findUp.sync('package.json', {cwd: cwd})
- if (pkgPath) {
- cwd = path.dirname(pkgPath)
- }
- return cwd
- }
- Config.loadConfig = function (argv, cwd) {
- const rcPath = findUp.sync([argv.nycrcPath || '.nycrc', '.nycrc.json'], {cwd: guessCWD(cwd)})
- let config = {}
- if (rcPath) {
- config = JSON.parse(
- fs.readFileSync(rcPath, 'utf-8')
- )
- }
- if (config.require) config.require = arrify(config.require)
- if (config.extension) config.extension = arrify(config.extension)
- if (config.exclude) config.exclude = arrify(config.exclude)
- if (config.include) config.include = arrify(config.include)
- return config
- }
- // build a yargs object, omitting any settings
- // that would cause the application to exit early.
- Config.buildYargs = function (cwd) {
- cwd = guessCWD(cwd)
- return Yargs([])
- .usage('$0 [command] [options]')
- .usage('$0 [options] [bin-to-instrument]')
- .option('reporter', {
- alias: 'r',
- describe: 'coverage reporter(s) to use',
- default: 'text',
- global: false
- })
- .option('report-dir', {
- describe: 'directory to output coverage reports in',
- default: 'coverage',
- global: false
- })
- .option('silent', {
- alias: 's',
- default: false,
- type: 'boolean',
- describe: "don't output a report after tests finish running",
- global: false
- })
- .option('all', {
- alias: 'a',
- default: false,
- type: 'boolean',
- describe: 'whether or not to instrument all files of the project (not just the ones touched by your test suite)',
- global: false
- })
- .option('exclude', {
- alias: 'x',
- default: testExclude.defaultExclude,
- describe: 'a list of specific files and directories that should be excluded from coverage, glob patterns are supported, node_modules is always excluded',
- global: false
- })
- .option('exclude-after-remap', {
- default: true,
- type: 'boolean',
- description: 'should exclude logic be performed after the source-map remaps filenames?',
- global: false
- })
- .option('include', {
- alias: 'n',
- default: [],
- describe: 'a list of specific files that should be covered, glob patterns are supported',
- global: false
- })
- .option('cwd', {
- describe: 'working directory used when resolving paths',
- default: cwd
- })
- .option('require', {
- alias: 'i',
- default: [],
- describe: 'a list of additional modules that nyc should attempt to require in its subprocess, e.g., babel-register, babel-polyfill',
- global: false
- })
- .option('eager', {
- default: false,
- type: 'boolean',
- describe: 'instantiate the instrumenter at startup (see https://git.io/vMKZ9)',
- global: false
- })
- .option('cache', {
- alias: 'c',
- default: true,
- type: 'boolean',
- describe: 'cache instrumentation results for improved performance',
- global: false
- })
- .option('babel-cache', {
- default: false,
- type: 'boolean',
- describe: 'cache babel transpilation results for improved performance',
- global: false
- })
- .option('extension', {
- alias: 'e',
- default: [],
- describe: 'a list of extensions that nyc should handle in addition to .js',
- global: false
- })
- .option('check-coverage', {
- type: 'boolean',
- default: false,
- describe: 'check whether coverage is within thresholds provided',
- global: false
- })
- .option('branches', {
- default: 0,
- description: 'what % of branches must be covered?',
- global: false
- })
- .option('functions', {
- default: 0,
- description: 'what % of functions must be covered?',
- global: false
- })
- .option('lines', {
- default: 90,
- description: 'what % of lines must be covered?',
- global: false
- })
- .option('statements', {
- default: 0,
- description: 'what % of statements must be covered?',
- global: false
- })
- .option('source-map', {
- default: true,
- type: 'boolean',
- description: 'should nyc detect and handle source maps?',
- global: false
- })
- .option('per-file', {
- default: false,
- type: 'boolean',
- description: 'check thresholds per file',
- global: false
- })
- .option('produce-source-map', {
- default: false,
- type: 'boolean',
- description: "should nyc's instrumenter produce source maps?",
- global: false
- })
- .option('compact', {
- default: true,
- type: 'boolean',
- description: 'should the output be compacted?'
- })
- .option('preserve-comments', {
- default: true,
- type: 'boolean',
- description: 'should comments be preserved in the output?'
- })
- .option('instrument', {
- default: true,
- type: 'boolean',
- description: 'should nyc handle instrumentation?',
- global: false
- })
- .option('hook-run-in-context', {
- default: true,
- type: 'boolean',
- description: 'should nyc wrap vm.runInContext?',
- global: false
- })
- .option('hook-run-in-this-context', {
- default: true,
- type: 'boolean',
- description: 'should nyc wrap vm.runInThisContext?',
- global: false
- })
- .option('show-process-tree', {
- describe: 'display the tree of spawned processes',
- default: false,
- type: 'boolean',
- global: false
- })
- .option('clean', {
- describe: 'should the .nyc_output folder be cleaned before executing tests',
- default: true,
- type: 'boolean',
- global: false
- })
- .option('nycrc-path', {
- default: '.nycrc',
- description: 'specify a different .nycrc path',
- global: false
- })
- .option('temp-directory', {
- describe: 'directory to output raw coverage information to',
- default: './.nyc_output',
- global: false
- })
- .option('skip-empty', {
- describe: 'don\'t show empty files (no lines of code) in report',
- default: false,
- type: 'boolean',
- global: false
- })
- .pkgConf('nyc', cwd)
- .example('$0 npm test', 'instrument your tests with coverage')
- .example('$0 --require babel-core/register npm test', 'instrument your tests with coverage and transpile with Babel')
- .example('$0 report --reporter=text-lcov', 'output lcov report after running your tests')
- .epilog('visit https://git.io/vHysA for list of available reporters')
- .boolean('h')
- .boolean('version')
- .help(false)
- .version(false)
- }
- // we add operations that would make yargs
- // exit post-hoc, allowing for a multi-pass
- // parsing step.
- Config.addCommandsAndHelp = function (yargs) {
- return yargs
- .help('h')
- .alias('h', 'help')
- .version()
- .command(require('../lib/commands/check-coverage'))
- .command(require('../lib/commands/instrument'))
- .command(require('../lib/commands/report'))
- .command(require('../lib/commands/merge'))
- }
- module.exports = Config
|