#!/usr/bin/env node const Parser = require('../') const etoa = require('events-to-array') const util = require('util') const args = process.argv.slice(2) let json = null let flat = false let bail = false let preserveWhitespace = true let omitVersion = false let strict = false function version () { console.log(require('../package.json').version) process.exit(0) } for (let i = 0; i < args.length; i++) { const arg = args[i] if (arg === '-j') { const val = +args[i + 1] if (val >= 0) { json = val i += 1 } else json = 2 continue } else { const m = arg.match(/^--json(?:=([0-9]+))?$/) if (m) { if (+m[1] >= 0) json = +m[1] else if (+args[i + 1] >= 0) { json = +args[i + 1] i += 1 } else json = 2 continue } } if (arg === '-v' || arg === '--version') version() else if (arg === '-o' || arg === '--omit-version') omitVersion = true else if (arg === '-w' || arg === '--ignore-all-whitespace') preserveWhitespace = false else if (arg === '-b' || arg === '--bail') bail = true else if (arg === '-B' || arg === '--no-bail') bail = false else if (arg === '-t' || arg === '--tap') json = 'tap' else if (arg === '-l' || arg === '--lines') json = 'lines' else if (arg === '-h' || arg === '--help') usage() else if (arg === '-f' || arg === '--flat') flat = true else if (arg === '-F' || arg === '--no-flat') flat = false else if (arg === '--strict') strict = true else if (arg === '--no-strict') strict = false else if (arg === '-s' || arg === '--silent') json = 'silent' else console.error('Unrecognized arg: %j', arg) } function usage () { console.log(`Usage: tap-parser Parses TAP data from stdin, and outputs the parsed result in the format specified by the options. Default output uses node's \`util.inspect()\` method. Options: -j [] | --json[=indent] Output event data as JSON with the specified indentation (default=2) -t | --tap Output data as reconstituted TAP based on parsed results -l | --lines Output each parsed line as it is recognized by the parser -b | --bail Emit a \`Bail out!\` at the first failed test point encountered -B | --no-bail Do not bail out at the first failed test point encountered (Default) -f | --flat Flatten all assertions to the top level parser -F | --no-flat Do not flatten all assertions to the top level parser (Default) -w | --ignore-all-whitespace Skip over blank lines outside of YAML blocks -o | --omit-version Ignore the \`TAP version 13\` line at the start of tests --strict Run the parser in strict mode --no-strict Do not run the parser in strict mode -s | --silent Do not print output, just exit success/failure based on TAP stream `) // prevent the EPIPE upstream when the data drops on the floor /* istanbul ignore else */ if (!process.stdin.isTTY) process.stdin.resume() process.exit() } const yaml = require('tap-yaml') function format (msg) { if (json === 'tap') return Parser.stringify(msg, options) else if (json !== null) return JSON.stringify(msg, null, +json) else return util.inspect(msg, null, Infinity) } const options = { bail: bail, preserveWhitespace: preserveWhitespace, omitVersion: omitVersion, strict: strict, flat: flat, } if (json === 'lines' || json === 'silent') { const parser = new Parser(options) if (json === 'lines') parser.on('line', l => process.stdout.write(l)) parser.on('complete', () => process.exitCode = parser.ok ? 0 : 1) process.stdin.pipe(parser) } else { const input = [] process.stdin.on('data', c => input.push(c)).on('end', () => { const buf = Buffer.concat(input) const result = Parser.parse(buf, options) const summary = result[ result.length - 1 ] console.log(format(result)) if (summary[0] !== 'complete' || !summary[1].ok) process.exitCode = 1 }) }