Spaces:
Sleeping
Sleeping
| ; | |
| const defaultExclude = require('./default-exclude.js'); | |
| const defaultExtension = require('./default-extension.js'); | |
| const nycCommands = { | |
| all: [null, 'check-coverage', 'instrument', 'merge', 'report'], | |
| testExclude: [null, 'instrument', 'report', 'check-coverage'], | |
| instrument: [null, 'instrument'], | |
| checkCoverage: [null, 'report', 'check-coverage'], | |
| report: [null, 'report'], | |
| main: [null], | |
| instrumentOnly: ['instrument'] | |
| }; | |
| const cwd = { | |
| description: 'working directory used when resolving paths', | |
| type: 'string', | |
| get default() { | |
| return process.cwd(); | |
| }, | |
| nycCommands: nycCommands.all | |
| }; | |
| const nycrcPath = { | |
| description: 'specify an explicit path to find nyc configuration', | |
| nycCommands: nycCommands.all | |
| }; | |
| const tempDir = { | |
| description: 'directory to output raw coverage information to', | |
| type: 'string', | |
| default: './.nyc_output', | |
| nycAlias: 't', | |
| nycHiddenAlias: 'temp-directory', | |
| nycCommands: [null, 'check-coverage', 'merge', 'report'] | |
| }; | |
| const testExclude = { | |
| exclude: { | |
| description: 'a list of specific files and directories that should be excluded from coverage, glob patterns are supported', | |
| type: 'array', | |
| items: { | |
| type: 'string' | |
| }, | |
| default: defaultExclude, | |
| nycCommands: nycCommands.testExclude, | |
| nycAlias: 'x' | |
| }, | |
| excludeNodeModules: { | |
| description: 'whether or not to exclude all node_module folders (i.e. **/node_modules/**) by default', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.testExclude | |
| }, | |
| include: { | |
| description: 'a list of specific files that should be covered, glob patterns are supported', | |
| type: 'array', | |
| items: { | |
| type: 'string' | |
| }, | |
| default: [], | |
| nycCommands: nycCommands.testExclude, | |
| nycAlias: 'n' | |
| }, | |
| extension: { | |
| description: 'a list of extensions that nyc should handle in addition to .js', | |
| type: 'array', | |
| items: { | |
| type: 'string' | |
| }, | |
| default: defaultExtension, | |
| nycCommands: nycCommands.testExclude, | |
| nycAlias: 'e' | |
| } | |
| }; | |
| const instrumentVisitor = { | |
| coverageVariable: { | |
| description: 'variable to store coverage', | |
| type: 'string', | |
| default: '__coverage__', | |
| nycCommands: nycCommands.instrument | |
| }, | |
| coverageGlobalScope: { | |
| description: 'scope to store the coverage variable', | |
| type: 'string', | |
| default: 'this', | |
| nycCommands: nycCommands.instrument | |
| }, | |
| coverageGlobalScopeFunc: { | |
| description: 'avoid potentially replaced `Function` when finding global scope', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| }, | |
| ignoreClassMethods: { | |
| description: 'class method names to ignore for coverage', | |
| type: 'array', | |
| items: { | |
| type: 'string' | |
| }, | |
| default: [], | |
| nycCommands: nycCommands.instrument | |
| } | |
| }; | |
| const instrumentParseGen = { | |
| autoWrap: { | |
| description: 'allow `return` statements outside of functions', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| }, | |
| esModules: { | |
| description: 'should files be treated as ES Modules', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| }, | |
| parserPlugins: { | |
| description: 'babel parser plugins to use when parsing the source', | |
| type: 'array', | |
| items: { | |
| type: 'string' | |
| }, | |
| /* Babel parser plugins are to be enabled when the feature is stage 3 and | |
| * implemented in a released version of node.js. */ | |
| default: [ | |
| 'asyncGenerators', | |
| 'bigInt', | |
| 'classProperties', | |
| 'classPrivateProperties', | |
| 'classPrivateMethods', | |
| 'dynamicImport', | |
| 'importMeta', | |
| 'numericSeparator', | |
| 'objectRestSpread', | |
| 'optionalCatchBinding', | |
| 'topLevelAwait' | |
| ], | |
| nycCommands: nycCommands.instrument | |
| }, | |
| compact: { | |
| description: 'should the output be compacted?', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| }, | |
| preserveComments: { | |
| description: 'should comments be preserved in the output?', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| }, | |
| produceSourceMap: { | |
| description: 'should source maps be produced?', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| } | |
| }; | |
| const checkCoverage = { | |
| excludeAfterRemap: { | |
| description: 'should exclude logic be performed after the source-map remaps filenames?', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.checkCoverage | |
| }, | |
| branches: { | |
| description: 'what % of branches must be covered?', | |
| type: 'number', | |
| default: 0, | |
| minimum: 0, | |
| maximum: 100, | |
| nycCommands: nycCommands.checkCoverage | |
| }, | |
| functions: { | |
| description: 'what % of functions must be covered?', | |
| type: 'number', | |
| default: 0, | |
| minimum: 0, | |
| maximum: 100, | |
| nycCommands: nycCommands.checkCoverage | |
| }, | |
| lines: { | |
| description: 'what % of lines must be covered?', | |
| type: 'number', | |
| default: 90, | |
| minimum: 0, | |
| maximum: 100, | |
| nycCommands: nycCommands.checkCoverage | |
| }, | |
| statements: { | |
| description: 'what % of statements must be covered?', | |
| type: 'number', | |
| default: 0, | |
| minimum: 0, | |
| maximum: 100, | |
| nycCommands: nycCommands.checkCoverage | |
| }, | |
| perFile: { | |
| description: 'check thresholds per file', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.checkCoverage | |
| } | |
| }; | |
| const report = { | |
| checkCoverage: { | |
| description: 'check whether coverage is within thresholds provided', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.report | |
| }, | |
| reporter: { | |
| description: 'coverage reporter(s) to use', | |
| type: 'array', | |
| items: { | |
| type: 'string' | |
| }, | |
| default: ['text'], | |
| nycCommands: nycCommands.report, | |
| nycAlias: 'r' | |
| }, | |
| reportDir: { | |
| description: 'directory to output coverage reports in', | |
| type: 'string', | |
| default: 'coverage', | |
| nycCommands: nycCommands.report | |
| }, | |
| showProcessTree: { | |
| description: 'display the tree of spawned processes', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.report | |
| }, | |
| skipEmpty: { | |
| description: 'don\'t show empty files (no lines of code) in report', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.report | |
| }, | |
| skipFull: { | |
| description: 'don\'t show files with 100% statement, branch, and function coverage', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.report | |
| } | |
| }; | |
| const nycMain = { | |
| silent: { | |
| description: 'don\'t output a report after tests finish running', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.main, | |
| nycAlias: 's' | |
| }, | |
| all: { | |
| description: 'whether or not to instrument all files of the project (not just the ones touched by your test suite)', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.main, | |
| nycAlias: 'a' | |
| }, | |
| eager: { | |
| description: 'instantiate the instrumenter at startup (see https://git.io/vMKZ9)', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.main | |
| }, | |
| cache: { | |
| description: 'cache instrumentation results for improved performance', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.main, | |
| nycAlias: 'c' | |
| }, | |
| cacheDir: { | |
| description: 'explicitly set location for instrumentation cache', | |
| type: 'string', | |
| nycCommands: nycCommands.main | |
| }, | |
| babelCache: { | |
| description: 'cache babel transpilation results for improved performance', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.main | |
| }, | |
| useSpawnWrap: { | |
| description: 'use spawn-wrap instead of setting process.env.NODE_OPTIONS', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.main | |
| }, | |
| hookRequire: { | |
| description: 'should nyc wrap require?', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.main | |
| }, | |
| hookRunInContext: { | |
| description: 'should nyc wrap vm.runInContext?', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.main | |
| }, | |
| hookRunInThisContext: { | |
| description: 'should nyc wrap vm.runInThisContext?', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.main | |
| }, | |
| clean: { | |
| description: 'should the .nyc_output folder be cleaned before executing tests', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.main | |
| } | |
| }; | |
| const instrumentOnly = { | |
| inPlace: { | |
| description: 'should nyc run the instrumentation in place?', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.instrumentOnly | |
| }, | |
| exitOnError: { | |
| description: 'should nyc exit when an instrumentation failure occurs?', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.instrumentOnly | |
| }, | |
| delete: { | |
| description: 'should the output folder be deleted before instrumenting files?', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.instrumentOnly | |
| }, | |
| completeCopy: { | |
| description: 'should nyc copy all files from input to output as well as instrumented files?', | |
| type: 'boolean', | |
| default: false, | |
| nycCommands: nycCommands.instrumentOnly | |
| } | |
| }; | |
| const nyc = { | |
| description: 'nyc configuration options', | |
| type: 'object', | |
| properties: { | |
| cwd, | |
| nycrcPath, | |
| tempDir, | |
| /* Test Exclude */ | |
| ...testExclude, | |
| /* Instrumentation settings */ | |
| ...instrumentVisitor, | |
| /* Instrumentation parser/generator settings */ | |
| ...instrumentParseGen, | |
| sourceMap: { | |
| description: 'should nyc detect and handle source maps?', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| }, | |
| require: { | |
| description: 'a list of additional modules that nyc should attempt to require in its subprocess, e.g., @babel/register, @babel/polyfill', | |
| type: 'array', | |
| items: { | |
| type: 'string' | |
| }, | |
| default: [], | |
| nycCommands: nycCommands.instrument, | |
| nycAlias: 'i' | |
| }, | |
| instrument: { | |
| description: 'should nyc handle instrumentation?', | |
| type: 'boolean', | |
| default: true, | |
| nycCommands: nycCommands.instrument | |
| }, | |
| /* Check coverage */ | |
| ...checkCoverage, | |
| /* Report options */ | |
| ...report, | |
| /* Main command options */ | |
| ...nycMain, | |
| /* Instrument command options */ | |
| ...instrumentOnly | |
| } | |
| }; | |
| const configs = { | |
| nyc, | |
| testExclude: { | |
| description: 'test-exclude options', | |
| type: 'object', | |
| properties: { | |
| cwd, | |
| ...testExclude | |
| } | |
| }, | |
| babelPluginIstanbul: { | |
| description: 'babel-plugin-istanbul options', | |
| type: 'object', | |
| properties: { | |
| cwd, | |
| ...testExclude, | |
| ...instrumentVisitor | |
| } | |
| }, | |
| instrumentVisitor: { | |
| description: 'instrument visitor options', | |
| type: 'object', | |
| properties: instrumentVisitor | |
| }, | |
| instrumenter: { | |
| description: 'stand-alone instrumenter options', | |
| type: 'object', | |
| properties: { | |
| ...instrumentVisitor, | |
| ...instrumentParseGen | |
| } | |
| } | |
| }; | |
| function defaultsReducer(defaults, [name, {default: value}]) { | |
| /* Modifying arrays in defaults is safe, does not change schema. */ | |
| if (Array.isArray(value)) { | |
| value = [...value]; | |
| } | |
| return Object.assign(defaults, {[name]: value}); | |
| } | |
| module.exports = { | |
| ...configs, | |
| defaults: Object.keys(configs).reduce( | |
| (defaults, id) => { | |
| Object.defineProperty(defaults, id, { | |
| enumerable: true, | |
| get() { | |
| /* This defers `process.cwd()` until defaults are requested. */ | |
| return Object.entries(configs[id].properties) | |
| .filter(([, info]) => 'default' in info) | |
| .reduce(defaultsReducer, {}); | |
| } | |
| }); | |
| return defaults; | |
| }, | |
| {} | |
| ) | |
| }; | |