diff --git a/packages/core-js/features/strcutured-clone.js b/packages/core-js/features/structured-clone.js similarity index 100% rename from packages/core-js/features/strcutured-clone.js rename to packages/core-js/features/structured-clone.js diff --git a/packages/core-js/internals/structured-clone.js b/packages/core-js/internals/structured-clone.js index 075bc0bbe03f..b6b313938ed0 100644 --- a/packages/core-js/internals/structured-clone.js +++ b/packages/core-js/internals/structured-clone.js @@ -1,10 +1,15 @@ /* eslint-disable es/no-map -- safe */ /* eslint-disable es/no-set -- safe */ 'use const'; -var isSymbol = require('./is-symbol'); -var toObject = require('./to-object'); -var getOwnPropertyNames = require('./object-get-own-property-names'); -var classof = require('./classof'); +var isSymbol = require('../internals/is-symbol'); +var getOwnPropertyNames = require('../internals/object-get-own-property-names'); +var classof = require('../internals/classof'); +var getBuiltin = require('../internals/get-built-in'); +var isObject = require('../internals/is-object'); +var has = require('../internals/has'); + +var Set = getBuiltin('Set'); +var Map = getBuiltin('Map'); function createDataCloneError(message) { if (typeof DOMException === 'function') { @@ -21,18 +26,19 @@ function createDataCloneError(message) { */ module.exports = function structuredCloneInternal(weakmap, value) { if (isSymbol(value)) throw createDataCloneError('Symbols are not cloneable'); - if (typeof value !== 'function' && typeof value !== 'object') return value; + if (!isObject(value)) return value; if (value === null) return null; if (weakmap.has(value)) return weakmap.get(value); // effectively preserves circular references var cloned, i, deep; + var type = classof(value); - switch (classof(value)) { + switch (type) { case 'Boolean': case 'BigInt': case 'Number': case 'String': - cloned = toObject(value.valueOf()); + cloned = Object(value.valueOf()); break; case 'Date': cloned = new Date(value.valueOf()); @@ -72,7 +78,7 @@ module.exports = function structuredCloneInternal(weakmap, value) { weakmap.set(value, cloned); - if (deep) switch (classof(value)) { + if (deep) switch (type) { case 'Map': value.forEach(function (v, k) { cloned.set(structuredCloneInternal(weakmap, k), structuredCloneInternal(weakmap, v)); @@ -86,14 +92,13 @@ module.exports = function structuredCloneInternal(weakmap, value) { case 'Error': // Attempt to clone the stack. if ( - !Object.prototype.hasOwnProperty.call(value, 'stack') && // Chrome, Safari - !Object.prototype.hasOwnProperty.call(Error.prototype, 'stack') // Firefox + !has(value, 'stack') && // Chrome, Safari + !has(Error.prototype, 'stack') // Firefox ) break; try { cloned.stack = structuredCloneInternal(weakmap, value.stack); - } catch (error) { - if (classof(error) === 'TypeError') return cloned; // Stack cloning not avaliable. - throw error; // Unexpected error while cloning. + } catch (_) { + return cloned; // Stack cloning not avaliable. } break; case 'Array': diff --git a/packages/core-js/web/structured-clone.js b/packages/core-js/web/structured-clone.js index efa6a0b914e8..da04d8964f56 100644 --- a/packages/core-js/web/structured-clone.js +++ b/packages/core-js/web/structured-clone.js @@ -1,4 +1,6 @@ - +require('../modules/es.weak-map'); +require('../modules/es.map'); +require('../modules/es.set'); require('../modules/web.structured-clone'); var path = require('../internals/path'); diff --git a/tests/compat/tests.js b/tests/compat/tests.js index 874149eaf119..268bc94e0356 100644 --- a/tests/compat/tests.js +++ b/tests/compat/tests.js @@ -1546,6 +1546,9 @@ GLOBAL.tests = { 'web.queue-microtask': function () { return Object.getOwnPropertyDescriptor(GLOBAL, 'queueMicrotask').value; }, + 'web.structured-clone': function () { + return typeof structuredClone === 'function'; + }, 'web.timers': function () { return !/MSIE .\./.test(USERAGENT); }, @@ -1554,7 +1557,4 @@ GLOBAL.tests = { return URL.prototype.toJSON; }], 'web.url-search-params': URL_AND_URL_SEARCH_PARAMS_SUPPORT, - 'web.structured-clone': function () { - return typeof structuredClone === 'function'; - } };