123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- const defaultExclude = require('@istanbuljs/schema/default-exclude')
- const defaultExtension = require('@istanbuljs/schema/default-extension')
- const findUp = require('find-up')
- const { readFileSync } = require('fs')
- const Yargs = require('yargs/yargs')
- const { applyExtends } = require('yargs/helpers')
- const parser = require('yargs-parser')
- const { resolve } = require('path')
- function buildYargs (withCommands = false) {
- const yargs = Yargs([])
- .usage('$0 [opts] [script] [opts]')
- .options('config', {
- alias: 'c',
- config: true,
- describe: 'path to JSON configuration file',
- configParser: (path) => {
- const config = JSON.parse(readFileSync(path))
- return applyExtends(config, process.cwd(), true)
- },
- default: () => findUp.sync(['.c8rc', '.c8rc.json', '.nycrc', '.nycrc.json'])
- })
- .option('reporter', {
- alias: 'r',
- group: 'Reporting options',
- describe: 'coverage reporter(s) to use',
- default: 'text'
- })
- .option('reports-dir', {
- alias: ['o', 'report-dir'],
- group: 'Reporting options',
- describe: 'directory where coverage reports will be output to',
- default: './coverage'
- })
- .options('all', {
- default: false,
- type: 'boolean',
- group: 'Reporting options',
- describe: 'supplying --all will cause c8 to consider all src files in the current working directory ' +
- 'when the determining coverage. Respects include/exclude.'
- })
- .options('src', {
- default: undefined,
- type: 'string',
- group: 'Reporting options',
- describe: 'supplying --src will override cwd as the default location where --all looks for src files. --src can be ' +
- 'supplied multiple times and each directory will be included. This allows for workspaces spanning multiple projects'
- })
- .option('exclude-node-modules', {
- default: true,
- type: 'boolean',
- describe: 'whether or not to exclude all node_module folders (i.e. **/node_modules/**) by default'
- })
- .option('include', {
- alias: 'n',
- default: [],
- group: 'Reporting options',
- describe: 'a list of specific files that should be covered (glob patterns are supported)'
- })
- .option('exclude', {
- alias: 'x',
- default: defaultExclude,
- group: 'Reporting options',
- describe: 'a list of specific files and directories that should be excluded from coverage (glob patterns are supported)'
- })
- .option('extension', {
- alias: 'e',
- default: defaultExtension,
- group: 'Reporting options',
- describe: 'a list of specific file extensions that should be covered'
- })
- .option('exclude-after-remap', {
- alias: 'a',
- type: 'boolean',
- default: false,
- group: 'Reporting options',
- describe: 'apply exclude logic to files after they are remapped by a source-map'
- })
- .options('skip-full', {
- default: false,
- type: 'boolean',
- group: 'Reporting options',
- describe: 'do not show files with 100% statement, branch, and function coverage'
- })
- .option('check-coverage', {
- default: false,
- type: 'boolean',
- group: 'Coverage thresholds',
- description: 'check whether coverage is within thresholds provided'
- })
- .option('branches', {
- default: 0,
- group: 'Coverage thresholds',
- description: 'what % of branches must be covered?',
- type: 'number'
- })
- .option('functions', {
- default: 0,
- group: 'Coverage thresholds',
- description: 'what % of functions must be covered?',
- type: 'number'
- })
- .option('lines', {
- default: 90,
- group: 'Coverage thresholds',
- description: 'what % of lines must be covered?',
- type: 'number'
- })
- .option('statements', {
- default: 0,
- group: 'Coverage thresholds',
- description: 'what % of statements must be covered?',
- type: 'number'
- })
- .option('per-file', {
- default: false,
- group: 'Coverage thresholds',
- description: 'check thresholds per file',
- type: 'boolean'
- })
- .option('100', {
- default: false,
- group: 'Coverage thresholds',
- description: 'shortcut for --check-coverage --lines 100 --functions 100 --branches 100 --statements 100',
- type: 'boolean'
- })
- .option('temp-directory', {
- describe: 'directory V8 coverage data is written to and read from',
- default: process.env.NODE_V8_COVERAGE
- })
- .option('clean', {
- default: true,
- type: 'boolean',
- describe: 'should temp files be deleted before script execution'
- })
- .option('resolve', {
- default: '',
- describe: 'resolve paths to alternate base directory'
- })
- .option('wrapper-length', {
- describe: 'how many bytes is the wrapper prefix on executed JavaScript',
- type: 'number'
- })
- .option('omit-relative', {
- default: true,
- type: 'boolean',
- describe: 'omit any paths that are not absolute, e.g., internal/net.js'
- })
- .options('allowExternal', {
- default: false,
- type: 'boolean',
- describe: 'supplying --allowExternal will cause c8 to allow files from outside of your cwd. This applies both to ' +
- 'files discovered in coverage temp files and also src files discovered if using the --all flag.'
- })
- .options('merge-async', {
- default: false,
- type: 'boolean',
- describe: 'supplying --merge-async will merge all v8 coverage reports asynchronously and incrementally. ' +
- 'This is to avoid OOM issues with Node.js runtime.'
- })
- .pkgConf('c8')
- .demandCommand(1)
- .check((argv) => {
- if (!argv.tempDirectory) {
- argv.tempDirectory = resolve(argv.reportsDir, 'tmp')
- }
- return true
- })
- .epilog('visit https://git.io/vHysA for list of available reporters')
- // TODO: enable once yargs upgraded to v17: https://github.com/bcoe/c8/pull/332#discussion_r721636191
- // yargs.middleware((argv) => {
- // if (!argv['100']) return argv
- // return {
- // ...argv,
- // branches: 100,
- // functions: 100,
- // lines: 100,
- // statements: 100,
- // }
- // })
- const checkCoverage = require('./commands/check-coverage')
- const report = require('./commands/report')
- if (withCommands) {
- yargs.command(checkCoverage)
- yargs.command(report)
- } else {
- yargs.command(checkCoverage.command, checkCoverage.describe)
- yargs.command(report.command, report.describe)
- }
- return yargs
- }
- function hideInstrumenterArgs (yargv) {
- let argv = process.argv.slice(1)
- argv = argv.slice(argv.indexOf(yargv._[0]))
- if (argv[0][0] === '-') {
- argv.unshift(process.execPath)
- }
- return argv
- }
- function hideInstrumenteeArgs () {
- let argv = process.argv.slice(2)
- const yargv = parser(argv)
- if (!yargv._.length) return argv
- // drop all the arguments after the bin being
- // instrumented by c8.
- argv = argv.slice(0, argv.indexOf(yargv._[0]))
- argv.push(yargv._[0])
- return argv
- }
- module.exports = {
- buildYargs,
- hideInstrumenterArgs,
- hideInstrumenteeArgs
- }
|