{"version":3,"file":"print-error-details.cjs","sources":["../../../src/logger/print-error-details.js"],"sourcesContent":["import * as colors from 'colors/safe.js';\nimport * as diff from 'diff';\nimport fs from 'fs';\n\nfunction formatValue(val) {\n  if (typeof val === 'string') return JSON.stringify(val);\n  if (typeof val === 'object') return JSON.stringify(val, null, 2);\n  return String(val);\n}\n\nconst isMultilineString = val => typeof val === 'string' && val.includes('\\n');\nconst isObjectOrArray = val => val && typeof val === 'object';\n\nfunction findUserStackFrame(errorStack) {\n  const stackLines = errorStack.split('\\n');\n  for (const line of stackLines) {\n    if (\n        line.includes('.js') && \n        !line.includes('node_modules/fauji') && \n        !line.includes('node:internal') && \n        !line.includes('matchers/utils') && \n        !line.includes('run-assertions/logger')\n    ) {\n      return line;\n    }\n  }\n}\n\nexport function printErrorDetails(error, outStream) {\n  if (!error) return;\n\n  if (error.actual !== undefined && error.expected !== undefined) {\n    if (error.matcherName) {\n      const notText = error.isNot ? 'not.' : '';\n      outStream.write('    expect(received).' + notText + error.matcherName + '()\\n\\n');\n    }\n    \n    // Show the difference\n    outStream.write(colors.red('    Difference:') + '\\n');\n    outStream.write(colors.red('    - Expected: ') + formatValue(error.expected) + '\\n');\n    outStream.write(colors.green('    + Received: ') + formatValue(error.actual) + '\\n');\n\n    // Only show patch diff for objects, arrays, or multi-line strings\n    if (\n      (isObjectOrArray(error.expected) && isObjectOrArray(error.actual)) ||\n      isMultilineString(error.expected) ||\n      isMultilineString(error.actual)\n    ) {\n      try {\n        const diffLines = diff.createPatch('difference', String(error.expected), String(error.actual)).split('\\n').slice(4);\n        if (diffLines.length > 0) {\n          diffLines.forEach(line => {\n            if (line.startsWith('-')) outStream.write('    ' + colors.red(line) + '\\n');\n            else if (line.startsWith('+')) outStream.write('    ' + colors.green(line) + '\\n');\n            else if (line.trim()) outStream.write('    ' + line + '\\n');\n          });\n        }\n      } catch (e) {\n        // If diff creation fails, just show the basic expected/received\n      }\n    }\n  } else if (error.matcherName) {\n    // Handle custom matcher failures without actual/expected\n    const notText = error.isNot ? 'not.' : '';\n    outStream.write('    expect(received).' + notText + error.matcherName + '()\\n\\n');\n    if (error.actual !== undefined) {\n      outStream.write('    Received: ' + formatValue(error.actual) + '\\n\\n');\n    }\n  } else if (error.message && error.message.includes('Difference:')) {\n    // Handle assertion errors that already have formatted difference in message\n    const lines = error.message.split('\\n');\n    let inDiffSection = false;\n    let diffShown = false;\n    let hasShownDiff = false;\n\n    lines.forEach(line => {\n      if (line.includes('Difference:')) {\n        if (!diffShown && !hasShownDiff) {\n          outStream.write(colors.red('    Difference:') + '\\n');\n          diffShown = true;\n          hasShownDiff = true;\n        }\n        inDiffSection = true;\n      } else if (inDiffSection && line.trim()) {\n        if (line.startsWith('- Expected:')) {\n          outStream.write('    ' + line + '\\n');\n        } else if (line.startsWith('+ Received:')) {\n          outStream.write('    ' + line + '\\n');\n        } else if (line.startsWith('-') || line.startsWith('+')) {\n          outStream.write('    ' + line + '\\n');\n        } else {\n          outStream.write('    ' + colors.gray(line) + '\\n');\n        }\n      }\n    });\n  }\n\n  // User-focused stack/code frame\n  if (error.stack) {\n    const userFrame = findUserStackFrame(error.stack);\n    // If not found, fall back to the first non-internal frame\n    if (!userFrame) {\n      userFrame = stackLines.find(l => l.includes('.js') && !l.includes('node:internal')) || stackLines[1];\n    }\n    let location = '';\n    let file = '', lineNum = 0;\n    const match = userFrame && (userFrame.match(/\\(([^)]+):(\\d+):(\\d+)\\)/) || userFrame.match(/at ([^ ]+):(\\d+):(\\d+)/));\n    if (match && match[1] && match[2]) {\n      location = match[1] + ':' + match[2];\n      file = match[1];\n      lineNum = parseInt(match[2], 10);\n    }\n    if (file && lineNum) {\n      try {\n        const lines = fs.readFileSync(file, 'utf8').split('\\n');\n        const start = Math.max(0, lineNum - 3);\n        const end = Math.min(lines.length, lineNum + 2);\n        outStream.write(colors.gray(`\\n    at ${file}:${lineNum}`) + '\\n');\n        for (let i = start; i < end; i++) {\n          const prefix = (i + 1 === lineNum) ? colors.bgRed.white(' > ') : '   ';\n          outStream.write(prefix + ' ' + (i + 1).toString().padStart(4) + ' | ' + lines[i] + '\\n');\n        }\n      } catch {}\n    } else if (location) {\n      outStream.write(colors.gray(`\\n    at ${location}`) + '\\n');\n    }\n  }\n  // Add a trailing newline for spacing before the next test\n  outStream.write('\\n');\n}\n"],"names":["colors.red","colors.green","diff","colors.gray","colors.bgRed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,WAAW,CAAC,GAAG,EAAE;AAC1B,EAAE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACzD,EAAE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,EAAE,OAAO,MAAM,CAAC,GAAG,CAAC;AACpB;;AAEA,MAAM,iBAAiB,GAAG,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9E,MAAM,eAAe,GAAG,GAAG,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;;AAE7D,SAAS,kBAAkB,CAAC,UAAU,EAAE;AACxC,EAAE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3C,EAAE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;AACjC,IAAI;AACJ,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC5B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;AAC5C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;AACvC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AACxC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB;AAC9C,MAAM;AACN,MAAM,OAAO,IAAI;AACjB,IAAI;AACJ,EAAE;AACF;;AAEO,SAAS,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE;AACpD,EAAE,IAAI,CAAC,KAAK,EAAE;;AAEd,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE;AAClE,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE;AAC3B,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,EAAE;AAC/C,MAAM,SAAS,CAAC,KAAK,CAAC,uBAAuB,GAAG,OAAO,GAAG,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;AACvF,IAAI;AACJ;AACA;AACA,IAAI,SAAS,CAAC,KAAK,CAACA,oBAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;AACzD,IAAI,SAAS,CAAC,KAAK,CAACA,oBAAU,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AACxF,IAAI,SAAS,CAAC,KAAK,CAACC,sBAAY,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;;AAExF;AACA,IAAI;AACJ,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC;AACvE,MAAM,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC;AACvC,MAAM,iBAAiB,CAAC,KAAK,CAAC,MAAM;AACpC,MAAM;AACN,MAAM,IAAI;AACV,QAAQ,MAAM,SAAS,GAAGC,eAAI,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3H,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AAClC,UAAU,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI;AACpC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,GAAGF,oBAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACvF,iBAAiB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,GAAGC,sBAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC9F,iBAAiB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AACvE,UAAU,CAAC,CAAC;AACZ,QAAQ;AACR,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE;AAClB;AACA,MAAM;AACN,IAAI;AACJ,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE;AAChC;AACA,IAAI,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,EAAE;AAC7C,IAAI,SAAS,CAAC,KAAK,CAAC,uBAAuB,GAAG,OAAO,GAAG,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;AACrF,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE;AACpC,MAAM,SAAS,CAAC,KAAK,CAAC,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAC5E,IAAI;AACJ,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AACrE;AACA,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3C,IAAI,IAAI,aAAa,GAAG,KAAK;AAC7B,IAAI,IAAI,SAAS,GAAG,KAAK;AACzB,IAAI,IAAI,YAAY,GAAG,KAAK;;AAE5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;AAC1B,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AACxC,QAAQ,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE;AACzC,UAAU,SAAS,CAAC,KAAK,CAACD,oBAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;AAC/D,UAAU,SAAS,GAAG,IAAI;AAC1B,UAAU,YAAY,GAAG,IAAI;AAC7B,QAAQ;AACR,QAAQ,aAAa,GAAG,IAAI;AAC5B,MAAM,CAAC,MAAM,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AAC/C,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;AAC5C,UAAU,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;AACnD,UAAU,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACjE,UAAU,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,QAAQ,CAAC,MAAM;AACf,UAAU,SAAS,CAAC,KAAK,CAAC,MAAM,GAAGG,qBAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC5D,QAAQ;AACR,MAAM;AACN,IAAI,CAAC,CAAC;AACN,EAAE;;AAEF;AACA,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE;AACnB,IAAI,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC;AACrD;AACA,IAAI,IAAI,CAAC,SAAS,EAAE;AACpB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC;AAC1G,IAAI;AACJ,IAAI,IAAI,QAAQ,GAAG,EAAE;AACrB,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC;AAC9B,IAAI,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS,CAAC,KAAK,CAAC,yBAAyB,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AACxH,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;AACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACtC,IAAI;AACJ,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE;AACzB,MAAM,IAAI;AACV,QAAQ,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/D,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;AAC9C,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC;AACvD,QAAQ,SAAS,CAAC,KAAK,CAACA,qBAAW,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAC1E,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAC1C,UAAU,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,OAAO,IAAIC,sBAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK;AAChF,UAAU,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAClG,QAAQ;AACR,MAAM,CAAC,CAAC,MAAM,CAAC;AACf,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE;AACzB,MAAM,SAAS,CAAC,KAAK,CAACD,qBAAW,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACjE,IAAI;AACJ,EAAE;AACF;AACA,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AACvB;;;;"}