#!/usr/bin/env node module.exports = Formatter var util = require('util') var reporters = require('./lib/reporters/index.js') Formatter.types = Object.keys(reporters).sort() var Writable = require('stream').Writable if (!Writable) { try { Writable = require('readable-stream').Writable } catch (er) { throw new Error('Please install "readable-stream" to use this module ' + 'with Node.js v0.8 and before') } } var Runner = require('./lib/runner.js') var Parser = require('tap-parser') util.inherits(Formatter, Writable) var exitCode function Formatter (type, options) { if (!(this instanceof Formatter)) { return new Formatter(type, options) } if (!reporters[type]) { console.error('Unknown format type: %s\n\n%s', type, avail()) type = 'silent' } this.writable = true // don't actually need a reporter to report the tap we're getting // just parse it so that we exit with the correct code, but otherwise // dump it straight through to stdout. if (type === 'tap') { var p = new Parser() this.write = function (chunk) { process.stdout.write(chunk) return p.write(chunk) } this.end = p.end.bind(p) p.on('complete', function () { if (!p.ok) exitCode = 1 }) return this } var runner = this.runner = new Runner(options) this.reporter = new reporters[type](this.runner, {}) Writable.call(this, options) runner.on('end', function () { if (!runner.parser.ok) exitCode = 1 }) } process.on('exit', function (code) { if (!code && exitCode) process.exit(exitCode) }) Formatter.prototype.write = function () { return this.runner.write.apply(this.runner, arguments) } Formatter.prototype.end = function () { return this.runner.end.apply(this.runner, arguments) } function avail () { var types = Formatter.types.reduce(function (str, t) { var ll = str.split('\n').pop().length + t.length if (ll < 40) return str + ' ' + t else return str + '\n' + t }, '').trim() return 'Available format types:\n\n' + types } function usage (err) { console[err ? 'error' : 'log'](function () {/* Usage: tap-mocha-reporter Reads TAP data on stdin, and formats to stdout using the specified reporter. (Note that some reporters write to files instead of stdout.) %s */}.toString().split('\n').slice(1, -1).join('\n'), avail()) } if (require.main === module) { var type = process.argv[2] if (!type) return usage() process.stdin.pipe(new Formatter(type)) }