Initial Save
This commit is contained in:
535
node_modules/core-js-pure/modules/web.structured-clone.js
generated
vendored
Normal file
535
node_modules/core-js-pure/modules/web.structured-clone.js
generated
vendored
Normal file
@@ -0,0 +1,535 @@
|
||||
'use strict';
|
||||
var IS_PURE = require('../internals/is-pure');
|
||||
var $ = require('../internals/export');
|
||||
var globalThis = require('../internals/global-this');
|
||||
var getBuiltIn = require('../internals/get-built-in');
|
||||
var uncurryThis = require('../internals/function-uncurry-this');
|
||||
var fails = require('../internals/fails');
|
||||
var uid = require('../internals/uid');
|
||||
var isCallable = require('../internals/is-callable');
|
||||
var isConstructor = require('../internals/is-constructor');
|
||||
var isNullOrUndefined = require('../internals/is-null-or-undefined');
|
||||
var isObject = require('../internals/is-object');
|
||||
var isSymbol = require('../internals/is-symbol');
|
||||
var iterate = require('../internals/iterate');
|
||||
var anObject = require('../internals/an-object');
|
||||
var classof = require('../internals/classof');
|
||||
var hasOwn = require('../internals/has-own-property');
|
||||
var createProperty = require('../internals/create-property');
|
||||
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
|
||||
var lengthOfArrayLike = require('../internals/length-of-array-like');
|
||||
var validateArgumentsLength = require('../internals/validate-arguments-length');
|
||||
var getRegExpFlags = require('../internals/regexp-get-flags');
|
||||
var MapHelpers = require('../internals/map-helpers');
|
||||
var SetHelpers = require('../internals/set-helpers');
|
||||
var setIterate = require('../internals/set-iterate');
|
||||
var detachTransferable = require('../internals/detach-transferable');
|
||||
var ERROR_STACK_INSTALLABLE = require('../internals/error-stack-installable');
|
||||
var PROPER_STRUCTURED_CLONE_TRANSFER = require('../internals/structured-clone-proper-transfer');
|
||||
|
||||
var Object = globalThis.Object;
|
||||
var Array = globalThis.Array;
|
||||
var Date = globalThis.Date;
|
||||
var Error = globalThis.Error;
|
||||
var TypeError = globalThis.TypeError;
|
||||
var PerformanceMark = globalThis.PerformanceMark;
|
||||
var DOMException = getBuiltIn('DOMException');
|
||||
var Map = MapHelpers.Map;
|
||||
var mapHas = MapHelpers.has;
|
||||
var mapGet = MapHelpers.get;
|
||||
var mapSet = MapHelpers.set;
|
||||
var Set = SetHelpers.Set;
|
||||
var setAdd = SetHelpers.add;
|
||||
var setHas = SetHelpers.has;
|
||||
var objectKeys = getBuiltIn('Object', 'keys');
|
||||
var push = uncurryThis([].push);
|
||||
var thisBooleanValue = uncurryThis(true.valueOf);
|
||||
var thisNumberValue = uncurryThis(1.0.valueOf);
|
||||
var thisStringValue = uncurryThis(''.valueOf);
|
||||
var thisTimeValue = uncurryThis(Date.prototype.getTime);
|
||||
var PERFORMANCE_MARK = uid('structuredClone');
|
||||
var DATA_CLONE_ERROR = 'DataCloneError';
|
||||
var TRANSFERRING = 'Transferring';
|
||||
|
||||
var checkBasicSemantic = function (structuredCloneImplementation) {
|
||||
return !fails(function () {
|
||||
var set1 = new globalThis.Set([7]);
|
||||
var set2 = structuredCloneImplementation(set1);
|
||||
var number = structuredCloneImplementation(Object(7));
|
||||
return set2 === set1 || !set2.has(7) || !isObject(number) || +number !== 7;
|
||||
}) && structuredCloneImplementation;
|
||||
};
|
||||
|
||||
var checkErrorsCloning = function (structuredCloneImplementation, $Error) {
|
||||
return !fails(function () {
|
||||
var error = new $Error();
|
||||
var test = structuredCloneImplementation({ a: error, b: error });
|
||||
return !(test && test.a === test.b && test.a instanceof $Error && test.a.stack === error.stack);
|
||||
});
|
||||
};
|
||||
|
||||
// https://github.com/whatwg/html/pull/5749
|
||||
var checkNewErrorsCloningSemantic = function (structuredCloneImplementation) {
|
||||
return !fails(function () {
|
||||
var test = structuredCloneImplementation(new globalThis.AggregateError([1], PERFORMANCE_MARK, { cause: 3 }));
|
||||
return test.name !== 'AggregateError' || test.errors[0] !== 1 || test.message !== PERFORMANCE_MARK || test.cause !== 3;
|
||||
});
|
||||
};
|
||||
|
||||
// FF94+, Safari 15.4+, Chrome 98+, NodeJS 17.0+, Deno 1.13+
|
||||
// FF<103 and Safari implementations can't clone errors
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1556604
|
||||
// FF103 can clone errors, but `.stack` of clone is an empty string
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1778762
|
||||
// FF104+ fixed it on usual errors, but not on DOMExceptions
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1777321
|
||||
// Chrome <102 returns `null` if cloned object contains multiple references to one error
|
||||
// https://bugs.chromium.org/p/v8/issues/detail?id=12542
|
||||
// NodeJS implementation can't clone DOMExceptions
|
||||
// https://github.com/nodejs/node/issues/41038
|
||||
// only FF103+ supports new (html/5749) error cloning semantic
|
||||
var nativeStructuredClone = globalThis.structuredClone;
|
||||
|
||||
var FORCED_REPLACEMENT = IS_PURE
|
||||
|| !checkErrorsCloning(nativeStructuredClone, Error)
|
||||
|| !checkErrorsCloning(nativeStructuredClone, DOMException)
|
||||
|| !checkNewErrorsCloningSemantic(nativeStructuredClone);
|
||||
|
||||
// Chrome 82+, Safari 14.1+, Deno 1.11+
|
||||
// Chrome 78-81 implementation swaps `.name` and `.message` of cloned `DOMException`
|
||||
// Chrome returns `null` if cloned object contains multiple references to one error
|
||||
// Safari 14.1 implementation doesn't clone some `RegExp` flags, so requires a workaround
|
||||
// Safari implementation can't clone errors
|
||||
// Deno 1.2-1.10 implementations too naive
|
||||
// NodeJS 16.0+ does not have `PerformanceMark` constructor
|
||||
// NodeJS <17.2 structured cloning implementation from `performance.mark` is too naive
|
||||
// and can't clone, for example, `RegExp` or some boxed primitives
|
||||
// https://github.com/nodejs/node/issues/40840
|
||||
// no one of those implementations supports new (html/5749) error cloning semantic
|
||||
var structuredCloneFromMark = !nativeStructuredClone && checkBasicSemantic(function (value) {
|
||||
return new PerformanceMark(PERFORMANCE_MARK, { detail: value }).detail;
|
||||
});
|
||||
|
||||
var nativeRestrictedStructuredClone = checkBasicSemantic(nativeStructuredClone) || structuredCloneFromMark;
|
||||
|
||||
var throwUncloneable = function (type) {
|
||||
throw new DOMException('Uncloneable type: ' + type, DATA_CLONE_ERROR);
|
||||
};
|
||||
|
||||
var throwUnpolyfillable = function (type, action) {
|
||||
throw new DOMException((action || 'Cloning') + ' of ' + type + ' cannot be properly polyfilled in this engine', DATA_CLONE_ERROR);
|
||||
};
|
||||
|
||||
var tryNativeRestrictedStructuredClone = function (value, type) {
|
||||
if (!nativeRestrictedStructuredClone) throwUnpolyfillable(type);
|
||||
return nativeRestrictedStructuredClone(value);
|
||||
};
|
||||
|
||||
var createDataTransfer = function () {
|
||||
var dataTransfer;
|
||||
try {
|
||||
dataTransfer = new globalThis.DataTransfer();
|
||||
} catch (error) {
|
||||
try {
|
||||
dataTransfer = new globalThis.ClipboardEvent('').clipboardData;
|
||||
} catch (error2) { /* empty */ }
|
||||
}
|
||||
return dataTransfer && dataTransfer.items && dataTransfer.files ? dataTransfer : null;
|
||||
};
|
||||
|
||||
var cloneBuffer = function (value, map, $type) {
|
||||
if (mapHas(map, value)) return mapGet(map, value);
|
||||
|
||||
var type = $type || classof(value);
|
||||
var clone, length, options, source, target, i;
|
||||
|
||||
if (type === 'SharedArrayBuffer') {
|
||||
if (nativeRestrictedStructuredClone) clone = nativeRestrictedStructuredClone(value);
|
||||
// SharedArrayBuffer should use shared memory, we can't polyfill it, so return the original
|
||||
else clone = value;
|
||||
} else {
|
||||
var DataView = globalThis.DataView;
|
||||
|
||||
// `ArrayBuffer#slice` is not available in IE10
|
||||
// `ArrayBuffer#slice` and `DataView` are not available in old FF
|
||||
if (!DataView && !isCallable(value.slice)) throwUnpolyfillable('ArrayBuffer');
|
||||
// detached buffers throws in `DataView` and `.slice`
|
||||
try {
|
||||
if (isCallable(value.slice) && !value.resizable) {
|
||||
clone = value.slice(0);
|
||||
} else {
|
||||
length = value.byteLength;
|
||||
options = 'maxByteLength' in value ? { maxByteLength: value.maxByteLength } : undefined;
|
||||
// eslint-disable-next-line es/no-resizable-and-growable-arraybuffers -- safe
|
||||
clone = new ArrayBuffer(length, options);
|
||||
source = new DataView(value);
|
||||
target = new DataView(clone);
|
||||
for (i = 0; i < length; i++) {
|
||||
target.setUint8(i, source.getUint8(i));
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
throw new DOMException('ArrayBuffer is detached', DATA_CLONE_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
mapSet(map, value, clone);
|
||||
|
||||
return clone;
|
||||
};
|
||||
|
||||
var cloneView = function (value, type, offset, length, map) {
|
||||
var C = globalThis[type];
|
||||
// in some old engines like Safari 9, typeof C is 'object'
|
||||
// on Uint8ClampedArray or some other constructors
|
||||
if (!isObject(C)) throwUnpolyfillable(type);
|
||||
return new C(cloneBuffer(value.buffer, map), offset, length);
|
||||
};
|
||||
|
||||
var structuredCloneInternal = function (value, map) {
|
||||
if (isSymbol(value)) throwUncloneable('Symbol');
|
||||
if (!isObject(value)) return value;
|
||||
// effectively preserves circular references
|
||||
if (map) {
|
||||
if (mapHas(map, value)) return mapGet(map, value);
|
||||
} else map = new Map();
|
||||
|
||||
var type = classof(value);
|
||||
var C, name, cloned, dataTransfer, i, length, keys, key;
|
||||
|
||||
switch (type) {
|
||||
case 'Array':
|
||||
cloned = Array(lengthOfArrayLike(value));
|
||||
break;
|
||||
case 'Object':
|
||||
cloned = {};
|
||||
break;
|
||||
case 'Map':
|
||||
cloned = new Map();
|
||||
break;
|
||||
case 'Set':
|
||||
cloned = new Set();
|
||||
break;
|
||||
case 'RegExp':
|
||||
// in this block because of a Safari 14.1 bug
|
||||
// old FF does not clone regexes passed to the constructor, so get the source and flags directly
|
||||
cloned = new RegExp(value.source, getRegExpFlags(value));
|
||||
break;
|
||||
case 'Error':
|
||||
name = value.name;
|
||||
switch (name) {
|
||||
case 'AggregateError':
|
||||
cloned = new (getBuiltIn(name))([]);
|
||||
break;
|
||||
case 'EvalError':
|
||||
case 'RangeError':
|
||||
case 'ReferenceError':
|
||||
case 'SuppressedError':
|
||||
case 'SyntaxError':
|
||||
case 'TypeError':
|
||||
case 'URIError':
|
||||
cloned = new (getBuiltIn(name))();
|
||||
break;
|
||||
case 'CompileError':
|
||||
case 'LinkError':
|
||||
case 'RuntimeError':
|
||||
cloned = new (getBuiltIn('WebAssembly', name))();
|
||||
break;
|
||||
default:
|
||||
cloned = new Error();
|
||||
}
|
||||
break;
|
||||
case 'DOMException':
|
||||
cloned = new DOMException(value.message, value.name);
|
||||
break;
|
||||
case 'ArrayBuffer':
|
||||
case 'SharedArrayBuffer':
|
||||
cloned = cloneBuffer(value, map, type);
|
||||
break;
|
||||
case 'DataView':
|
||||
case 'Int8Array':
|
||||
case 'Uint8Array':
|
||||
case 'Uint8ClampedArray':
|
||||
case 'Int16Array':
|
||||
case 'Uint16Array':
|
||||
case 'Int32Array':
|
||||
case 'Uint32Array':
|
||||
case 'Float16Array':
|
||||
case 'Float32Array':
|
||||
case 'Float64Array':
|
||||
case 'BigInt64Array':
|
||||
case 'BigUint64Array':
|
||||
length = type === 'DataView' ? value.byteLength : value.length;
|
||||
cloned = cloneView(value, type, value.byteOffset, length, map);
|
||||
break;
|
||||
case 'DOMQuad':
|
||||
try {
|
||||
cloned = new DOMQuad(
|
||||
structuredCloneInternal(value.p1, map),
|
||||
structuredCloneInternal(value.p2, map),
|
||||
structuredCloneInternal(value.p3, map),
|
||||
structuredCloneInternal(value.p4, map)
|
||||
);
|
||||
} catch (error) {
|
||||
cloned = tryNativeRestrictedStructuredClone(value, type);
|
||||
}
|
||||
break;
|
||||
case 'File':
|
||||
if (nativeRestrictedStructuredClone) try {
|
||||
cloned = nativeRestrictedStructuredClone(value);
|
||||
// NodeJS 20.0.0 bug, https://github.com/nodejs/node/issues/47612
|
||||
if (classof(cloned) !== type) cloned = undefined;
|
||||
} catch (error) { /* empty */ }
|
||||
if (!cloned) try {
|
||||
cloned = new File([value], value.name, value);
|
||||
} catch (error) { /* empty */ }
|
||||
if (!cloned) throwUnpolyfillable(type);
|
||||
break;
|
||||
case 'FileList':
|
||||
dataTransfer = createDataTransfer();
|
||||
if (dataTransfer) {
|
||||
for (i = 0, length = lengthOfArrayLike(value); i < length; i++) {
|
||||
dataTransfer.items.add(structuredCloneInternal(value[i], map));
|
||||
}
|
||||
cloned = dataTransfer.files;
|
||||
} else cloned = tryNativeRestrictedStructuredClone(value, type);
|
||||
break;
|
||||
case 'ImageData':
|
||||
// Safari 9 ImageData is a constructor, but typeof ImageData is 'object'
|
||||
try {
|
||||
cloned = new ImageData(
|
||||
structuredCloneInternal(value.data, map),
|
||||
value.width,
|
||||
value.height,
|
||||
{ colorSpace: value.colorSpace }
|
||||
);
|
||||
} catch (error) {
|
||||
cloned = tryNativeRestrictedStructuredClone(value, type);
|
||||
} break;
|
||||
default:
|
||||
if (nativeRestrictedStructuredClone) {
|
||||
cloned = nativeRestrictedStructuredClone(value);
|
||||
} else switch (type) {
|
||||
case 'BigInt':
|
||||
// can be a 3rd party polyfill
|
||||
cloned = Object(value.valueOf());
|
||||
break;
|
||||
case 'Boolean':
|
||||
cloned = Object(thisBooleanValue(value));
|
||||
break;
|
||||
case 'Number':
|
||||
cloned = Object(thisNumberValue(value));
|
||||
break;
|
||||
case 'String':
|
||||
cloned = Object(thisStringValue(value));
|
||||
break;
|
||||
case 'Date':
|
||||
cloned = new Date(thisTimeValue(value));
|
||||
break;
|
||||
case 'Blob':
|
||||
try {
|
||||
cloned = value.slice(0, value.size, value.type);
|
||||
} catch (error) {
|
||||
throwUnpolyfillable(type);
|
||||
} break;
|
||||
case 'DOMPoint':
|
||||
case 'DOMPointReadOnly':
|
||||
C = globalThis[type];
|
||||
try {
|
||||
cloned = C.fromPoint
|
||||
? C.fromPoint(value)
|
||||
: new C(value.x, value.y, value.z, value.w);
|
||||
} catch (error) {
|
||||
throwUnpolyfillable(type);
|
||||
} break;
|
||||
case 'DOMRect':
|
||||
case 'DOMRectReadOnly':
|
||||
C = globalThis[type];
|
||||
try {
|
||||
cloned = C.fromRect
|
||||
? C.fromRect(value)
|
||||
: new C(value.x, value.y, value.width, value.height);
|
||||
} catch (error) {
|
||||
throwUnpolyfillable(type);
|
||||
} break;
|
||||
case 'DOMMatrix':
|
||||
case 'DOMMatrixReadOnly':
|
||||
C = globalThis[type];
|
||||
try {
|
||||
cloned = C.fromMatrix
|
||||
? C.fromMatrix(value)
|
||||
: new C(value);
|
||||
} catch (error) {
|
||||
throwUnpolyfillable(type);
|
||||
} break;
|
||||
case 'AudioData':
|
||||
case 'VideoFrame':
|
||||
if (!isCallable(value.clone)) throwUnpolyfillable(type);
|
||||
try {
|
||||
cloned = value.clone();
|
||||
} catch (error) {
|
||||
throwUncloneable(type);
|
||||
} break;
|
||||
case 'CropTarget':
|
||||
case 'CryptoKey':
|
||||
case 'FileSystemDirectoryHandle':
|
||||
case 'FileSystemFileHandle':
|
||||
case 'FileSystemHandle':
|
||||
case 'GPUCompilationInfo':
|
||||
case 'GPUCompilationMessage':
|
||||
case 'ImageBitmap':
|
||||
case 'RTCCertificate':
|
||||
case 'WebAssembly.Module':
|
||||
throwUnpolyfillable(type);
|
||||
// break omitted
|
||||
default:
|
||||
throwUncloneable(type);
|
||||
}
|
||||
}
|
||||
|
||||
mapSet(map, value, cloned);
|
||||
|
||||
switch (type) {
|
||||
case 'Array':
|
||||
case 'Object':
|
||||
keys = objectKeys(value);
|
||||
for (i = 0, length = lengthOfArrayLike(keys); i < length; i++) {
|
||||
key = keys[i];
|
||||
createProperty(cloned, key, structuredCloneInternal(value[key], map));
|
||||
} break;
|
||||
case 'Map':
|
||||
value.forEach(function (v, k) {
|
||||
mapSet(cloned, structuredCloneInternal(k, map), structuredCloneInternal(v, map));
|
||||
});
|
||||
break;
|
||||
case 'Set':
|
||||
value.forEach(function (v) {
|
||||
setAdd(cloned, structuredCloneInternal(v, map));
|
||||
});
|
||||
break;
|
||||
case 'Error':
|
||||
createNonEnumerableProperty(cloned, 'message', structuredCloneInternal(value.message, map));
|
||||
if (hasOwn(value, 'cause')) {
|
||||
createNonEnumerableProperty(cloned, 'cause', structuredCloneInternal(value.cause, map));
|
||||
}
|
||||
if (name === 'AggregateError') {
|
||||
cloned.errors = structuredCloneInternal(value.errors, map);
|
||||
} else if (name === 'SuppressedError') {
|
||||
cloned.error = structuredCloneInternal(value.error, map);
|
||||
cloned.suppressed = structuredCloneInternal(value.suppressed, map);
|
||||
} // break omitted
|
||||
case 'DOMException':
|
||||
if (ERROR_STACK_INSTALLABLE) {
|
||||
createNonEnumerableProperty(cloned, 'stack', structuredCloneInternal(value.stack, map));
|
||||
}
|
||||
}
|
||||
|
||||
return cloned;
|
||||
};
|
||||
|
||||
var tryToTransfer = function (rawTransfer, map) {
|
||||
if (!isObject(rawTransfer)) throw new TypeError('Transfer option cannot be converted to a sequence');
|
||||
|
||||
var transfer = [];
|
||||
|
||||
iterate(rawTransfer, function (value) {
|
||||
push(transfer, anObject(value));
|
||||
});
|
||||
|
||||
var i = 0;
|
||||
var length = lengthOfArrayLike(transfer);
|
||||
var buffers = new Set();
|
||||
var value, type, C, transferred, canvas, context;
|
||||
|
||||
while (i < length) {
|
||||
value = transfer[i++];
|
||||
|
||||
type = classof(value);
|
||||
|
||||
if (type === 'ArrayBuffer' ? setHas(buffers, value) : mapHas(map, value)) {
|
||||
throw new DOMException('Duplicate transferable', DATA_CLONE_ERROR);
|
||||
}
|
||||
|
||||
if (type === 'ArrayBuffer') {
|
||||
setAdd(buffers, value);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (PROPER_STRUCTURED_CLONE_TRANSFER) {
|
||||
transferred = nativeStructuredClone(value, { transfer: [value] });
|
||||
} else switch (type) {
|
||||
case 'ImageBitmap':
|
||||
C = globalThis.OffscreenCanvas;
|
||||
if (!isConstructor(C)) throwUnpolyfillable(type, TRANSFERRING);
|
||||
try {
|
||||
canvas = new C(value.width, value.height);
|
||||
context = canvas.getContext('bitmaprenderer');
|
||||
context.transferFromImageBitmap(value);
|
||||
transferred = canvas.transferToImageBitmap();
|
||||
} catch (error) { /* empty */ }
|
||||
break;
|
||||
case 'AudioData':
|
||||
case 'VideoFrame':
|
||||
if (!isCallable(value.clone) || !isCallable(value.close)) throwUnpolyfillable(type, TRANSFERRING);
|
||||
try {
|
||||
transferred = value.clone();
|
||||
value.close();
|
||||
} catch (error) { /* empty */ }
|
||||
break;
|
||||
case 'MediaSourceHandle':
|
||||
case 'MessagePort':
|
||||
case 'MIDIAccess':
|
||||
case 'OffscreenCanvas':
|
||||
case 'ReadableStream':
|
||||
case 'RTCDataChannel':
|
||||
case 'TransformStream':
|
||||
case 'WebTransportReceiveStream':
|
||||
case 'WebTransportSendStream':
|
||||
case 'WritableStream':
|
||||
throwUnpolyfillable(type, TRANSFERRING);
|
||||
}
|
||||
|
||||
if (transferred === undefined) throw new DOMException('This object cannot be transferred: ' + type, DATA_CLONE_ERROR);
|
||||
|
||||
mapSet(map, value, transferred);
|
||||
}
|
||||
|
||||
return buffers;
|
||||
};
|
||||
|
||||
var detachBuffers = function (buffers) {
|
||||
setIterate(buffers, function (buffer) {
|
||||
if (PROPER_STRUCTURED_CLONE_TRANSFER) {
|
||||
nativeRestrictedStructuredClone(buffer, { transfer: [buffer] });
|
||||
} else if (isCallable(buffer.transfer)) {
|
||||
buffer.transfer();
|
||||
} else if (detachTransferable) {
|
||||
detachTransferable(buffer);
|
||||
} else {
|
||||
throwUnpolyfillable('ArrayBuffer', TRANSFERRING);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// `structuredClone` method
|
||||
// https://html.spec.whatwg.org/multipage/structured-data.html#dom-structuredclone
|
||||
$({ global: true, enumerable: true, sham: !PROPER_STRUCTURED_CLONE_TRANSFER, forced: FORCED_REPLACEMENT }, {
|
||||
structuredClone: function structuredClone(value /* , { transfer } */) {
|
||||
var options = validateArgumentsLength(arguments.length, 1) > 1 && !isNullOrUndefined(arguments[1]) ? anObject(arguments[1]) : undefined;
|
||||
var transfer = options ? options.transfer : undefined;
|
||||
var map, buffers;
|
||||
|
||||
if (transfer !== undefined) {
|
||||
map = new Map();
|
||||
buffers = tryToTransfer(transfer, map);
|
||||
}
|
||||
|
||||
var clone = structuredCloneInternal(value, map);
|
||||
|
||||
// since of an issue with cloning views of transferred buffers, we a forced to detach them later
|
||||
// https://github.com/zloirock/core-js/issues/1265
|
||||
if (buffers) detachBuffers(buffers);
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user