beautiful-error
Version:
💣 Prettify error messages and stacks 💥
66 lines (53 loc) • 1.47 kB
JavaScript
import{validateHeader}from"../header.js";
import{validateIcon}from"../icon.js";
import{applyClassesOpts,getClassesOpts,validateObject}from"./classes.js";
import{applyDefaultOpts}from"./default.js";
export const validateOptions=(opts)=>{
normalizeOptions(opts)
};
export const normalizeOptions=(opts={})=>{
validateObject(opts,"The options");
const{classes,opts:optsA}=getClassesOpts(opts);
return Object.fromEntries(
Object.keys(classes).map((name)=>[
name,
normalizeClassOptions(name,classes,optsA)]
)
)
};
const normalizeClassOptions=(name,classes,opts)=>{
const classOpts=applyClassesOpts(name,classes,opts);
Object.entries(classOpts).forEach(validateOpt);
return applyDefaultOpts(classOpts)
};
const validateOpt=([optName,optValue])=>{
if(optValue===undefined){
return
}
const validator=VALIDATORS[optName];
if(validator===undefined){
throw new Error(`'${optName}' is an unknown option`)
}
validator(optValue,optName)
};
const validateBoolean=(value,optName)=>{
if(typeof value!=="boolean"){
throw new TypeError(`The option '${optName}' must be a boolean: ${value}`)
}
};
const validateStringOrSymbol=(value,optName)=>{
if(typeof value!=="string"&&typeof value!=="symbol"){
throw new TypeError(
`The option '${optName}' must be a string or a symbol: ${value}`
)
}
};
const VALIDATORS={
stack:validateBoolean,
cause:validateBoolean,
props:validateBoolean,
colors:validateBoolean,
icon:validateIcon,
header:validateHeader,
custom:validateStringOrSymbol
};