119 lines
3.4 KiB
JavaScript
119 lines
3.4 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
'use strict'
|
||
|
|
||
|
const configUtil = require('../lib/config-util')
|
||
|
const { cliWrapper, suppressEPIPE } = require('../lib/commands/helpers')
|
||
|
const foreground = require('foreground-child')
|
||
|
const resolveFrom = require('resolve-from')
|
||
|
const NYC = require('../index.js')
|
||
|
|
||
|
// parse configuration and command-line arguments;
|
||
|
// we keep these values in a few different forms,
|
||
|
// used in the various execution contexts of nyc:
|
||
|
// reporting, instrumenting subprocesses, etc.
|
||
|
|
||
|
async function main () {
|
||
|
const { argv, childArgs, yargs } = await configUtil()
|
||
|
|
||
|
if (['check-coverage', 'report', 'instrument', 'merge'].includes(argv._[0])) {
|
||
|
// look in lib/commands for logic.
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if (argv._.length === 0) {
|
||
|
// I don't have a clue what you're doing.
|
||
|
process.exitCode = 1
|
||
|
yargs.showHelp()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// if instrument is set to false,
|
||
|
// enable a noop instrumenter.
|
||
|
if (!argv.instrument) argv.instrumenter = './lib/instrumenters/noop'
|
||
|
else argv.instrumenter = './lib/instrumenters/istanbul'
|
||
|
|
||
|
var nyc = (new NYC(argv))
|
||
|
if (argv.clean) {
|
||
|
await nyc.reset()
|
||
|
} else {
|
||
|
await nyc.createTempDirectory()
|
||
|
}
|
||
|
|
||
|
const env = {
|
||
|
NYC_CONFIG: JSON.stringify(argv),
|
||
|
NYC_CWD: process.cwd()
|
||
|
}
|
||
|
|
||
|
/* istanbul ignore else */
|
||
|
if (argv['babel-cache'] === false) {
|
||
|
// babel's cache interferes with some configurations, so is
|
||
|
// disabled by default. opt in by setting babel-cache=true.
|
||
|
env.BABEL_DISABLE_CACHE = process.env.BABEL_DISABLE_CACHE = '1'
|
||
|
}
|
||
|
|
||
|
if (!argv.useSpawnWrap) {
|
||
|
const requireModules = [
|
||
|
require.resolve('../lib/register-env.js'),
|
||
|
...nyc.require.map(mod => resolveFrom.silent(nyc.cwd, mod) || mod)
|
||
|
]
|
||
|
const preloadList = require('node-preload')
|
||
|
preloadList.push(
|
||
|
...requireModules,
|
||
|
require.resolve('../lib/wrap.js')
|
||
|
)
|
||
|
|
||
|
Object.assign(process.env, env)
|
||
|
requireModules.forEach(mod => {
|
||
|
require(mod)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
if (argv.all) {
|
||
|
await nyc.addAllFiles()
|
||
|
}
|
||
|
|
||
|
if (argv.useSpawnWrap) {
|
||
|
const wrapper = require.resolve('./wrap.js')
|
||
|
// Support running nyc as a user without HOME (e.g. linux 'nobody'),
|
||
|
// https://github.com/istanbuljs/nyc/issues/951
|
||
|
env.SPAWN_WRAP_SHIM_ROOT = process.env.SPAWN_WRAP_SHIM_ROOT || process.env.XDG_CACHE_HOME || require('os').homedir()
|
||
|
const sw = require('spawn-wrap')
|
||
|
|
||
|
sw([wrapper], env)
|
||
|
}
|
||
|
|
||
|
// Both running the test script invocation and the check-coverage run may
|
||
|
// set process.exitCode. Keep track so that both children are run, but
|
||
|
// a non-zero exit codes in either one leads to an overall non-zero exit code.
|
||
|
process.exitCode = 0
|
||
|
foreground(childArgs, async () => {
|
||
|
const mainChildExitCode = process.exitCode
|
||
|
|
||
|
try {
|
||
|
await nyc.writeProcessIndex()
|
||
|
|
||
|
nyc.maybePurgeSourceMapCache()
|
||
|
if (argv.checkCoverage) {
|
||
|
await nyc.checkCoverage({
|
||
|
lines: argv.lines,
|
||
|
functions: argv.functions,
|
||
|
branches: argv.branches,
|
||
|
statements: argv.statements
|
||
|
}, argv['per-file']).catch(suppressEPIPE)
|
||
|
process.exitCode = process.exitCode || mainChildExitCode
|
||
|
}
|
||
|
|
||
|
if (!argv.silent) {
|
||
|
await nyc.report().catch(suppressEPIPE)
|
||
|
}
|
||
|
} catch (error) {
|
||
|
/* istanbul ignore next */
|
||
|
process.exitCode = process.exitCode || mainChildExitCode || 1
|
||
|
/* istanbul ignore next */
|
||
|
console.error(error.message)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
cliWrapper(main)()
|