UNPKG

typia

Version:

Superfast runtime validators with only one line

1 lines 12.8 kB
{"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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"}