wrap-error-constructor-with-cause.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. 'use strict';
  2. var getBuiltIn = require('../internals/get-built-in');
  3. var hasOwn = require('../internals/has-own-property');
  4. var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
  5. var isPrototypeOf = require('../internals/object-is-prototype-of');
  6. var setPrototypeOf = require('../internals/object-set-prototype-of');
  7. var copyConstructorProperties = require('../internals/copy-constructor-properties');
  8. var inheritIfRequired = require('../internals/inherit-if-required');
  9. var normalizeStringArgument = require('../internals/normalize-string-argument');
  10. var installErrorCause = require('../internals/install-error-cause');
  11. var clearErrorStack = require('../internals/clear-error-stack');
  12. var ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');
  13. var IS_PURE = require('../internals/is-pure');
  14. module.exports = function (FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) {
  15. var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1;
  16. var path = FULL_NAME.split('.');
  17. var ERROR_NAME = path[path.length - 1];
  18. var OriginalError = getBuiltIn.apply(null, path);
  19. if (!OriginalError) return;
  20. var OriginalErrorPrototype = OriginalError.prototype;
  21. // V8 9.3- bug https://bugs.chromium.org/p/v8/issues/detail?id=12006
  22. if (!IS_PURE && hasOwn(OriginalErrorPrototype, 'cause')) delete OriginalErrorPrototype.cause;
  23. if (!FORCED) return OriginalError;
  24. var BaseError = getBuiltIn('Error');
  25. var WrappedError = wrapper(function (a, b) {
  26. var message = normalizeStringArgument(IS_AGGREGATE_ERROR ? b : a, undefined);
  27. var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError();
  28. if (message !== undefined) createNonEnumerableProperty(result, 'message', message);
  29. if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(result, 'stack', clearErrorStack(result.stack, 2));
  30. if (this && isPrototypeOf(OriginalErrorPrototype, this)) inheritIfRequired(result, this, WrappedError);
  31. if (arguments.length > OPTIONS_POSITION) installErrorCause(result, arguments[OPTIONS_POSITION]);
  32. return result;
  33. });
  34. WrappedError.prototype = OriginalErrorPrototype;
  35. if (ERROR_NAME !== 'Error') {
  36. if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError);
  37. else copyConstructorProperties(WrappedError, BaseError, { name: true });
  38. }
  39. copyConstructorProperties(WrappedError, OriginalError);
  40. if (!IS_PURE) try {
  41. // Safari 13- bug: WebAssembly errors does not have a proper `.name`
  42. if (OriginalErrorPrototype.name !== ERROR_NAME) {
  43. createNonEnumerableProperty(OriginalErrorPrototype, 'name', ERROR_NAME);
  44. }
  45. OriginalErrorPrototype.constructor = WrappedError;
  46. } catch (error) { /* empty */ }
  47. return WrappedError;
  48. };