t = StringPrototypeReplaceAll(result, '\\', '\\\\'); result = StringPrototypeReplaceAll(result, '#', '\\#'); return result; } function jsToYaml(indent, name, value, seen) { if (value === null || value === undefined) { return ''; } if (typeof value !== 'object') { const prefix = `${indent} ${name}: `; if (typeof value !== 'string') { return `${prefix}${inspectWithNoCustomRetry(value, inspectOptions)}\n`; } const lines = RegExpPrototypeSymbolSplit(kLineBreakRegExp, value); if (lines.length === 1) { return `${prefix}${inspectWithNoCustomRetry(value, inspectOptions)}\n`; } let str = `${prefix}|-\n`; for (let i = 0; i < lines.length; i++) { str += `${indent} ${lines[i]}\n`; } return str; } seen.add(value); const entries = ObjectEntries(value); const isErrorObj = isError(value); let result = ''; let propsIndent = indent; if (name != null) { result += `${indent} ${name}:\n`; propsIndent += ' '; } for (let i = 0; i < entries.length; i++) { const { 0: key, 1: value } = entries[i]; if (isErrorObj && (key === 'cause' || key === 'code')) { continue; } if (seen.has(value)) { result += `${propsIndent} ${key}: \n`; continue; } result += jsToYaml(propsIndent, key, value, seen); } if (isErrorObj) { const { kUnwrapErrors } = lazyLoadTest(); const { cause, code, failureType, message, expected, actual, operator, stack, name, } = value; let errMsg = message ?? ''; let errName = name; let errStack = stack; let errCode = code; let errExpected = expected; let errActual = actual; let errOperator = operator; let errIsAssertion = isAssertionLike(value); // If the ERR_TEST_FAILURE came from an error provided by user code, // then try to unwrap the original error message and stack. if (code === 'ERR_TEST_FAILURE' && kUnwrapErrors.has(failureType)) { errStack = cause?.stack ?? errStack; errCode = cause?.code ?? errCode; errName = cause?.name ?? errName; errMsg = cause?.message ?? errMsg; if (isAssertionLike(cause)) { errExpected = cause.expected; errActual = cause.actual; errOperator = cause.operator ?? errOperator; errIsAssertion = true; } } result += jsToYaml(indent, 'error', errMsg, seen); if (errCode) { result += jsToYaml(indent, 'code', errCode, seen); } if (errName && errName !== 'Error') { result += jsToYaml(indent, 'name', errName, seen); } if (errIsAssertion) { result += jsToYaml(indent, 'expected', errExpected, seen); result += jsToYaml(indent, 'actual', errActual, seen); if (errOperator) { result += jsToYaml(indent, 'operator', errOperator, seen); } } if (typeof errStack === 'string') { const frames = []; ArrayPrototypeForEach( RegExpPrototypeSymbolSplit(kLineBreakRegExp, errStack), (frame) => { const processed = RegExpPrototypeSymbolReplace( kFrameStartRegExp, frame, '', ); if (processed.length > 0 && processed.length !== frame.length) { ArrayPrototypePush(frames, processed); } }, ); if (frames.length > 0) { const frameDelimiter = `\n${indent} `; result += `${indent} stack: |-${frameDelimiter}`; result += `${ArrayPrototypeJoin(frames, frameDelimiter)}\n`; } } } return result; } function isAssertionLike(value) { return value && typeof value === 'object' && 'expected' in value && 'actual' in value; } module.exports = tapReporter;