| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.extendError = void 0;
- const isomorphic_node_1 = require("./isomorphic.node");
- const stack_1 = require("./stack");
- const to_json_1 = require("./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
- */
- 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 = to_json_1.toJSON;
- // On Node.js, add support for the `util.inspect()` method
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
- if (isomorphic_node_1.addInspectMethod) {
- isomorphic_node_1.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;
- }
- exports.extendError = extendError;
- /**
- * Extend the error stack to include its cause
- */
- function extendStack(newError, originalError) {
- let stackProp = Object.getOwnPropertyDescriptor(newError, "stack");
- if (stack_1.isLazyStack(stackProp)) {
- stack_1.lazyJoinStacks(stackProp, newError, originalError);
- }
- else if (stack_1.isWritableStack(stackProp)) {
- newError.stack = stack_1.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 = to_json_1.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
|