beautiful-error
Version:
💣 Prettify error messages and stacks 💥
76 lines (61 loc) • 1.24 kB
JavaScript
import isErrorInstance from"is-error-instance";
export const callCustom=({
error,
errorString,
custom,
recursiveBeautiful
})=>{
if(typeof error[custom]!=="function"||CUSTOM_MAP.has(error)){
return errorString
}
const newErrorString=callBeautifulMethod({
error,
errorString,
custom,
recursiveBeautiful
});
return validateReturnValue(newErrorString,recursiveBeautiful)
};
const callBeautifulMethod=({
error,
errorString,
custom,
recursiveBeautiful
})=>{
CUSTOM_MAP.add(error);
try{
return error[custom](errorString)
}catch(cause){
return serializeError(cause,recursiveBeautiful)
}finally{
CUSTOM_MAP.delete(error)
}
};
const serializeError=(error,recursiveBeautiful)=>{
if(!isErrorInstance(error)){
return recursiveBeautiful(error)
}
CUSTOM_MAP.add(error);
try{
return recursiveBeautiful(error)
}finally{
CUSTOM_MAP.delete(error)
}
};
const CUSTOM_MAP=new WeakSet;
const validateReturnValue=(errorString,recursiveBeautiful)=>{
if(typeof errorString==="string"){
return errorString
}
const error=new TypeError(
`'error.beautiful()' must return a string, not: ${safeString(errorString)}`
);
return recursiveBeautiful(error)
};
const safeString=(value)=>{
try{
return String(value)
}catch(error){
return safeString(error)
}
};