UNPKG

error-class-utils

Version:
68 lines (48 loc) 1.3 kB
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;