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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 proxyAccessor = require('../internals/proxy-accessor');
  9. var inheritIfRequired = require('../internals/inherit-if-required');
  10. var normalizeStringArgument = require('../internals/normalize-string-argument');
  11. var installErrorCause = require('../internals/install-error-cause');
  12. var clearErrorStack = require('../internals/clear-error-stack');
  13. var ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');
  14. var DESCRIPTORS = require('../internals/descriptors');
  15. var IS_PURE = require('../internals/is-pure');
  16. module.exports = function (FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) {
  17. var STACK_TRACE_LIMIT = 'stackTraceLimit';
  18. var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1;
  19. var path = FULL_NAME.split('.');
  20. var ERROR_NAME = path[path.length - 1];
  21. var OriginalError = getBuiltIn.apply(null, path);
  22. if (!OriginalError) return;
  23. var OriginalErrorPrototype = OriginalError.prototype;
  24. // V8 9.3- bug https://bugs.chromium.org/p/v8/issues/detail?id=12006
  25. if (!IS_PURE && hasOwn(OriginalErrorPrototype, 'cause')) delete OriginalErrorPrototype.cause;
  26. if (!FORCED) return OriginalError;
  27. var BaseError = getBuiltIn('Error');
  28. var WrappedError = wrapper(function (a, b) {
  29. var message = normalizeStringArgument(IS_AGGREGATE_ERROR ? b : a, undefined);
  30. var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError();
  31. if (message !== undefined) createNonEnumerableProperty(result, 'message', message);
  32. if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(result, 'stack', clearErrorStack(result.stack, 2));
  33. if (this && isPrototypeOf(OriginalErrorPrototype, this)) inheritIfRequired(result, this, WrappedError);
  34. if (arguments.length > OPTIONS_POSITION) installErrorCause(result, arguments[OPTIONS_POSITION]);
  35. return result;
  36. });
  37. WrappedError.prototype = OriginalErrorPrototype;
  38. if (ERROR_NAME !== 'Error') {
  39. if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError);
  40. else copyConstructorProperties(WrappedError, BaseError, { name: true });
  41. } else if (DESCRIPTORS && STACK_TRACE_LIMIT in OriginalError) {
  42. proxyAccessor(WrappedError, OriginalError, STACK_TRACE_LIMIT);
  43. proxyAccessor(WrappedError, OriginalError, 'prepareStackTrace');
  44. }
  45. copyConstructorProperties(WrappedError, OriginalError);
  46. if (!IS_PURE) try {
  47. // Safari 13- bug: WebAssembly errors does not have a proper `.name`
  48. if (OriginalErrorPrototype.name !== ERROR_NAME) {
  49. createNonEnumerableProperty(OriginalErrorPrototype, 'name', ERROR_NAME);
  50. }
  51. OriginalErrorPrototype.constructor = WrappedError;
  52. } catch (error) { /* empty */ }
  53. return WrappedError;
  54. };