UNPKG

nightwatch

Version:

Easy to use Node.js based end-to-end testing solution for web applications using the W3C WebDriver API.

120 lines (95 loc) 2.72 kB
const boxen = require('boxen'); const {colors} = require('./chalkColors.js'); const isErrorObject = require('./isErrorObject'); const addDetailedError = require('./addDetailedError.js'); const indentRegex = /^/gm; const stackTraceFilter = function (parts) { const stack = parts.reduce(function(list, line) { if (contains(line, [ 'node_modules', '(node.js:', '(timers.js:', '(events.js:', '(util.js:', '(net.js:', '(internal/process/', 'internal/modules/cjs/loader.js', 'internal/modules/cjs/helpers.js', 'internal/timers.js', '_http_client.js:', 'process._tickCallback', 'node:internal/' ])) { return list; } list.push(line); return list; }, []); return stack.join('\n'); }; const contains = function(str, text) { if (Array.isArray(text)) { for (let i = 0; i < text.length; i++) { if (contains(str, text[i])) { return true; } } } return str.includes(text); }; const filterStack = function(err) { if (err instanceof Error) { const stackTrace = err.stack.split('\n').slice(1); return stackTraceFilter(stackTrace); } return ''; }; const filterStackTrace = function(stackTrace = '') { const sections = stackTrace.split('\n'); return stackTraceFilter(sections); }; const showStackTrace = function (stack) { const parts = stack.split('\n'); const headline = parts.shift(); console.error(colors.red(headline.replace(indentRegex, ' '))); if (parts.length > 0) { const result = stackTraceFilter(parts); console.error(colors.stack_trace(result.replace(indentRegex, ' '))); } }; /** * @method errorToStackTrace * @param {Error} err */ const errorToStackTrace = function(err) { if (!isErrorObject(err)) { err = new Error(err); } addDetailedError(err); let headline = err.message ? `${err.name}: ${err.message}` : err.name; headline = colors.red(headline.replace(indentRegex, ' ')); if (err.detailedErr) { headline += `\n ${colors.light_green(err.detailedErr)}`; if (err.extraDetail) { headline += `\n ${colors.light_green(err.extraDetail)}`; } } const showStack = err.showTrace || err.showTrace === undefined; let stackTrace = ''; if (!showStack && err.reportShown) { return ' ' + headline; } if (!showStack) { return '\n' + boxen(`${headline}\n`, {padding: 1, borderColor: 'red'}) + '\n'; } stackTrace = filterStack(err); stackTrace = '\n' + colors.stack_trace(stackTrace.replace(indentRegex, ' ')); return `${headline}${stackTrace}`; }; module.exports = { errorToStackTrace, stackTraceFilter, filterStack, filterStackTrace, showStackTrace };