UNPKG

@mfederczuk/deeptools

Version:

A set of utility functions that recursively operate on objects

1 lines 2.57 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.deepCopy=deepCopy;const utils_1=require("./_internal/utils");const deepFreeze_1=require("./deepFreeze");const scalarArrayTypesWithout64BitInts=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];const uncopiableTypes=[[WeakMap,"WeakMap"],[WeakSet,"WeakSet"],[SharedArrayBuffer,"SharedArrayBuffer"],[DataView,"DataView"],[Promise,"Promise"]];const initCopyOfScalarArrays=obj=>{for(const ScalarArray of scalarArrayTypesWithout64BitInts){if(obj instanceof ScalarArray){return new ScalarArray(obj)}}if(obj instanceof BigInt64Array){return new BigInt64Array(obj)}if(obj instanceof BigUint64Array){return new BigUint64Array(obj)}return null};const throwIfIsUncopiableType=obj=>{for(const[uncopiableType,typeName]of uncopiableTypes){if(obj instanceof uncopiableType){throw new TypeError(`${typeName} objects cannot be copied`)}}};const initCopy=obj=>{if(obj instanceof Array){return new Array(obj.map(deepCopy))}if(obj instanceof RegExp){return new RegExp(obj)}if(obj instanceof Date){return new Date(obj)}if(obj instanceof Map){const copiedEntries=[];for(const[key,value]of obj.entries()){copiedEntries.push([deepCopy(key),deepCopy(value)])}return new Map(copiedEntries)}if(obj instanceof Set){const copiedValues=[];for(const value of obj.values()){copiedValues.push(deepCopy(value))}return new Set(copiedValues)}const scalarArrayCopyOrNull=initCopyOfScalarArrays(obj);if(scalarArrayCopyOrNull!==null){return scalarArrayCopyOrNull}if(obj instanceof ArrayBuffer){const newBuffer=new ArrayBuffer(obj.byteLength);const origView=new Uint8Array(obj);const newView=new Uint8Array(newBuffer);newView.set(origView);return newBuffer}throwIfIsUncopiableType(obj);return Object.create(obj)};function deepCopy(obj){if(!(0,utils_1.isNotPrimitive)(obj)){return obj}if(typeof obj==="function"){throw new TypeError("Function objects cannot be copied")}const copy=initCopy(obj);for(const propertyKey of(0,utils_1.getPropertyKeys)(obj)){const propertyDescriptor=(0,utils_1.getOwnPropertyDescriptor)(obj,propertyKey);if("value"in propertyDescriptor){propertyDescriptor.value=deepCopy(propertyDescriptor.value)}Object.defineProperty(copy,propertyKey,propertyDescriptor)}const objPrototype=Object.getPrototypeOf(obj);if(Object.getPrototypeOf(copy)!==objPrototype){if(typeof objPrototype!=="object"){throw new TypeError("Object.getPrototypeOf() did not return an object")}Object.setPrototypeOf(copy,objPrototype)}return copy}(0,deepFreeze_1.deepFreeze)(deepCopy);