beautiful-error
Version:
💣 Prettify error messages and stacks 💥
61 lines (47 loc) • 1.61 kB
JavaScript
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 ");