esnext.suppressed-error.constructor.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var isPrototypeOf = require('../internals/object-is-prototype-of');
  4. var getPrototypeOf = require('../internals/object-get-prototype-of');
  5. var setPrototypeOf = require('../internals/object-set-prototype-of');
  6. var copyConstructorProperties = require('../internals/copy-constructor-properties');
  7. var create = require('../internals/object-create');
  8. var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
  9. var createPropertyDescriptor = require('../internals/create-property-descriptor');
  10. var clearErrorStack = require('../internals/error-stack-clear');
  11. var installErrorCause = require('../internals/install-error-cause');
  12. var normalizeStringArgument = require('../internals/normalize-string-argument');
  13. var wellKnownSymbol = require('../internals/well-known-symbol');
  14. var ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');
  15. var TO_STRING_TAG = wellKnownSymbol('toStringTag');
  16. var $Error = Error;
  17. var $SuppressedError = function SuppressedError(error, suppressed, message /* , options */) {
  18. var options = arguments.length > 3 ? arguments[3] : undefined;
  19. var isInstance = isPrototypeOf(SuppressedErrorPrototype, this);
  20. var that;
  21. if (setPrototypeOf) {
  22. that = setPrototypeOf($Error(), isInstance ? getPrototypeOf(this) : SuppressedErrorPrototype);
  23. } else {
  24. that = isInstance ? this : create(SuppressedErrorPrototype);
  25. createNonEnumerableProperty(that, TO_STRING_TAG, 'Error');
  26. }
  27. if (message !== undefined) createNonEnumerableProperty(that, 'message', normalizeStringArgument(message));
  28. if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1));
  29. installErrorCause(that, options);
  30. createNonEnumerableProperty(that, 'error', error);
  31. createNonEnumerableProperty(that, 'suppressed', suppressed);
  32. return that;
  33. };
  34. if (setPrototypeOf) setPrototypeOf($SuppressedError, $Error);
  35. else copyConstructorProperties($SuppressedError, $Error, { name: true });
  36. var SuppressedErrorPrototype = $SuppressedError.prototype = create($Error.prototype, {
  37. constructor: createPropertyDescriptor(1, $SuppressedError),
  38. message: createPropertyDescriptor(1, ''),
  39. name: createPropertyDescriptor(1, 'SuppressedError')
  40. });
  41. // `SuppressedError` constructor
  42. // https://github.com/tc39/proposal-explicit-resource-management
  43. $({ global: true, constructor: true, arity: 3 }, {
  44. SuppressedError: $SuppressedError
  45. });