@makerx/ts-dossier
Version:
A support library to facilitate the easy creation of builders for use with an Object-Mother test pattern in TypeScript
1 lines • 4.19 kB
Source Map (JSON)
{"version":3,"file":"deep-clone.mjs","sources":["../../src/deep-clone.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n// Ref: https://javascript.plainenglish.io/deep-clone-an-object-and-preserve-its-type-with-typescript-d488c35e5574\n// TODO: Make this the fallback when using classes or when structuredClone is unavailable\n/**\n * Deeply clones the supplied source\n *\n * ```typescript\n * const source = { a: 1, b: { a: 2 } }\n * const cloneA = deepClone(source)\n * console.log(cloneA !== source) // Outputs false\n * ```\n *\n * @template T\n * @param {T} source The source value to clone\n * @return {T} A clone of the source\n */\nexport function deepClone<T>(source: T): T {\n if (Array.isArray(source)) return source.map((item) => deepClone(item)) as unknown as T\n\n if (source instanceof Int8Array) return new Int8Array(source) as unknown as T\n if (source instanceof Uint8Array) return new Uint8Array(source) as unknown as T\n if (source instanceof Uint8ClampedArray) return new Uint8ClampedArray(source) as unknown as T\n if (source instanceof Int16Array) return new Int16Array(source) as unknown as T\n if (source instanceof Uint16Array) return new Uint16Array(source) as unknown as T\n if (source instanceof Int32Array) return new Int32Array(source) as unknown as T\n if (source instanceof Uint32Array) return new Uint32Array(source) as unknown as T\n if (source instanceof Float32Array) return new Float32Array(source) as unknown as T\n if (source instanceof Float64Array) return new Float64Array(source) as unknown as T\n if (source instanceof BigInt64Array) return new BigInt64Array(source) as unknown as T\n if (source instanceof BigUint64Array) return new BigUint64Array(source) as unknown as T\n\n if (source instanceof Date) return new Date(source.getTime()) as unknown as T\n\n if (source && typeof source === 'object') {\n // Support mongoose ObjectId\n if (Object.getPrototypeOf(source).constructor?.name === 'ObjectId' && Object.getPrototypeOf(source)._bsontype === 'ObjectID') {\n return Object.getPrototypeOf(source).constructor(source) as unknown as T\n }\n\n return Object.getOwnPropertyNames(source).reduce(\n (o, prop) => {\n Object.defineProperty(o, prop, Object.getOwnPropertyDescriptor(source, prop) as any)\n o[prop] = deepClone((source as Record<string, any>)[prop])\n return o as unknown as T\n },\n Object.create(Object.getPrototypeOf(source)),\n )\n }\n\n return source\n}\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;;;;;;;;;;;;AAYG;AACG,SAAU,SAAS,CAAI,MAAS,EAAA;AACpC,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAiB;IAEvF,IAAI,MAAM,YAAY,SAAS;AAAE,QAAA,OAAO,IAAI,SAAS,CAAC,MAAM,CAAiB;IAC7E,IAAI,MAAM,YAAY,UAAU;AAAE,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAiB;IAC/E,IAAI,MAAM,YAAY,iBAAiB;AAAE,QAAA,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAiB;IAC7F,IAAI,MAAM,YAAY,UAAU;AAAE,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAiB;IAC/E,IAAI,MAAM,YAAY,WAAW;AAAE,QAAA,OAAO,IAAI,WAAW,CAAC,MAAM,CAAiB;IACjF,IAAI,MAAM,YAAY,UAAU;AAAE,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAiB;IAC/E,IAAI,MAAM,YAAY,WAAW;AAAE,QAAA,OAAO,IAAI,WAAW,CAAC,MAAM,CAAiB;IACjF,IAAI,MAAM,YAAY,YAAY;AAAE,QAAA,OAAO,IAAI,YAAY,CAAC,MAAM,CAAiB;IACnF,IAAI,MAAM,YAAY,YAAY;AAAE,QAAA,OAAO,IAAI,YAAY,CAAC,MAAM,CAAiB;IACnF,IAAI,MAAM,YAAY,aAAa;AAAE,QAAA,OAAO,IAAI,aAAa,CAAC,MAAM,CAAiB;IACrF,IAAI,MAAM,YAAY,cAAc;AAAE,QAAA,OAAO,IAAI,cAAc,CAAC,MAAM,CAAiB;IAEvF,IAAI,MAAM,YAAY,IAAI;QAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAiB;AAE7E,IAAA,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;;QAExC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,UAAU,EAAE;YAC5H,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,MAAM,CAAiB;;AAG1E,QAAA,OAAO,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,IAAI,KAAI;AACV,YAAA,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAQ,CAAC;YACpF,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAE,MAA8B,CAAC,IAAI,CAAC,CAAC;AAC1D,YAAA,OAAO,CAAiB;AAC1B,SAAC,EACD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAC7C;;AAGH,IAAA,OAAO,MAAM;AACf;;;;"}