From e45e01a0977537eb4ca6976c40a305a09411c6e7 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Fri, 15 Oct 2021 06:02:19 +0700 Subject: [PATCH] [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 f9a93ee00a4c..68441392e0d2 100644 --- a/packages/core-js/modules/es.aggregate-error.js +++ b/packages/core-js/modules/es.aggregate-error.js @@ -6,19 +6,21 @@ 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 $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, errorsArray.push, { that: errorsArray }); @@ -29,7 +31,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')