UNPKG

@bemedev/types

Version:

Type definitions for Bemedev projects

48 lines (45 loc) 1.74 kB
'use strict'; /** * Creates a deep clone of an object or array, preserving its structure and values. * * * @param value of type {@linkcode PrimitiveObject} The value to deep clone, which can be an object, array, or primitive. * @param formatKey A function to format the keys of the cloned object. If not provided, keys will remain unchanged. * @param refs A map to keep track of already cloned objects to handle circular references. * This is used to prevent infinite loops when cloning objects that reference each other. * @returns A deep clone of the input value, preserving the structure and values of the original object or array. * * Inspired by the `deep-clone` npm {@link https://www.npmjs.com/package/deep-clone|library}, * @see the {@link https://github.com/thebearingedge/deep-clone/blob/main/src/deep-clone.ts|implementation} for more details. */ function deepClone(value, refs = new Map()) { const ref = refs.get(value); if (typeof ref !== 'undefined') return ref; if (Array.isArray(value)) { const clone = []; refs.set(value, clone); for (let i = 0; i < value.length; i++) { clone[i] = deepClone(value[i], refs); } return clone; } if (!(value instanceof Object)) return value; const clone = {}; refs.set(value, clone); const keys = Object.keys(value); for (let i = 0; i < keys.length; i++) { const key = keys[i]; clone[key] = deepClone(value[keys[i]], refs); } if (Object.isFrozen(value)) { Object.freeze(clone); } if (Object.isSealed(value)) { Object.seal(clone); } return clone; } module.exports = deepClone; //# sourceMappingURL=deepclone.cjs.map