123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #!/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)()
|