{"version":3,"sources":["jsdelivr-header.js","/npm/@small-tech/tap-out@3.2.0/index.js"],"names":[],"mappings":"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","file":"/npm/@small-tech/tap-out@3.2.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@small-tech/tap-out@3.2.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict'\n\nconst PassThrough = require('stream').PassThrough\nconst split = require('split')\nconst util = require('util')\nconst EventEmitter = require('events').EventEmitter\nconst reemit = require('re-emitter')\n\nconst parseLine = require('./lib/parse-line')\nconst error = require('./lib/error')\n\nfunction trim (str) { return str.trim() }\n\nfunction Parser() {\n  if (!(this instanceof Parser)) {\n    return new Parser()\n  }\n\n  EventEmitter.call(this)\n\n  this.results = {\n    tests: [],\n    asserts: [],\n    versions: [],\n    results: [],\n    comments: [],\n    plans: [],\n    pass: [],\n    fail: [],\n    errors: [],\n    bailOuts: [],\n  }\n  this.testNumber = 0\n\n  this.previousLine = ''\n  this.currentNextLineError = null\n  this.writingErrorOutput = false\n  this.writingErrorStackOutput = false\n  this.tmpErrorOutput = ''\n}\n\nutil.inherits(Parser, EventEmitter)\n\nParser.prototype.handleLine = function handleLine(line) {\n\n  const parsed = parseLine(line)\n\n  // This will handle all the error stuff\n  this._handleError(line)\n\n  // This is weird, but it's the only way to distinguish a\n  // console.log type output from an error output\n  if (\n    !this.writingErrorOutput\n    && !parsed\n    && !isErrorOutputEnd(line)\n    && !isRawTapTestStatus(line)\n  )\n  {\n    const comment = {\n      type: 'comment',\n      raw: line,\n      test: this.testNumber\n    }\n    this.emit('comment', comment)\n    this.results.comments.push(comment)\n  }\n\n  // Invalid line\n  if (!parsed) {\n    this.previousLine = line\n    return\n  }\n\n  // Handle tests\n  if (parsed.type === 'test') {\n    this.testNumber += 1\n    parsed.number = this.testNumber\n  }\n\n  // Handle asserts\n  if (parsed.type === 'assert') {\n    parsed.test = this.testNumber\n    this.results[parsed.ok ? 'pass' : 'fail'].push(parsed)\n\n    if (parsed.ok) {\n      // No need to have the error object\n      // in a passing assertion\n      delete parsed.error\n      this.emit('pass', parsed)\n    }\n  }\n\n  if (!isOkLine(this.previousLine)) {\n    this.emit(parsed.type, parsed)\n    this.results[parsed.type + 's'].push(parsed)\n  }\n\n  // This is all so we can determine if the \"# ok\" output on the last line\n  // should be skipped\n  function isOkLine (previousLine) {\n\n    return line === '# ok' && previousLine.indexOf('# pass') > -1\n  }\n  this.previousLine = line\n}\n\nParser.prototype._handleError = function _handleError(line) {\n  let lastAssert\n\n  // Start of error output\n  if (isErrorOutputStart(line)) {\n    this.writingErrorOutput = true\n    this.lastAsserRawErrorString = ''\n  }\n  // End of error output\n  else if (isErrorOutputEnd(line)) {\n    this.writingErrorOutput = false\n    this.currentNextLineError = null\n    this.writingErrorStackOutput = false\n\n    // Emit error here so it has the full error message with it\n    lastAssert = this.results.fail[this.results.fail.length - 1]\n\n    if (this.tmpErrorOutput) {\n      lastAssert.error.stack = this.tmpErrorOutput\n      this.lastAsserRawErrorString += this.tmpErrorOutput + '\\n'\n      this.tmpErrorOutput = ''\n    }\n\n    // right-trimmed raw error string\n    lastAssert.error.raw = this.lastAsserRawErrorString.replace(/\\s+$/g, '')\n\n    this.emit('fail', lastAssert)\n  }\n  // Append to stack\n  else if (this.writingErrorStackOutput) {\n    this.tmpErrorOutput += trim(line) + '\\n'\n  }\n  // Not the beginning of the error message but it's the body\n  else if (this.writingErrorOutput) {\n    const m = splitFirst(trim(line), (':'))\n    lastAssert = this.results.fail[this.results.fail.length - 1]\n\n    // Rebuild raw error output\n    this.lastAsserRawErrorString += line + '\\n'\n\n    if (m[0] === 'stack') {\n      this.writingErrorStackOutput = true\n      return\n    }\n\n    let msg = trim((m[1] || '').replace(/['\"]+/g, ''))\n\n    if (m[0] === 'at') {\n      // Example string: Object.async.eachSeries (/Users/scott/www/modules/nash/node_modules/async/lib/async.js:145:20)\n\n      msg = (msg\n      .split(' ')[1] || '')\n      .replace('(', '')\n      .replace(')', '')\n\n      const values = msg.split(':')\n      const file = values.slice(0, values.length-2).join(':')\n\n      msg = {\n        file: file,\n        line: values[values.length-2],\n        character: values[values.length-1]\n      }\n    }\n\n    // This is a plan failure\n    if (lastAssert.name === 'plan != count') {\n      lastAssert.type = 'plan'\n      delete lastAssert.error.at\n      lastAssert.error.operator = 'count'\n\n      // Need to set this value\n      if (m[0] === 'actual') {\n        lastAssert.error.actual = trim(m[1])\n      }\n    }\n\n    // outputting expected/actual object or array\n    if (this.currentNextLineError) {\n      lastAssert.error[this.currentNextLineError] = trim(line)\n      this.currentNextLineError = null\n    }\n    else if (trim(m[1]) === '|-') {\n      this.currentNextLineError = m[0]\n    }\n    else {\n      lastAssert.error[m[0]] = msg\n    }\n  }\n  // Emit fail when error on previous line had no diagnostics\n  else if (this.previousLine && isFailAssertionLine(this.previousLine)) {\n    lastAssert = this.results.fail[this.results.fail.length - 1]\n\n    this.emit('fail', lastAssert)\n  }\n}\n\nParser.prototype._handleEnd = function _handleEnd() {\n  const plan = this.results.plans.length ? this.results.plans[0] : null\n  const count = this.results.asserts.length\n  const first = count && this.results.asserts.reduce(firstAssertion)\n  const last = count && this.results.asserts.reduce(lastAssertion)\n\n  // Emit fail when error on previous line had no diagnostics\n  if (this.previousLine && isFailAssertionLine(this.previousLine)) {\n    const lastAssert = this.results.fail[this.results.fail.length - 1]\n    this.emit('fail', lastAssert)\n  }\n\n  if (!plan) {\n    if (count > 0) {\n      this.results.errors.push(error('no plan provided'))\n    }\n    return\n  }\n\n  if (this.results.fail.length > 0) {\n    return\n  }\n\n  if (count !== (plan.to - plan.from + 1)) {\n    this.results.errors.push(error('incorrect number of assertions made'))\n  } else if (first && first.number !== plan.from) {\n    this.results.errors.push(error('first assertion number does not equal the plan start'))\n  } else if (last && last.number !== plan.to) {\n    this.results.errors.push(error('last assertion number does not equal the plan end'))\n  }\n}\n\nmodule.exports = function (done) {\n\n  done = done || function () {}\n\n  const stream = new PassThrough()\n  const parser = Parser()\n  reemit(parser, stream, [\n    'test', 'assert', 'version', 'result', 'pass', 'fail', 'comment', 'plan', 'bailOut'\n  ])\n\n  const write = stream.write\n  const end = stream.end\n\n  const splitStream = split()\n\n  stream.write = function() {\n    write.apply(stream, arguments)\n    splitStream.write.apply(splitStream, arguments)\n  }\n\n  stream.end = function() {\n    end.apply(stream, arguments)\n    splitStream.end.apply(splitStream, arguments)\n  }\n\n  splitStream\n    .on('data', function (data) {\n\n      if (!data) {\n        return\n      }\n\n      const line = data.toString()\n      parser.handleLine(line)\n    })\n    .on('end', function () {\n      parser._handleEnd()\n\n      stream.emit('output', parser.results)\n\n      done(null, parser.results)\n    })\n    .on('error', done)\n\n  return stream\n}\n\nmodule.exports.Parser = Parser\n\nfunction isFailAssertionLine (line) {\n\n  return line.indexOf('not ok') === 0\n}\n\nfunction isErrorOutputStart (line) {\n\n  return line.indexOf('  ---') === 0\n}\n\nfunction isErrorOutputEnd (line) {\n\n  return line === '  ...'\n}\n\nfunction splitFirst(str, pattern) {\n\n  const parts = str.split(pattern)\n  if (parts.length <= 1) {\n    return parts\n  }\n\n  return [parts[0], parts.slice(1).join(pattern)]\n}\n\nfunction isRawTapTestStatus (str) {\n  const rawTapTestStatusRegex = new RegExp('(\\\\d+)(\\\\.)(\\\\.)(\\\\d+)')\n  return rawTapTestStatusRegex.exec(str)\n}\n\nfunction firstAssertion(first, assert) {\n  return assert.number < first.number ? assert : first\n}\n\nfunction lastAssertion(last, assert) {\n  return assert.number > last.number ? assert : last\n}\n"]}