{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["export type TGetCopyOfObjArgs = Parameters<typeof getCopyOfObj>;\r\n\r\nexport type TGetCopyOfObjReturn = ReturnType<typeof getCopyOfObj>;\r\n\r\n/**\r\n * Gets a deep copy/clone of an object/array without a reference to the original object.\n * Supports common built-ins including dates, URLs, collections, and binary views.\n * @param obj{Object|Array} source object (array)\r\n * @returns {Object|Array}\r\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy\r\n * @example\r\n * // How to make a deep clone of an object?\r\n * const originalObject = {\r\n *   value: 1,\r\n * }\r\n * const copy = getCopyOfObj(originalObject);\r\n * copy.value = 2;\n * console.log(originalObject.value === copy.value) // false\n * @example\n * // Create an editable form draft without mutating the saved profile\n * const profileDraft = getCopyOfObj(savedProfile);\n * profileDraft.contacts.email = \"new@example.com\";\n */\nexport const getCopyOfObj = <T>(obj: T): T => {\n  const clone = (value: unknown, visited: WeakMap<object, unknown>): unknown => {\n    if (value === null || typeof value !== \"object\") {\n      return value;\n    }\n    if (visited.has(value)) {\n      return visited.get(value);\n    }\n    if (value instanceof Date) {\n      const result = new Date(value.getTime());\n      visited.set(value, result);\n      return result;\n    }\n    if (value instanceof RegExp) {\n      // eslint-disable-next-line security/detect-non-literal-regexp\n      const result = new RegExp(value.source, value.flags);\n      result.lastIndex = value.lastIndex;\n      visited.set(value, result);\n      return result;\n    }\n    if (value instanceof URL) {\n      const result = new URL(value.href);\n      visited.set(value, result);\n      return result;\n    }\n    if (value instanceof URLSearchParams) {\n      const result = new URLSearchParams(value);\n      visited.set(value, result);\n      return result;\n    }\n    if (value instanceof Map) {\n      const result = new Map<unknown, unknown>();\n      visited.set(value, result);\n      value.forEach((mapValue, key) => {\n        result.set(clone(key, visited), clone(mapValue, visited));\n      });\n      return result;\n    }\n    if (value instanceof Set) {\n      const result = new Set<unknown>();\n      visited.set(value, result);\n      value.forEach((setValue) => {\n        result.add(clone(setValue, visited));\n      });\n      return result;\n    }\n    if (value instanceof ArrayBuffer) {\n      const result = value.slice(0);\n      visited.set(value, result);\n      return result;\n    }\n    if (ArrayBuffer.isView(value)) {\n      const result = value instanceof DataView\n        ? new DataView(value.buffer.slice(0), value.byteOffset, value.byteLength)\n        : new (value.constructor as new (source: ArrayLike<number>) => ArrayBufferView)(value as unknown as ArrayLike<number>);\n      visited.set(value, result);\n      return result;\n    }\n\n    const result: Record<PropertyKey, unknown> = Array.isArray(value)\n      ? []\n      : Object.create(Object.getPrototypeOf(value));\n    visited.set(value, result);\n    Reflect.ownKeys(value).forEach((key) => {\n      const descriptor = Object.getOwnPropertyDescriptor(value, key);\n      if (!descriptor) {\n        return;\n      }\n      if (\"value\" in descriptor) {\n        descriptor.value = clone(descriptor.value, visited);\n      }\n      Object.defineProperty(result, key, descriptor);\n    });\n    return result;\n  };\n\n  return clone(obj, new WeakMap<object, unknown>()) as T;\n};\n"],"names":["getCopyOfObj","obj","clone","value","visited","has","get","Date","result","getTime","set","RegExp","source","flags","lastIndex","URL","href","URLSearchParams","Map","forEach","mapValue","key","Set","setValue","add","ArrayBuffer","slice","isView","DataView","buffer","byteOffset","byteLength","constructor","Array","isArray","Object","create","getPrototypeOf","Reflect","ownKeys","descriptor","getOwnPropertyDescriptor","defineProperty","WeakMap"],"mappings":"AAuBO,MAAMA,aAAmBC,MAC9B,MAAMC,MAAQ,CAACC,MAAgBC,WAC7B,GAAID,QAAU,aAAeA,QAAU,SACrC,OAAOA,MAET,GAAIC,QAAQC,IAAIF,OACd,OAAOC,QAAQE,IAAIH,OAErB,GAAIA,iBAAiBI,KAAM,CACzB,MAAMC,OAAS,IAAID,KAAKJ,MAAMM,WAC9BL,QAAQM,IAAIP,MAAOK,QACnB,OAAOA,MACT,CACA,GAAIL,iBAAiBQ,OAAQ,CAE3B,MAAMH,OAAS,IAAIG,OAAOR,MAAMS,OAAQT,MAAMU,OAC9CL,OAAOM,UAAYX,MAAMW,UACzBV,QAAQM,IAAIP,MAAOK,QACnB,OAAOA,MACT,CACA,GAAIL,iBAAiBY,IAAK,CACxB,MAAMP,OAAS,IAAIO,IAAIZ,MAAMa,MAC7BZ,QAAQM,IAAIP,MAAOK,QACnB,OAAOA,MACT,CACA,GAAIL,iBAAiBc,gBAAiB,CACpC,MAAMT,OAAS,IAAIS,gBAAgBd,OACnCC,QAAQM,IAAIP,MAAOK,QACnB,OAAOA,MACT,CACA,GAAIL,iBAAiBe,IAAK,CACxB,MAAMV,OAAS,IAAIU,IACnBd,QAAQM,IAAIP,MAAOK,QACnBL,MAAMgB,QAAQ,CAACC,SAAUC,OACvBb,OAAOE,IAAIR,MAAMmB,IAAKjB,SAAUF,MAAMkB,SAAUhB,YAElD,OAAOI,MACT,CACA,GAAIL,iBAAiBmB,IAAK,CACxB,MAAMd,OAAS,IAAIc,IACnBlB,QAAQM,IAAIP,MAAOK,QACnBL,MAAMgB,QAASI,WACbf,OAAOgB,IAAItB,MAAMqB,SAAUnB,YAE7B,OAAOI,MACT,CACA,GAAIL,iBAAiBsB,YAAa,CAChC,MAAMjB,OAASL,MAAMuB,MAAM,GAC3BtB,QAAQM,IAAIP,MAAOK,QACnB,OAAOA,MACT,CACA,GAAIiB,YAAYE,OAAOxB,OAAQ,CAC7B,MAAMK,OAASL,iBAAiByB,SAC5B,IAAIA,SAASzB,MAAM0B,OAAOH,MAAM,GAAIvB,MAAM2B,WAAY3B,MAAM4B,YAC5D,IAAK5B,MAAM6B,YAAmE7B,OAClFC,QAAQM,IAAIP,MAAOK,QACnB,OAAOA,MACT,CAEA,MAAMA,OAAuCyB,MAAMC,QAAQ/B,OACvD,GACAgC,OAAOC,OAAOD,OAAOE,eAAelC,QACxCC,QAAQM,IAAIP,MAAOK,QACnB8B,QAAQC,QAAQpC,OAAOgB,QAASE,MAC9B,MAAMmB,WAAaL,OAAOM,yBAAyBtC,MAAOkB,KAC1D,IAAKmB,WACH,OAEF,GAAI,UAAWA,WACbA,WAAWrC,MAAQD,MAAMsC,WAAWrC,MAAOC,SAE7C+B,OAAOO,eAAelC,OAAQa,IAAKmB,cAErC,OAAOhC,QAGT,OAAON,MAAMD,IAAK,IAAI0C"}