You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							73 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							73 lines
						
					
					
						
							2.8 KiB
						
					
					
				| import { addInspectMethod } from "./isomorphic.node"; | |
| import { isLazyStack, isWritableStack, joinStacks, lazyJoinStacks } from "./stack"; | |
| import { getDeepKeys, toJSON } from "./to-json"; | |
| const protectedProps = ["name", "message", "stack"]; | |
| /** | |
|  * Extends the new error with the properties of the original error and the `props` object. | |
|  * | |
|  * @param newError - The error object to extend | |
|  * @param originalError - The original error object, if any | |
|  * @param props - Additional properties to add, if any | |
|  */ | |
| export function extendError(error, originalError, props) { | |
|     let onoError = error; | |
|     extendStack(onoError, originalError); | |
|     // Copy properties from the original error | |
|     if (originalError && typeof originalError === "object") { | |
|         mergeErrors(onoError, originalError); | |
|     } | |
|     // The default `toJSON` method doesn't output props like `name`, `message`, `stack`, etc. | |
|     // So replace it with one that outputs every property of the error. | |
|     onoError.toJSON = toJSON; | |
|     // On Node.js, add support for the `util.inspect()` method | |
|     // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition | |
|     if (addInspectMethod) { | |
|         addInspectMethod(onoError); | |
|     } | |
|     // Finally, copy custom properties that were specified by the user. | |
|     // These props OVERWRITE any previous props | |
|     if (props && typeof props === "object") { | |
|         Object.assign(onoError, props); | |
|     } | |
|     return onoError; | |
| } | |
| /** | |
|  * Extend the error stack to include its cause | |
|  */ | |
| function extendStack(newError, originalError) { | |
|     let stackProp = Object.getOwnPropertyDescriptor(newError, "stack"); | |
|     if (isLazyStack(stackProp)) { | |
|         lazyJoinStacks(stackProp, newError, originalError); | |
|     } | |
|     else if (isWritableStack(stackProp)) { | |
|         newError.stack = joinStacks(newError, originalError); | |
|     } | |
| } | |
| /** | |
|  * Merges properties of the original error with the new error. | |
|  * | |
|  * @param newError - The error object to extend | |
|  * @param originalError - The original error object, if any | |
|  */ | |
| function mergeErrors(newError, originalError) { | |
|     // Get the original error's keys | |
|     // NOTE: We specifically exclude properties that we have already set on the new error. | |
|     // This is _especially_ important for the `stack` property, because this property has | |
|     // a lazy getter in some environments | |
|     let keys = getDeepKeys(originalError, protectedProps); | |
|     // HACK: We have to cast the errors to `any` so we can use symbol indexers. | |
|     // see https://github.com/Microsoft/TypeScript/issues/1863 | |
|     let _newError = newError; | |
|     let _originalError = originalError; | |
|     for (let key of keys) { | |
|         if (_newError[key] === undefined) { | |
|             try { | |
|                 _newError[key] = _originalError[key]; | |
|             } | |
|             catch (e) { | |
|                 // This property is read-only, so it can't be copied | |
|             } | |
|         } | |
|     } | |
| } | |
| //# sourceMappingURL=extend-error.js.map
 |