UNPKG

beautiful-error

Version:

💣 Prettify error messages and stacks 💥

61 lines (47 loc) • 1.61 kB
import{stripVTControlCharacters}from"node:util"; import{colorizeLine}from"./colors.js"; import{applyHeader}from"./header.js"; import{addIcon}from"./icon.js"; export const prettifyError=({ error, errorString, theme, useColors, icon })=>{ const lines=errorString.split("\n"); const linesA=prettifyLines({error,lines,theme,useColors,icon}); return linesA.join("\n") }; const prettifyLines=({error,lines,theme,useColors,icon})=>{ const{previewLines,messageLines,stackLines}=splitStack(lines,error); const messageLinesA=addIcon(messageLines,icon); const messageLinesB=applyHeader({ messageLines:messageLinesA, useColors, theme, error }); const messageLinesC=messageLinesB.map((line)=> colorizeLine(line,useColors,theme) ); return[...previewLines,...messageLinesC,...stackLines] }; const splitStack=(lines,error)=>{ const messageLineIndex=lines.findIndex((line)=>isMessageLine(line,error)); const messageLineIndexA=messageLineIndex===-1?0:messageLineIndex; const previewLines=lines.slice(0,messageLineIndexA); const messageLines=lines.slice(messageLineIndexA); const stackLineIndex=messageLines.findIndex(isStackLine); const stackLineIndexA= stackLineIndex===-1?messageLines.length:stackLineIndex; const messageLinesA=messageLines.slice(0,stackLineIndexA); const stackLines=messageLines.slice(stackLineIndexA); return{previewLines,messageLines:messageLinesA,stackLines} }; const isMessageLine=(line,error)=> line===error.name|| line.startsWith(`${error.name}: `)|| line.startsWith(`${error.constructor.name} [`); const isStackLine=(line)=> stripVTControlCharacters(line).trimStart().startsWith("at ");