diff --git a/lib/parse-args.js b/lib/parse-args.js index 21a9cd7a8..acf3bc387 100644 --- a/lib/parse-args.js +++ b/lib/parse-args.js @@ -30,7 +30,8 @@ function buildYargs (withCommands = false) { alias: ['o', 'report-dir'], group: 'Reporting options', describe: 'directory where coverage reports will be output to', - default: './coverage' + default: './coverage', + type: 'string' }) .options('all', { default: false, @@ -126,7 +127,8 @@ function buildYargs (withCommands = false) { }) .option('temp-directory', { describe: 'directory V8 coverage data is written to and read from', - default: process.env.NODE_V8_COVERAGE + default: process.env.NODE_V8_COVERAGE, + type: 'string' }) .option('clean', { default: true, @@ -160,6 +162,7 @@ function buildYargs (withCommands = false) { }) .pkgConf('c8') .demandCommand(1) + // Todo: These next 6 lines are not getting covered .check((argv) => { if (!argv.tempDirectory) { argv.tempDirectory = resolve(argv.reportsDir, 'tmp') @@ -197,9 +200,11 @@ function buildYargs (withCommands = false) { 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 } @@ -207,12 +212,12 @@ 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]) + if (yargv._.length !== 0) { + // 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 } diff --git a/test/integration.js.snap b/test/integration.js.snap index a9279c7e8..31da6914e 100644 --- a/test/integration.js.snap +++ b/test/integration.js.snap @@ -156,7 +156,7 @@ hey ---------------------------------------|---------|----------|---------|---------|------------------------ File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ---------------------------------------|---------|----------|---------|---------|------------------------ -All files | 3.52 | 12.5 | 6.52 | 3.52 | +All files | 3.51 | 12.5 | 6.52 | 3.51 | c8 | 0 | 0 | 0 | 0 | index.js | 0 | 0 | 0 | 0 | 1 c8/bin | 0 | 0 | 0 | 0 | @@ -166,7 +166,7 @@ All files | 3.52 | 12.5 | 6.52 | 3.52 prettify.js | 0 | 0 | 0 | 0 | 1-2 sorter.js | 0 | 0 | 0 | 0 | 1-196 c8/lib | 0 | 0 | 0 | 0 | - parse-args.js | 0 | 0 | 0 | 0 | 1-224 + parse-args.js | 0 | 0 | 0 | 0 | 1-229 report.js | 0 | 0 | 0 | 0 | 1-402 source-map-from-file.js | 0 | 0 | 0 | 0 | 1-100 c8/lib/commands | 0 | 0 | 0 | 0 | @@ -521,7 +521,7 @@ hey ---------------------------------------|---------|----------|---------|---------|------------------------ File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ---------------------------------------|---------|----------|---------|---------|------------------------ -All files | 3.52 | 12.5 | 6.52 | 3.52 | +All files | 3.51 | 12.5 | 6.52 | 3.51 | c8 | 0 | 0 | 0 | 0 | index.js | 0 | 0 | 0 | 0 | 1 c8/bin | 0 | 0 | 0 | 0 | @@ -531,7 +531,7 @@ All files | 3.52 | 12.5 | 6.52 | 3.52 prettify.js | 0 | 0 | 0 | 0 | 1-2 sorter.js | 0 | 0 | 0 | 0 | 1-196 c8/lib | 0 | 0 | 0 | 0 | - parse-args.js | 0 | 0 | 0 | 0 | 1-224 + parse-args.js | 0 | 0 | 0 | 0 | 1-229 report.js | 0 | 0 | 0 | 0 | 1-402 source-map-from-file.js | 0 | 0 | 0 | 0 | 1-100 c8/lib/commands | 0 | 0 | 0 | 0 | diff --git a/test/parse-args.js b/test/parse-args.js index 004c72413..28edba2db 100644 --- a/test/parse-args.js +++ b/test/parse-args.js @@ -15,6 +15,11 @@ describe('parse-args', () => { const instrumenterArgs = hideInstrumenteeArgs() instrumenterArgs.should.eql(['--foo=99', 'my-app']) }) + it('test early exit from function if no arguments are passed', () => { + process.argv = [] + const instrumenterArgs = hideInstrumenteeArgs() + instrumenterArgs.length.should.eql(0) + }) }) describe('hideInstrumenterArgs', () => { @@ -25,6 +30,13 @@ describe('parse-args', () => { instrumenteeArgs.should.eql(['my-app', '--help']) argv.tempDirectory.endsWith(join('coverage', 'tmp')).should.be.equal(true) }) + it('interprets first args after -- as Node.js execArgv', () => { + const expected = [process.execPath, '--expose-gc', 'index.js'] + process.argv = ['node', 'c8', '--', '--expose-gc', 'index.js'] + const argv = buildYargs().parse(hideInstrumenteeArgs()) + const munged = hideInstrumenterArgs(argv) + munged.should.deep.equal(expected) + }) }) describe('with NODE_V8_COVERAGE already set', () => { @@ -36,6 +48,14 @@ describe('parse-args', () => { argv.tempDirectory.endsWith('/coverage/tmp_').should.be.equal(true) process.env.NODE_V8_COVERAGE = NODE_V8_COVERAGE }) + it('should set it if undefined', () => { + const NODE_V8_COVERAGE = process.env.NODE_V8_COVERAGE + delete process.env.NODE_V8_COVERAGE + process.argv = ['node', 'c8', '--foo=99', 'my-app', '--help'] + const argv = buildYargs().parse(hideInstrumenteeArgs()) + argv.tempDirectory.endsWith('/coverage/tmp').should.be.equal(true) + process.env.NODE_V8_COVERAGE = NODE_V8_COVERAGE + }) }) describe('--config', () => { @@ -63,6 +83,16 @@ describe('parse-args', () => { argv.lines.should.be.equal(100) argv.functions.should.be.equal(24) }) + it('should allow relative reports directories', () => { + const argsArray = ['node', 'c8', '--lines', '100', '--reports-dir', './coverage_'] + const argv = buildYargs().parse(argsArray) + argv.reportsDir.should.be.equal('./coverage_') + }) + it('should allow relative temporary directories', () => { + const argsArray = ['node', 'c8', '--lines', '100', '--temp-directory', './coverage/tmp_'] + const argv = buildYargs().parse(argsArray) + argv.tempDirectory.should.be.equal('./coverage/tmp_') + }) }) describe('--merge-async', () => {