'use strict'; const mocha = require('mocha'); const internal = [ '(timers.js:', '(node.js:', '(module.js:', '(domain.js:', 'GeneratorFunctionPrototype.next (native)', 'at Generator.next', /at process\._tickDomainCallback \(.*\)/, /at emitCloseNT \(net\.js.*\)/, /at _combinedTickCallback \(internal.*\)/, // node 8.x 'at Promise ()', 'at next (native)', '__mocha_internal__', /node_modules\/.*empower-core\//, /node_modules\/.*mocha\//, /node_modules\/.*co\//, /node_modules\/.*co-mocha\//, /node_modules\/.*supertest\//, ]; // monkey-patch `Runner#fail` to modify stack const originFn = mocha.Runner.prototype.fail; mocha.Runner.prototype.fail = function(test, err) { /* istanbul ignore else */ if (err.stack) { const stack = err.stack.split('\n').filter(line => { line = line.replace(/\\\\?/g, '/'); return !internal.some(rule => match(line, rule)); }); stack.push(' [use `--full-trace` to display the full stack trace]'); err.stack = stack.join('\n'); } return originFn.call(this, test, err); }; function match(line, rule) { if (rule instanceof RegExp) return rule.test(line); return line.includes(rule); }