{"version":3,"file":"_plainCloneAny.mjs","names":[],"sources":["../../src/internal/_plainCloneAny.ts"],"sourcesContent":["import { Resolved } from \"@typia/interface\";\n\nexport const _plainCloneAny = <T>(value: T): Resolved<T> =>\n  cloneMain(value) as Resolved<T>;\n\nconst NOT_NATIVE = Symbol(\"not-native\");\nconst objectToString = Object.prototype.toString;\nconst getter = (prototype: object, key: PropertyKey): (() => unknown) =>\n  Object.getOwnPropertyDescriptor(prototype, key)!.get!;\nconst read = <T>(accessor: () => unknown, value: object): T =>\n  Reflect.apply(accessor, value, []) as T;\nconst tryRead = <T>(\n  accessor: (() => unknown) | undefined,\n  value: object,\n): { success: true; value: T } | { success: false } => {\n  if (accessor === undefined) return { success: false };\n  try {\n    return { success: true, value: read<T>(accessor, value) };\n  } catch {\n    return { success: false };\n  }\n};\n\nconst arrayBufferByteLength = getter(ArrayBuffer.prototype, \"byteLength\");\nconst sharedArrayBufferByteLength =\n  typeof SharedArrayBuffer === \"undefined\"\n    ? undefined\n    : getter(SharedArrayBuffer.prototype, \"byteLength\");\nconst dataViewBuffer = getter(DataView.prototype, \"buffer\");\nconst dataViewByteLength = getter(DataView.prototype, \"byteLength\");\nconst dataViewByteOffset = getter(DataView.prototype, \"byteOffset\");\nconst typedArrayName = getter(\n  Object.getPrototypeOf(Uint8Array.prototype),\n  Symbol.toStringTag,\n);\nconst blobSize =\n  typeof Blob === \"undefined\" ? undefined : getter(Blob.prototype, \"size\");\nconst blobType =\n  typeof Blob === \"undefined\" ? undefined : getter(Blob.prototype, \"type\");\nconst fileName =\n  typeof File === \"undefined\" ? undefined : getter(File.prototype, \"name\");\nconst fileLastModified =\n  typeof File === \"undefined\"\n    ? undefined\n    : getter(File.prototype, \"lastModified\");\nconst regexpSource = getter(RegExp.prototype, \"source\");\nconst regexpFlags = getter(RegExp.prototype, \"flags\");\n\nconst nativeTag = (value: object): string | undefined => {\n  let tagged: boolean;\n  try {\n    tagged = Symbol.toStringTag in value;\n  } catch {\n    return undefined;\n  }\n  if (!tagged)\n    try {\n      return objectToString.call(value);\n    } catch {\n      return undefined;\n    }\n\n  const date = tryRead<number>(Date.prototype.getTime, value);\n  if (date.success) return \"[object Date]\";\n  const typed = tryRead<string>(typedArrayName, value);\n  if (typed.success && typed.value !== undefined)\n    return `[object ${typed.value}]`;\n  if (tryRead<number>(arrayBufferByteLength, value).success)\n    return \"[object ArrayBuffer]\";\n  if (tryRead<number>(sharedArrayBufferByteLength, value).success)\n    return \"[object SharedArrayBuffer]\";\n  if (tryRead<ArrayBufferLike>(dataViewBuffer, value).success)\n    return \"[object DataView]\";\n  if (tryRead<string>(fileName, value).success) return \"[object File]\";\n  if (tryRead<number>(blobSize, value).success) return \"[object Blob]\";\n  if (tryRead<string>(regexpSource, value).success) return \"[object RegExp]\";\n  return undefined;\n};\n\nconst cloneMain = (value: any): any => {\n  if (value === undefined) return undefined;\n  else if (typeof value === \"object\")\n    if (value === null) return null;\n    else if (Array.isArray(value)) return value.map(cloneMain);\n    else {\n      const native: any | typeof NOT_NATIVE = cloneNative(value);\n      if (native !== NOT_NATIVE) return native;\n      else if (value instanceof Set) return new Set([...value].map(cloneMain));\n      else if (value instanceof Map)\n        return new Map(\n          [...value].map(([k, v]) => [cloneMain(k), cloneMain(v)]),\n        );\n      else if (value instanceof WeakSet || value instanceof WeakMap)\n        throw new Error(\"WeakSet and WeakMap are not supported\");\n      else {\n        const primitive: unknown = value.valueOf();\n        if (primitive !== value) return cloneMain(primitive);\n        return Object.fromEntries(\n          Object.entries(value)\n            .map(([k, v]) => [k, cloneMain(v)])\n            .filter(([, v]) => v !== undefined),\n        );\n      }\n    }\n  else if (typeof value === \"function\") return undefined;\n  return value;\n};\n\nconst cloneNative = (value: object): any | typeof NOT_NATIVE => {\n  const tag: string | undefined = nativeTag(value);\n  switch (tag) {\n    case \"[object Date]\": {\n      const time = tryRead<number>(Date.prototype.getTime, value);\n      return time.success ? new Date(time.value) : NOT_NATIVE;\n    }\n    case \"[object Uint8Array]\":\n      return new Uint8Array(value as ArrayLike<number>);\n    case \"[object Uint8ClampedArray]\":\n      return new Uint8ClampedArray(value as ArrayLike<number>);\n    case \"[object Uint16Array]\":\n      return new Uint16Array(value as ArrayLike<number>);\n    case \"[object Uint32Array]\":\n      return new Uint32Array(value as ArrayLike<number>);\n    case \"[object BigUint64Array]\":\n      return new BigUint64Array(value as ArrayLike<bigint>);\n    case \"[object Int8Array]\":\n      return new Int8Array(value as ArrayLike<number>);\n    case \"[object Int16Array]\":\n      return new Int16Array(value as ArrayLike<number>);\n    case \"[object Int32Array]\":\n      return new Int32Array(value as ArrayLike<number>);\n    case \"[object BigInt64Array]\":\n      return new BigInt64Array(value as ArrayLike<bigint>);\n    case \"[object Float32Array]\":\n      return new Float32Array(value as ArrayLike<number>);\n    case \"[object Float64Array]\":\n      return new Float64Array(value as ArrayLike<number>);\n    case \"[object ArrayBuffer]\": {\n      const byteLength = tryRead<number>(arrayBufferByteLength, value);\n      return byteLength.success\n        ? cloneBufferRange(value as ArrayBuffer, 0, byteLength.value, false)\n        : NOT_NATIVE;\n    }\n    case \"[object SharedArrayBuffer]\": {\n      const byteLength = tryRead<number>(sharedArrayBufferByteLength, value);\n      return byteLength.success\n        ? cloneBufferRange(\n            value as SharedArrayBuffer,\n            0,\n            byteLength.value,\n            true,\n          )\n        : NOT_NATIVE;\n    }\n    case \"[object DataView]\": {\n      const buffer = tryRead<ArrayBufferLike>(dataViewBuffer, value);\n      if (!buffer.success) return NOT_NATIVE;\n      const byteOffset: number = read(dataViewByteOffset, value);\n      const byteLength: number = read(dataViewByteLength, value);\n      return new DataView(\n        cloneBufferRange(buffer.value, byteOffset, byteLength),\n      );\n    }\n    case \"[object File]\": {\n      const size = tryRead<number>(blobSize, value);\n      if (\n        typeof File === \"undefined\" ||\n        !size.success ||\n        blobType === undefined ||\n        fileName === undefined ||\n        fileLastModified === undefined\n      )\n        return NOT_NATIVE;\n      return new File([value as Blob], read<string>(fileName, value), {\n        type: read<string>(blobType, value),\n        lastModified: read<number>(fileLastModified, value),\n      });\n    }\n    case \"[object Blob]\": {\n      const size = tryRead<number>(blobSize, value);\n      if (\n        typeof Blob === \"undefined\" ||\n        !size.success ||\n        blobType === undefined\n      )\n        return NOT_NATIVE;\n      return new Blob([value as Blob], {\n        type: read<string>(blobType, value),\n      });\n    }\n    case \"[object RegExp]\": {\n      const source = tryRead<string>(regexpSource, value);\n      return source.success\n        ? new RegExp(source.value, read<string>(regexpFlags, value))\n        : NOT_NATIVE;\n    }\n    default:\n      return NOT_NATIVE;\n  }\n};\n\nconst cloneBufferRange = (\n  input: ArrayBufferLike,\n  byteOffset: number,\n  byteLength: number,\n  shared?: boolean,\n): ArrayBuffer | SharedArrayBuffer => {\n  if (shared === undefined)\n    shared = tryRead<number>(sharedArrayBufferByteLength, input).success;\n  let output: ArrayBuffer | SharedArrayBuffer;\n  if (shared) {\n    if (typeof SharedArrayBuffer === \"undefined\")\n      throw new TypeError(\"SharedArrayBuffer is not available\");\n    output = new SharedArrayBuffer(byteLength);\n  } else {\n    read<number>(arrayBufferByteLength, input);\n    output = new ArrayBuffer(byteLength);\n  }\n  new Uint8Array(output).set(new Uint8Array(input, byteOffset, byteLength));\n  return output;\n};\n"],"mappings":"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"}