From df3de2c27ade56cb2fc57acdf79a476683a33a8f Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Fri, 15 Oct 2021 06:02:19 +0700 Subject: [PATCH 1/2] [experiment] clear error stack from extra entries --- .../core-js/internals/clear-error-stack.js | 18 ++++++++++++++++++ .../internals/error-stack-installable.js | 10 ++++++++++ packages/core-js/modules/es.aggregate-error.js | 8 +++++--- 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 packages/core-js/internals/clear-error-stack.js create mode 100644 packages/core-js/internals/error-stack-installable.js diff --git a/packages/core-js/internals/clear-error-stack.js b/packages/core-js/internals/clear-error-stack.js new file mode 100644 index 000000000000..e01175046ee0 --- /dev/null +++ b/packages/core-js/internals/clear-error-stack.js @@ -0,0 +1,18 @@ +var replace = ''.replace; +var split = ''.split; +var slice = [].slice; +var join = [].join; + +var TEST = (function (arg) { return String(Error(arg).stack); })('zxcasd'); +var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; +var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); +var IS_FIREFOX_OR_SAFARI_STACK = /@[^\n]*\n/.test(TEST) && !/zxcasd/.test(TEST); + +module.exports = function (stack, dropEntries) { + if (typeof stack != 'string') return stack; + if (IS_V8_OR_CHAKRA_STACK) { + while (dropEntries--) stack = replace.call(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + } else if (IS_FIREFOX_OR_SAFARI_STACK) { + return join.call(slice.call(split.call(stack, '\n'), dropEntries), '\n'); + } return stack; +}; diff --git a/packages/core-js/internals/error-stack-installable.js b/packages/core-js/internals/error-stack-installable.js new file mode 100644 index 000000000000..ebdc5d0f923f --- /dev/null +++ b/packages/core-js/internals/error-stack-installable.js @@ -0,0 +1,10 @@ +var fails = require('../internals/fails'); +var createPropertyDescriptor = require('../internals/create-property-descriptor'); + +module.exports = !fails(function () { + var error = Error('a'); + if (!('stack' in error)) return true; + // eslint-disable-next-line es/no-object-defineproperty -- safe + Object.defineProperty(error, 'stack', createPropertyDescriptor(1, 7)); + return error.stack !== 7; +}); diff --git a/packages/core-js/modules/es.aggregate-error.js b/packages/core-js/modules/es.aggregate-error.js index 0bc2a4120fb4..6c550499156e 100644 --- a/packages/core-js/modules/es.aggregate-error.js +++ b/packages/core-js/modules/es.aggregate-error.js @@ -6,21 +6,23 @@ var copyConstructorProperties = require('../internals/copy-constructor-propertie var create = require('../internals/object-create'); var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); var createPropertyDescriptor = require('../internals/create-property-descriptor'); +var clearErrorStack = require('../internals/clear-error-stack'); var installErrorCause = require('../internals/install-error-cause'); var iterate = require('../internals/iterate'); var normalizeStringArgument = require('../internals/normalize-string-argument'); +var ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable'); var push = [].push; var $AggregateError = function AggregateError(errors, message /* , options */) { - var that = this; + var that = this instanceof $AggregateError ? this : create($AggregateErrorPrototype); var options = arguments.length > 2 ? arguments[2] : undefined; - if (!(that instanceof $AggregateError)) return new $AggregateError(errors, message, options); if (setPrototypeOf) { // eslint-disable-next-line unicorn/error-message -- expected that = setPrototypeOf(new Error(undefined), getPrototypeOf(that)); } createNonEnumerableProperty(that, 'message', normalizeStringArgument(message, '')); + if (ERROR_STACK_INSTALLABLE) createNonEnumerableProperty(that, 'stack', clearErrorStack(that.stack, 1)); installErrorCause(that, options); var errorsArray = []; iterate(errors, push, { that: errorsArray }); @@ -31,7 +33,7 @@ var $AggregateError = function AggregateError(errors, message /* , options */) { if (setPrototypeOf) setPrototypeOf($AggregateError, Error); else copyConstructorProperties($AggregateError, Error); -$AggregateError.prototype = create(Error.prototype, { +var $AggregateErrorPrototype = $AggregateError.prototype = create(Error.prototype, { constructor: createPropertyDescriptor(1, $AggregateError), message: createPropertyDescriptor(1, ''), name: createPropertyDescriptor(1, 'AggregateError') From a4a4783381a4133ee4d6275d8039cf5cdeae5110 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Mon, 18 Oct 2021 07:55:00 +0700 Subject: [PATCH 2/2] refactoring --- packages/core-js/internals/clear-error-stack.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/core-js/internals/clear-error-stack.js b/packages/core-js/internals/clear-error-stack.js index e01175046ee0..5c1546f74699 100644 --- a/packages/core-js/internals/clear-error-stack.js +++ b/packages/core-js/internals/clear-error-stack.js @@ -1,7 +1,9 @@ -var replace = ''.replace; -var split = ''.split; -var slice = [].slice; -var join = [].join; +var uncurryThis = require('../internals/function-uncurry-this'); +var arraySlice = require('../internals/array-slice'); + +var replace = uncurryThis(''.replace); +var split = uncurryThis(''.split); +var join = uncurryThis([].join); var TEST = (function (arg) { return String(Error(arg).stack); })('zxcasd'); var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; @@ -11,8 +13,8 @@ var IS_FIREFOX_OR_SAFARI_STACK = /@[^\n]*\n/.test(TEST) && !/zxcasd/.test(TEST); module.exports = function (stack, dropEntries) { if (typeof stack != 'string') return stack; if (IS_V8_OR_CHAKRA_STACK) { - while (dropEntries--) stack = replace.call(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); + while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ''); } else if (IS_FIREFOX_OR_SAFARI_STACK) { - return join.call(slice.call(split.call(stack, '\n'), dropEntries), '\n'); + return join(arraySlice(split(stack, '\n'), dropEntries), '\n'); } return stack; };