diff --git a/packages/core-js-compat/src/data.mjs b/packages/core-js-compat/src/data.mjs index 4e0294e43da6..83a05e6ece3c 100644 --- a/packages/core-js-compat/src/data.mjs +++ b/packages/core-js-compat/src/data.mjs @@ -1430,6 +1430,11 @@ export const data = { safari: '10.0', rhino: '1.7.13', }, + 'esnext.error.cause': { + chrome: '94', + firefox: '91', + safari: '15.0', + }, // TODO: Remove from `core-js@4` 'esnext.aggregate-error': null, 'esnext.aggregate-error.cause': { @@ -1498,11 +1503,6 @@ export const data = { }, 'esnext.composite-symbol': { }, - 'esnext.error.cause': { - chrome: '94', - firefox: '91', - safari: '15.0', - }, // TODO: Remove from `core-js@4` 'esnext.global-this': null, 'esnext.iterator.constructor': { diff --git a/packages/core-js-compat/src/modules-by-versions.mjs b/packages/core-js-compat/src/modules-by-versions.mjs index 1017d7684465..f028bbb7c6b3 100644 --- a/packages/core-js-compat/src/modules-by-versions.mjs +++ b/packages/core-js-compat/src/modules-by-versions.mjs @@ -112,7 +112,7 @@ export default { 'esnext.typed-array.from-async', ], 3.19: [ - 'esnext.aggregate-error.cause', 'esnext.error.cause', + 'esnext.aggregate-error.cause', ], }; diff --git a/packages/core-js/features/aggregate-error.js b/packages/core-js/features/aggregate-error.js index cf6c17511462..e3521cee6246 100644 --- a/packages/core-js/features/aggregate-error.js +++ b/packages/core-js/features/aggregate-error.js @@ -1,7 +1,8 @@ +require('../modules/esnext.error.cause'); // TODO: remove from `core-js@4` require('../modules/esnext.aggregate-error'); +require('../modules/esnext.aggregate-error.cause'); var parent = require('../stable/aggregate-error'); -require('../modules/esnext.aggregate-error.cause'); module.exports = parent; diff --git a/packages/core-js/internals/wrap-error-constructor-with-cause.js b/packages/core-js/internals/wrap-error-constructor-with-cause.js index d03dc22c62b3..029524a5da53 100644 --- a/packages/core-js/internals/wrap-error-constructor-with-cause.js +++ b/packages/core-js/internals/wrap-error-constructor-with-cause.js @@ -2,6 +2,7 @@ var getBuiltIn = require('../internals/get-built-in'); var global = require('../internals/global'); var hasOwn = require('../internals/has-own-property'); +var setPrototypeOf = require('../internals/object-set-prototype-of'); var copyConstructorProperties = require('../internals/copy-constructor-properties'); var inheritIfRequired = require('../internals/inherit-if-required'); var installErrorCause = require('../internals/install-error-cause'); @@ -20,6 +21,8 @@ module.exports = function (ERROR_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) { if (!FORCED) return OriginalError; + var BaseError = getBuiltIn('Error'); + var WrappedError = wrapper(function () { var result = OriginalError.apply(this, arguments); if (this && this !== global) inheritIfRequired(result, this, WrappedError); @@ -29,6 +32,11 @@ module.exports = function (ERROR_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) { WrappedError.prototype = OriginalErrorPrototype; + if (OriginalError !== BaseError) { + if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError); + else copyConstructorProperties(WrappedError, BaseError); + } + copyConstructorProperties(WrappedError, OriginalError); if (!IS_PURE) try { diff --git a/packages/core-js/modules/esnext.error.cause.js b/packages/core-js/modules/esnext.error.cause.js index 1eb39f9603ec..d3bd4a8a4e3c 100644 --- a/packages/core-js/modules/esnext.error.cause.js +++ b/packages/core-js/modules/esnext.error.cause.js @@ -7,7 +7,10 @@ var FORCED = Error('e', { cause: 7 }).cause !== 7; $({ global: true, forced: FORCED }, { Error: wrapErrorConstructorWithCause('Error', function (init) { return function Error(message) { return init.apply(this, arguments); }; - }, FORCED), + }, FORCED) +}); + +$({ global: true, forced: FORCED }, { EvalError: wrapErrorConstructorWithCause('EvalError', function (init) { return function EvalError(message) { return init.apply(this, arguments); }; }, FORCED), diff --git a/packages/core-js/proposals/error-cause.js b/packages/core-js/proposals/error-cause.js index 801c81854ce1..56c9781eb2ab 100644 --- a/packages/core-js/proposals/error-cause.js +++ b/packages/core-js/proposals/error-cause.js @@ -1,3 +1,3 @@ // https://github.com/tc39/proposal-error-cause -require('../modules/esnext.aggregate-error.cause'); require('../modules/esnext.error.cause'); +require('../modules/esnext.aggregate-error.cause'); diff --git a/tests/pure/esnext.error.cause.js b/tests/pure/esnext.error.cause.js index bbd692455d41..6540b9b2acb8 100644 --- a/tests/pure/esnext.error.cause.js +++ b/tests/pure/esnext.error.cause.js @@ -1,3 +1,5 @@ +import { PROTO } from '../helpers/constants'; + import path from 'core-js-pure/features/error'; import create from 'core-js-pure/es/object/create'; @@ -8,6 +10,11 @@ for (const ERROR_NAME of ['Error', 'EvalError', 'RangeError', 'ReferenceError', assert.arity($Error, 1); assert.name($Error, ERROR_NAME); + if (PROTO && $Error !== path.Error) { + // eslint-disable-next-line no-prototype-builtins -- safe + assert.ok(path.Error.isPrototypeOf($Error), 'constructor has `Error` in the prototype chain'); + } + assert.ok($Error(1) instanceof $Error, 'no cause, without new'); assert.ok(new $Error(1) instanceof $Error, 'no cause, with new'); diff --git a/tests/tests/esnext.error.cause.js b/tests/tests/esnext.error.cause.js index a436f2f23a92..dec5a84222d6 100644 --- a/tests/tests/esnext.error.cause.js +++ b/tests/tests/esnext.error.cause.js @@ -1,4 +1,4 @@ -import { GLOBAL } from '../helpers/constants'; +import { GLOBAL, PROTO } from '../helpers/constants'; const { create } = Object; @@ -10,6 +10,11 @@ for (const ERROR_NAME of ['Error', 'EvalError', 'RangeError', 'ReferenceError', assert.name($Error, ERROR_NAME); assert.looksNative($Error); + if (PROTO && $Error !== Error) { + // eslint-disable-next-line no-prototype-builtins -- safe + assert.ok(Error.isPrototypeOf($Error), 'constructor has `Error` in the prototype chain'); + } + assert.same($Error.prototype.constructor, $Error, 'prototype constructor'); // eslint-disable-next-line no-prototype-builtins -- safe assert.ok(!$Error.prototype.hasOwnProperty('cause'), 'prototype hasn`t cause');