error-class-utils
Version:
Properly create error classes
68 lines (48 loc) • 1.3 kB
JavaScript
import{setNonEnumProp}from"./set.js";
export const setErrorName=(ErrorClass,name)=>{
validateErrorName(name);
setNonEnumProp(ErrorClass,"name",name);
setNonEnumProp(ErrorClass.prototype,"name",name)
};
const validateErrorName=(name)=>{
if(typeof name!=="string"){
throw new TypeError(`Error name must be a string: ${name}`)
}
validateNativeErrors(name);
if(!name.endsWith(ERROR_NAME_END)||name===ERROR_NAME_END){
throw new Error(`Error name "${name}" must end with "${ERROR_NAME_END}"`)
}
validateErrorNamePattern(name)
};
const validateNativeErrors=(errorName)=>{
if(NATIVE_ERRORS.has(errorName)){
throw new Error(`Error name "${errorName}" must not be a native class.`)
}
};
const NATIVE_ERRORS=new Set([
"Error",
"ReferenceError",
"TypeError",
"SyntaxError",
"RangeError",
"URIError",
"EvalError",
"AggregateError",
"SystemError",
"AssertionError",
"Warning",
"UnhandledPromiseRejection",
"DOMException"]
);
const validateErrorNamePattern=(errorName)=>{
if(errorName[0]!==errorName.toUpperCase()[0]){
throw new Error(
`Error name "${errorName}" must start with an uppercase letter.`
)
}
if(!ERROR_NAME_REGEXP.test(errorName)){
throw new Error(`Error name "${errorName}" must only contain letters.`)
}
};
const ERROR_NAME_END="Error";
const ERROR_NAME_REGEXP=/[A-Z][a-zA-Z]*Error$/u;