@simplysm/core-common 13.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cache/typecheck-browser.tsbuildinfo +1 -0
- package/.cache/typecheck-node.tsbuildinfo +1 -0
- package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
- package/.cache/typecheck-tests-node.tsbuildinfo +1 -0
- package/README.md +887 -0
- package/dist/common.types.d.ts +74 -0
- package/dist/common.types.d.ts.map +1 -0
- package/dist/common.types.js +5 -0
- package/dist/common.types.js.map +7 -0
- package/dist/env.d.ts +6 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +9 -0
- package/dist/env.js.map +7 -0
- package/dist/errors/argument-error.d.ts +25 -0
- package/dist/errors/argument-error.d.ts.map +1 -0
- package/dist/errors/argument-error.js +18 -0
- package/dist/errors/argument-error.js.map +7 -0
- package/dist/errors/not-implemented-error.d.ts +29 -0
- package/dist/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/errors/not-implemented-error.js +14 -0
- package/dist/errors/not-implemented-error.js.map +7 -0
- package/dist/errors/sd-error.d.ts +27 -0
- package/dist/errors/sd-error.d.ts.map +1 -0
- package/dist/errors/sd-error.js +23 -0
- package/dist/errors/sd-error.js.map +7 -0
- package/dist/errors/timeout-error.d.ts +31 -0
- package/dist/errors/timeout-error.d.ts.map +1 -0
- package/dist/errors/timeout-error.js +17 -0
- package/dist/errors/timeout-error.js.map +7 -0
- package/dist/extensions/arr-ext.d.ts +15 -0
- package/dist/extensions/arr-ext.d.ts.map +1 -0
- package/dist/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/extensions/arr-ext.helpers.js +35 -0
- package/dist/extensions/arr-ext.helpers.js.map +7 -0
- package/dist/extensions/arr-ext.js +546 -0
- package/dist/extensions/arr-ext.js.map +7 -0
- package/dist/extensions/arr-ext.types.d.ts +215 -0
- package/dist/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/extensions/arr-ext.types.js +1 -0
- package/dist/extensions/arr-ext.types.js.map +7 -0
- package/dist/extensions/map-ext.d.ts +57 -0
- package/dist/extensions/map-ext.d.ts.map +1 -0
- package/dist/extensions/map-ext.js +26 -0
- package/dist/extensions/map-ext.js.map +7 -0
- package/dist/extensions/set-ext.d.ts +36 -0
- package/dist/extensions/set-ext.d.ts.map +1 -0
- package/dist/extensions/set-ext.js +29 -0
- package/dist/extensions/set-ext.js.map +7 -0
- package/dist/features/debounce-queue.d.ts +53 -0
- package/dist/features/debounce-queue.d.ts.map +1 -0
- package/dist/features/debounce-queue.js +80 -0
- package/dist/features/debounce-queue.js.map +7 -0
- package/dist/features/event-emitter.d.ts +66 -0
- package/dist/features/event-emitter.d.ts.map +1 -0
- package/dist/features/event-emitter.js +82 -0
- package/dist/features/event-emitter.js.map +7 -0
- package/dist/features/serial-queue.d.ts +47 -0
- package/dist/features/serial-queue.d.ts.map +1 -0
- package/dist/features/serial-queue.js +66 -0
- package/dist/features/serial-queue.js.map +7 -0
- package/dist/globals.d.ts +12 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +1 -0
- package/dist/globals.js.map +7 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +7 -0
- package/dist/types/date-only.d.ts +152 -0
- package/dist/types/date-only.d.ts.map +1 -0
- package/dist/types/date-only.js +251 -0
- package/dist/types/date-only.js.map +7 -0
- package/dist/types/date-time.d.ts +96 -0
- package/dist/types/date-time.d.ts.map +1 -0
- package/dist/types/date-time.js +220 -0
- package/dist/types/date-time.js.map +7 -0
- package/dist/types/lazy-gc-map.d.ts +80 -0
- package/dist/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/types/lazy-gc-map.js +179 -0
- package/dist/types/lazy-gc-map.js.map +7 -0
- package/dist/types/time.d.ts +68 -0
- package/dist/types/time.d.ts.map +1 -0
- package/dist/types/time.js +151 -0
- package/dist/types/time.js.map +7 -0
- package/dist/types/uuid.d.ts +35 -0
- package/dist/types/uuid.d.ts.map +1 -0
- package/dist/types/uuid.js +71 -0
- package/dist/types/uuid.js.map +7 -0
- package/dist/utils/bytes.d.ts +51 -0
- package/dist/utils/bytes.d.ts.map +1 -0
- package/dist/utils/bytes.js +89 -0
- package/dist/utils/bytes.js.map +7 -0
- package/dist/utils/date-format.d.ts +90 -0
- package/dist/utils/date-format.d.ts.map +1 -0
- package/dist/utils/date-format.js +106 -0
- package/dist/utils/date-format.js.map +7 -0
- package/dist/utils/json.d.ts +34 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +152 -0
- package/dist/utils/json.js.map +7 -0
- package/dist/utils/num.d.ts +60 -0
- package/dist/utils/num.d.ts.map +1 -0
- package/dist/utils/num.js +39 -0
- package/dist/utils/num.js.map +7 -0
- package/dist/utils/obj.d.ts +258 -0
- package/dist/utils/obj.d.ts.map +1 -0
- package/dist/utils/obj.js +538 -0
- package/dist/utils/obj.js.map +7 -0
- package/dist/utils/path.d.ts +23 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +21 -0
- package/dist/utils/path.js.map +7 -0
- package/dist/utils/primitive.d.ts +18 -0
- package/dist/utils/primitive.d.ts.map +1 -0
- package/dist/utils/primitive.js +20 -0
- package/dist/utils/primitive.js.map +7 -0
- package/dist/utils/str.d.ts +103 -0
- package/dist/utils/str.d.ts.map +1 -0
- package/dist/utils/str.js +128 -0
- package/dist/utils/str.js.map +7 -0
- package/dist/utils/template-strings.d.ts +84 -0
- package/dist/utils/template-strings.d.ts.map +1 -0
- package/dist/utils/template-strings.js +49 -0
- package/dist/utils/template-strings.js.map +7 -0
- package/dist/utils/transferable.d.ts +47 -0
- package/dist/utils/transferable.d.ts.map +1 -0
- package/dist/utils/transferable.js +153 -0
- package/dist/utils/transferable.js.map +7 -0
- package/dist/utils/wait.d.ts +19 -0
- package/dist/utils/wait.d.ts.map +1 -0
- package/dist/utils/wait.js +19 -0
- package/dist/utils/wait.js.map +7 -0
- package/dist/utils/xml.d.ts +36 -0
- package/dist/utils/xml.d.ts.map +1 -0
- package/dist/utils/xml.js +51 -0
- package/dist/utils/xml.js.map +7 -0
- package/dist/zip/sd-zip.d.ts +80 -0
- package/dist/zip/sd-zip.d.ts.map +1 -0
- package/dist/zip/sd-zip.js +153 -0
- package/dist/zip/sd-zip.js.map +7 -0
- package/package.json +31 -0
- package/src/common.types.ts +91 -0
- package/src/env.ts +11 -0
- package/src/errors/argument-error.ts +40 -0
- package/src/errors/not-implemented-error.ts +32 -0
- package/src/errors/sd-error.ts +53 -0
- package/src/errors/timeout-error.ts +36 -0
- package/src/extensions/arr-ext.helpers.ts +53 -0
- package/src/extensions/arr-ext.ts +777 -0
- package/src/extensions/arr-ext.types.ts +258 -0
- package/src/extensions/map-ext.ts +86 -0
- package/src/extensions/set-ext.ts +68 -0
- package/src/features/debounce-queue.ts +116 -0
- package/src/features/event-emitter.ts +112 -0
- package/src/features/serial-queue.ts +94 -0
- package/src/globals.ts +12 -0
- package/src/index.ts +55 -0
- package/src/types/date-only.ts +329 -0
- package/src/types/date-time.ts +294 -0
- package/src/types/lazy-gc-map.ts +244 -0
- package/src/types/time.ts +210 -0
- package/src/types/uuid.ts +113 -0
- package/src/utils/bytes.ts +160 -0
- package/src/utils/date-format.ts +239 -0
- package/src/utils/json.ts +230 -0
- package/src/utils/num.ts +97 -0
- package/src/utils/obj.ts +956 -0
- package/src/utils/path.ts +40 -0
- package/src/utils/primitive.ts +33 -0
- package/src/utils/str.ts +252 -0
- package/src/utils/template-strings.ts +132 -0
- package/src/utils/transferable.ts +269 -0
- package/src/utils/wait.ts +40 -0
- package/src/utils/xml.ts +105 -0
- package/src/zip/sd-zip.ts +218 -0
- package/tests/errors/errors.spec.ts +196 -0
- package/tests/extensions/array-extension.spec.ts +790 -0
- package/tests/extensions/map-extension.spec.ts +147 -0
- package/tests/extensions/set-extension.spec.ts +74 -0
- package/tests/types/date-only.spec.ts +636 -0
- package/tests/types/date-time.spec.ts +391 -0
- package/tests/types/lazy-gc-map.spec.ts +692 -0
- package/tests/types/time.spec.ts +559 -0
- package/tests/types/types.spec.ts +55 -0
- package/tests/types/uuid.spec.ts +91 -0
- package/tests/utils/bytes-utils.spec.ts +230 -0
- package/tests/utils/date-format.spec.ts +371 -0
- package/tests/utils/debounce-queue.spec.ts +272 -0
- package/tests/utils/json.spec.ts +475 -0
- package/tests/utils/number.spec.ts +184 -0
- package/tests/utils/object.spec.ts +827 -0
- package/tests/utils/path.spec.ts +78 -0
- package/tests/utils/primitive.spec.ts +55 -0
- package/tests/utils/sd-event-emitter.spec.ts +216 -0
- package/tests/utils/serial-queue.spec.ts +365 -0
- package/tests/utils/string.spec.ts +294 -0
- package/tests/utils/template-strings.spec.ts +96 -0
- package/tests/utils/transferable.spec.ts +698 -0
- package/tests/utils/wait.spec.ts +145 -0
- package/tests/utils/xml.spec.ts +146 -0
- package/tests/zip/sd-zip.spec.ts +234 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/json.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * JSON \uBCC0\uD658 \uC720\uD2F8\uB9AC\uD2F0\n * \uCEE4\uC2A4\uD140 \uD0C0\uC785(DateTime, DateOnly, Time, Uuid \uB4F1)\uC744 \uC9C0\uC6D0\uD558\uB294 JSON \uC9C1\uB82C\uD654/\uC5ED\uC9C1\uB82C\uD654\n */\nimport { DateTime } from \"../types/date-time\";\nimport { DateOnly } from \"../types/date-only\";\nimport { Time } from \"../types/time\";\nimport { Uuid } from \"../types/uuid\";\nimport { objNullToUndefined } from \"./obj\";\nimport { SdError } from \"../errors/sd-error\";\nimport { bytesToHex, bytesFromHex } from \"./bytes\";\nimport { env } from \"../env\";\n\ninterface TypedObject {\n __type__: string;\n data: unknown;\n}\n\n//#region stringify\n\n/**\n * \uAC1D\uCCB4\uB97C JSON \uBB38\uC790\uC5F4\uB85C \uC9C1\uB82C\uD654\n * DateTime, DateOnly, Time, Uuid, Set, Map, Error, Uint8Array \uB4F1 \uCEE4\uC2A4\uD140 \uD0C0\uC785 \uC9C0\uC6D0\n *\n * @param obj \uC9C1\uB82C\uD654\uD560 \uAC1D\uCCB4\n * @param options \uC9C1\uB82C\uD654 \uC635\uC158\n * @param options.space JSON \uB4E4\uC5EC\uC4F0\uAE30 (\uC22B\uC790: \uACF5\uBC31 \uC218, \uBB38\uC790\uC5F4: \uB4E4\uC5EC\uC4F0\uAE30 \uBB38\uC790\uC5F4)\n * @param options.replacer \uCEE4\uC2A4\uD140 replacer \uD568\uC218. \uAE30\uBCF8 \uD0C0\uC785 \uBCC0\uD658 \uC804\uC5D0 \uD638\uCD9C\uB428\n * @param options.redactBytes true \uC2DC Uint8Array \uB0B4\uC6A9\uC744 \"__hidden__\"\uC73C\uB85C \uB300\uCCB4 (\uB85C\uAE45\uC6A9). \uC774 \uC635\uC158\uC73C\uB85C \uC9C1\uB82C\uD654\uD55C \uACB0\uACFC\uB294 jsonParse()\uB85C \uC6D0\uBCF8 Uint8Array\uB97C \uBCF5\uC6D0\uD560 \uC218 \uC5C6\uC74C\n *\n * @remarks\n * - \uC21C\uD658 \uCC38\uC870\uAC00 \uC788\uB294 \uAC1D\uCCB4\uB294 TypeError\uB97C \uB358\uC9D0\n * - \uAC1D\uCCB4\uC758 toJSON \uBA54\uC11C\uB4DC\uAC00 \uC788\uC73C\uBA74 \uD638\uCD9C\uD558\uC5EC \uACB0\uACFC\uB97C \uC0AC\uC6A9\uD568 (Date, DateTime \uB4F1 \uCEE4\uC2A4\uD140 \uD0C0\uC785 \uC81C\uC678)\n * - \uC804\uC5ED \uD504\uB85C\uD1A0\uD0C0\uC785\uC744 \uC218\uC815\uD558\uC9C0 \uC54A\uC544 Worker \uD658\uACBD\uC5D0\uC11C\uB3C4 \uC548\uC804\uD568\n */\nexport function jsonStringify(\n obj: unknown,\n options?: {\n space?: string | number;\n replacer?: (key: string | undefined, value: unknown) => unknown;\n redactBytes?: boolean;\n },\n): string {\n // \uC21C\uD658 \uCC38\uC870 \uAC10\uC9C0\uB97C \uC704\uD55C WeakSet\n const seen = new WeakSet<object>();\n\n /**\n * \uC7AC\uADC0\uC801\uC73C\uB85C \uAC1D\uCCB4\uB97C \uC21C\uD68C\uD558\uBA70 \uD2B9\uC218 \uD0C0\uC785\uC744 __type__ \uD615\uC2DD\uC73C\uB85C \uBCC0\uD658\n *\n * JSON.stringify\uC758 replacer\uB294 toJSON \uD638\uCD9C \uD6C4\uC758 \uAC12\uC744 \uBC1B\uC73C\uBBC0\uB85C,\n * Date \uB4F1\uC758 \uD0C0\uC785\uC744 \uC62C\uBC14\uB974\uAC8C \uCC98\uB9AC\uD558\uB824\uBA74 \uBBF8\uB9AC \uBCC0\uD658\uD574\uC57C \uD568.\n * \uC774 \uBC29\uC2DD\uC740 \uC804\uC5ED \uD504\uB85C\uD1A0\uD0C0\uC785\uC744 \uC218\uC815\uD558\uC9C0 \uC54A\uC544 Worker \uD658\uACBD\uC5D0\uC11C\uB3C4 \uC548\uC804\uD568.\n *\n * @param key \uD604\uC7AC \uAC12\uC758 \uD0A4 (\uB8E8\uD2B8\uB294 undefined)\n * @param value \uBCC0\uD658\uD560 \uAC12\n */\n const convertSpecialTypes = (key: string | undefined, value: unknown): unknown => {\n // \uCEE4\uC2A4\uD140 replacer \uC801\uC6A9\n const currValue = options?.replacer !== undefined ? options.replacer(key, value) : value;\n\n if (currValue instanceof Date) {\n return { __type__: \"Date\", data: currValue.toISOString() };\n }\n if (currValue instanceof DateTime) {\n return { __type__: \"DateTime\", data: currValue.toString() };\n }\n if (currValue instanceof DateOnly) {\n return { __type__: \"DateOnly\", data: currValue.toString() };\n }\n if (currValue instanceof Time) {\n return { __type__: \"Time\", data: currValue.toString() };\n }\n if (currValue instanceof Uuid) {\n return { __type__: \"Uuid\", data: currValue.toString() };\n }\n if (currValue instanceof Set) {\n return {\n __type__: \"Set\",\n data: Array.from(currValue).map((item, i) => convertSpecialTypes(String(i), item)),\n };\n }\n if (currValue instanceof Map) {\n return {\n __type__: \"Map\",\n data: Array.from(currValue.entries()).map(([k, v], i) => [\n convertSpecialTypes(String(i), k),\n convertSpecialTypes(String(i), v),\n ]),\n };\n }\n if (currValue instanceof Error) {\n return {\n __type__: \"Error\",\n data: {\n name: currValue.name,\n message: currValue.message,\n stack: currValue.stack,\n ...(\"code\" in currValue ? { code: currValue.code } : {}),\n ...(\"detail\" in currValue ? { detail: currValue.detail } : {}),\n ...(\"cause\" in currValue ? { cause: convertSpecialTypes(\"cause\", currValue.cause) } : {}),\n },\n };\n }\n if (currValue instanceof Uint8Array) {\n if (options?.redactBytes === true) {\n return { __type__: \"Uint8Array\", data: \"__hidden__\" };\n }\n return { __type__: \"Uint8Array\", data: bytesToHex(currValue) };\n }\n\n // \uBC30\uC5F4 \uCC98\uB9AC\n if (Array.isArray(currValue)) {\n // \uC21C\uD658 \uCC38\uC870 \uAC10\uC9C0\n if (seen.has(currValue)) {\n throw new TypeError(\"Converting circular structure to JSON\");\n }\n seen.add(currValue);\n const result = currValue.map((item, i) => convertSpecialTypes(String(i), item));\n seen.delete(currValue);\n return result;\n }\n\n // \uC77C\uBC18 \uAC1D\uCCB4 \uCC98\uB9AC\n if (currValue !== null && typeof currValue === \"object\") {\n // \uC21C\uD658 \uCC38\uC870 \uAC10\uC9C0\n if (seen.has(currValue)) {\n throw new TypeError(\"Converting circular structure to JSON\");\n }\n seen.add(currValue);\n\n // toJSON \uBA54\uC11C\uB4DC\uAC00 \uC788\uC73C\uBA74 \uD638\uCD9C (Date, DateTime \uB4F1 \uCEE4\uC2A4\uD140 \uD0C0\uC785\uC740 \uC774\uBBF8 \uC704\uC5D0\uC11C \uCC98\uB9AC\uB428)\n if (\"toJSON\" in currValue && typeof (currValue as { toJSON: unknown }).toJSON === \"function\") {\n const toJsonResult = (currValue as { toJSON: (key?: string) => unknown }).toJSON(key);\n seen.delete(currValue);\n return convertSpecialTypes(key, toJsonResult);\n }\n\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(currValue)) {\n const converted = convertSpecialTypes(k, v);\n // undefined\uB294 JSON\uC5D0\uC11C \uC81C\uC678\uB428\n if (converted !== undefined) {\n result[k] = converted;\n }\n }\n seen.delete(currValue);\n return result;\n }\n\n return currValue;\n };\n\n // \uC804\uCCB4 \uAC1D\uCCB4\uB97C \uBBF8\uB9AC \uBCC0\uD658 \uD6C4 JSON.stringify \uD638\uCD9C\n // \uC774 \uBC29\uC2DD\uC740 Date.prototype.toJSON\uC744 \uC218\uC815\uD558\uC9C0 \uC54A\uC544 \uB3D9\uC2DC\uC131 \uD658\uACBD\uC5D0\uC11C \uC548\uC804\uD568\n const converted = convertSpecialTypes(undefined, obj);\n return JSON.stringify(converted, null, options?.space);\n}\n\n//#endregion\n\n//#region parse\n\n/**\n * JSON \uBB38\uC790\uC5F4\uC744 \uAC1D\uCCB4\uB85C \uC5ED\uC9C1\uB82C\uD654\n * DateTime, DateOnly, Time, Uuid, Set, Map, Error, Uint8Array \uB4F1 \uCEE4\uC2A4\uD140 \uD0C0\uC785 \uBCF5\uC6D0\n *\n * @remarks\n * `__type__`\uACFC `data` \uD0A4\uB97C \uAC00\uC9C4 \uAC1D\uCCB4\uB294 \uD0C0\uC785 \uBCF5\uC6D0\uC5D0 \uC0AC\uC6A9\uB41C\uB2E4.\n * \uC0AC\uC6A9\uC790 \uB370\uC774\uD130\uC5D0 `{ __type__: \"Date\" | \"DateTime\" | \"DateOnly\" | \"Time\" | \"Uuid\" | \"Set\" | \"Map\" | \"Error\" | \"Uint8Array\", data: ... }`\n * \uD615\uD0DC\uAC00 \uC788\uC73C\uBA74 \uC758\uB3C4\uCE58 \uC54A\uAC8C \uD0C0\uC785 \uBCC0\uD658\uB420 \uC218 \uC788\uC73C\uBBC0\uB85C \uC8FC\uC758\uD55C\uB2E4.\n *\n * @security \uAC1C\uBC1C \uBAA8\uB4DC(`__DEV__`)\uC5D0\uC11C\uB9CC \uC5D0\uB7EC \uBA54\uC2DC\uC9C0\uC5D0 JSON \uBB38\uC790\uC5F4 \uC804\uCCB4\uAC00 \uD3EC\uD568\uB41C\uB2E4.\n * \uD504\uB85C\uB355\uC158 \uBAA8\uB4DC\uC5D0\uC11C\uB294 JSON \uAE38\uC774\uB9CC \uD3EC\uD568\uB41C\uB2E4.\n */\nexport function jsonParse<T = unknown>(json: string): T {\n try {\n return objNullToUndefined(\n JSON.parse(json, (_key, value: unknown) => {\n if (value != null && typeof value === \"object\") {\n // __type__ \uAE30\uBC18 \uD0C0\uC785 \uBCF5\uC6D0\n if (\"__type__\" in value && \"data\" in value) {\n const typed = value as TypedObject;\n if (typed.__type__ === \"Date\" && typeof typed.data === \"string\") {\n return new Date(Date.parse(typed.data));\n }\n if (typed.__type__ === \"DateTime\" && typeof typed.data === \"string\") {\n return DateTime.parse(typed.data);\n }\n if (typed.__type__ === \"DateOnly\" && typeof typed.data === \"string\") {\n return DateOnly.parse(typed.data);\n }\n if (typed.__type__ === \"Time\" && typeof typed.data === \"string\") {\n return Time.parse(typed.data);\n }\n if (typed.__type__ === \"Uuid\" && typeof typed.data === \"string\") {\n return new Uuid(typed.data);\n }\n if (typed.__type__ === \"Set\" && Array.isArray(typed.data)) {\n return new Set(typed.data);\n }\n if (typed.__type__ === \"Map\" && Array.isArray(typed.data)) {\n return new Map(typed.data as [unknown, unknown][]);\n }\n if (typed.__type__ === \"Error\" && typeof typed.data === \"object\") {\n const errorData = typed.data as Record<string, unknown>;\n const error = new Error(errorData[\"message\"] as string);\n Object.assign(error, errorData);\n return error;\n }\n if (typed.__type__ === \"Uint8Array\" && typeof typed.data === \"string\") {\n if (typed.data === \"__hidden__\") {\n throw new SdError(\"redactBytes \uC635\uC158\uC73C\uB85C \uC9C1\uB82C\uD654\uB41C Uint8Array\uB294 parse\uB85C \uBCF5\uC6D0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4\");\n }\n return bytesFromHex(typed.data);\n }\n }\n }\n\n return value;\n }),\n ) as T;\n } catch (err) {\n if (env.DEV) {\n throw new SdError(err, \"JSON \uD30C\uC2F1 \uC5D0\uB7EC: \\n\" + json);\n }\n throw new SdError(err, `JSON \uD30C\uC2F1 \uC5D0\uB7EC (length: ${json.length})`);\n }\n}\n\n//#endregion\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["converted"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 숫자 유틸리티 함수
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 문자열을 정수로 파싱
|
|
6
|
+
* 숫자가 아닌 문자(0-9, -, . 제외)는 제거 후 파싱
|
|
7
|
+
*
|
|
8
|
+
* @note 소수점이 포함된 문자열은 정수 부분만 반환됩니다 (예: '12.34' → 12).
|
|
9
|
+
* 반올림이 필요하면 {@link numParseRoundedInt}를 사용하세요.
|
|
10
|
+
* @note 문자열 중간의 `-`도 유지되므로 의도치 않은 음수가 될 수 있습니다.
|
|
11
|
+
* 예: `"가-123나"` → `-123`
|
|
12
|
+
*/
|
|
13
|
+
export declare function numParseInt(text: unknown): number | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* 문자열을 실수로 파싱 후 반올림하여 정수 반환
|
|
16
|
+
*/
|
|
17
|
+
export declare function numParseRoundedInt(text: unknown): number | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* 문자열을 실수로 파싱
|
|
20
|
+
* 숫자가 아닌 문자는 제거 후 파싱
|
|
21
|
+
*/
|
|
22
|
+
export declare function numParseFloat(text: unknown): number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* undefined, null, 0 체크 (타입 가드)
|
|
25
|
+
*
|
|
26
|
+
* 타입 가드로 동작하여, true 반환 시 `val`이 `0 | undefined`임을 보장합니다.
|
|
27
|
+
* false 반환 시 `val`이 0이 아닌 유효한 숫자임이 보장됩니다.
|
|
28
|
+
*
|
|
29
|
+
* @param val 체크할 값
|
|
30
|
+
* @returns undefined, null, 0이면 true
|
|
31
|
+
* @example
|
|
32
|
+
* const count: number | undefined = getValue();
|
|
33
|
+
* if (numIsNullOrEmpty(count)) {
|
|
34
|
+
* // count: 0 | undefined
|
|
35
|
+
* console.log("비어있음");
|
|
36
|
+
* } else {
|
|
37
|
+
* // count: number (0이 아닌 값)
|
|
38
|
+
* console.log(`개수: ${count}`);
|
|
39
|
+
* }
|
|
40
|
+
*/
|
|
41
|
+
export declare function numIsNullOrEmpty(val: number | undefined): val is 0 | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* 숫자를 천단위 구분자가 포함된 문자열로 포맷팅
|
|
44
|
+
* @param val 포맷팅할 숫자
|
|
45
|
+
* @param digit 소수점 자릿수 옵션
|
|
46
|
+
* @param digit.max 최대 소수점 자릿수
|
|
47
|
+
* @param digit.min 최소 소수점 자릿수 (부족하면 0으로 채움)
|
|
48
|
+
* @example
|
|
49
|
+
* numFormat(1234.567, { max: 2 }) // "1,234.57"
|
|
50
|
+
* numFormat(1234, { min: 2 }) // "1,234.00"
|
|
51
|
+
*/
|
|
52
|
+
export declare function numFormat(val: number, digit?: {
|
|
53
|
+
max?: number;
|
|
54
|
+
min?: number;
|
|
55
|
+
}): string;
|
|
56
|
+
export declare function numFormat(val: number | undefined, digit?: {
|
|
57
|
+
max?: number;
|
|
58
|
+
min?: number;
|
|
59
|
+
}): string | undefined;
|
|
60
|
+
//# sourceMappingURL=num.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"num.d.ts","sourceRoot":"","sources":["../../src/utils/num.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ/D;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,IAAI,CAAC,GAAG,SAAS,CAE9E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC;AACvF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function numParseInt(text) {
|
|
2
|
+
if (typeof text === "number") return Math.trunc(text);
|
|
3
|
+
if (typeof text !== "string") return void 0;
|
|
4
|
+
const txt = text.replace(/[^0-9.\-]/g, "").trim();
|
|
5
|
+
if (txt === "") return void 0;
|
|
6
|
+
const result = Number.parseInt(txt, 10);
|
|
7
|
+
if (Number.isNaN(result)) return void 0;
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
function numParseRoundedInt(text) {
|
|
11
|
+
const float = numParseFloat(text);
|
|
12
|
+
return float !== void 0 ? Math.round(float) : void 0;
|
|
13
|
+
}
|
|
14
|
+
function numParseFloat(text) {
|
|
15
|
+
if (typeof text === "number") return text;
|
|
16
|
+
if (typeof text !== "string") return void 0;
|
|
17
|
+
const txt = text.replace(/[^0-9.\-]/g, "").trim();
|
|
18
|
+
if (txt === "") return void 0;
|
|
19
|
+
const result = Number.parseFloat(txt);
|
|
20
|
+
if (Number.isNaN(result)) return void 0;
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
function numIsNullOrEmpty(val) {
|
|
24
|
+
return val == null || val === 0;
|
|
25
|
+
}
|
|
26
|
+
function numFormat(val, digit) {
|
|
27
|
+
return val == null ? void 0 : val.toLocaleString(void 0, {
|
|
28
|
+
maximumFractionDigits: digit == null ? void 0 : digit.max,
|
|
29
|
+
minimumFractionDigits: digit == null ? void 0 : digit.min
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
numFormat,
|
|
34
|
+
numIsNullOrEmpty,
|
|
35
|
+
numParseFloat,
|
|
36
|
+
numParseInt,
|
|
37
|
+
numParseRoundedInt
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=num.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/num.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * \uC22B\uC790 \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\n */\n\n//#region numParseInt / numParseFloat / numParseRoundedInt\n\n/**\n * \uBB38\uC790\uC5F4\uC744 \uC815\uC218\uB85C \uD30C\uC2F1\n * \uC22B\uC790\uAC00 \uC544\uB2CC \uBB38\uC790(0-9, -, . \uC81C\uC678)\uB294 \uC81C\uAC70 \uD6C4 \uD30C\uC2F1\n *\n * @note \uC18C\uC218\uC810\uC774 \uD3EC\uD568\uB41C \uBB38\uC790\uC5F4\uC740 \uC815\uC218 \uBD80\uBD84\uB9CC \uBC18\uD658\uB429\uB2C8\uB2E4 (\uC608: '12.34' \u2192 12).\n * \uBC18\uC62C\uB9BC\uC774 \uD544\uC694\uD558\uBA74 {@link numParseRoundedInt}\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.\n * @note \uBB38\uC790\uC5F4 \uC911\uAC04\uC758 `-`\uB3C4 \uC720\uC9C0\uB418\uBBC0\uB85C \uC758\uB3C4\uCE58 \uC54A\uC740 \uC74C\uC218\uAC00 \uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\n * \uC608: `\"\uAC00-123\uB098\"` \u2192 `-123`\n */\nexport function numParseInt(text: unknown): number | undefined {\n if (typeof text === \"number\") return Math.trunc(text);\n if (typeof text !== \"string\") return undefined;\n const txt = text.replace(/[^0-9.\\-]/g, \"\").trim();\n if (txt === \"\") return undefined;\n const result = Number.parseInt(txt, 10);\n if (Number.isNaN(result)) return undefined;\n return result;\n}\n\n/**\n * \uBB38\uC790\uC5F4\uC744 \uC2E4\uC218\uB85C \uD30C\uC2F1 \uD6C4 \uBC18\uC62C\uB9BC\uD558\uC5EC \uC815\uC218 \uBC18\uD658\n */\nexport function numParseRoundedInt(text: unknown): number | undefined {\n const float = numParseFloat(text);\n return float !== undefined ? Math.round(float) : undefined;\n}\n\n/**\n * \uBB38\uC790\uC5F4\uC744 \uC2E4\uC218\uB85C \uD30C\uC2F1\n * \uC22B\uC790\uAC00 \uC544\uB2CC \uBB38\uC790\uB294 \uC81C\uAC70 \uD6C4 \uD30C\uC2F1\n */\nexport function numParseFloat(text: unknown): number | undefined {\n if (typeof text === \"number\") return text;\n if (typeof text !== \"string\") return undefined;\n const txt = text.replace(/[^0-9.\\-]/g, \"\").trim();\n if (txt === \"\") return undefined;\n const result = Number.parseFloat(txt);\n if (Number.isNaN(result)) return undefined;\n return result;\n}\n\n//#endregion\n\n//#region numIsNullOrEmpty\n\n/**\n * undefined, null, 0 \uCCB4\uD06C (\uD0C0\uC785 \uAC00\uB4DC)\n *\n * \uD0C0\uC785 \uAC00\uB4DC\uB85C \uB3D9\uC791\uD558\uC5EC, true \uBC18\uD658 \uC2DC `val`\uC774 `0 | undefined`\uC784\uC744 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.\n * false \uBC18\uD658 \uC2DC `val`\uC774 0\uC774 \uC544\uB2CC \uC720\uD6A8\uD55C \uC22B\uC790\uC784\uC774 \uBCF4\uC7A5\uB429\uB2C8\uB2E4.\n *\n * @param val \uCCB4\uD06C\uD560 \uAC12\n * @returns undefined, null, 0\uC774\uBA74 true\n * @example\n * const count: number | undefined = getValue();\n * if (numIsNullOrEmpty(count)) {\n * // count: 0 | undefined\n * console.log(\"\uBE44\uC5B4\uC788\uC74C\");\n * } else {\n * // count: number (0\uC774 \uC544\uB2CC \uAC12)\n * console.log(`\uAC1C\uC218: ${count}`);\n * }\n */\nexport function numIsNullOrEmpty(val: number | undefined): val is 0 | undefined {\n return val == null || val === 0;\n}\n\n//#endregion\n\n//#region numFormat\n\n/**\n * \uC22B\uC790\uB97C \uCC9C\uB2E8\uC704 \uAD6C\uBD84\uC790\uAC00 \uD3EC\uD568\uB41C \uBB38\uC790\uC5F4\uB85C \uD3EC\uB9F7\uD305\n * @param val \uD3EC\uB9F7\uD305\uD560 \uC22B\uC790\n * @param digit \uC18C\uC218\uC810 \uC790\uB9BF\uC218 \uC635\uC158\n * @param digit.max \uCD5C\uB300 \uC18C\uC218\uC810 \uC790\uB9BF\uC218\n * @param digit.min \uCD5C\uC18C \uC18C\uC218\uC810 \uC790\uB9BF\uC218 (\uBD80\uC871\uD558\uBA74 0\uC73C\uB85C \uCC44\uC6C0)\n * @example\n * numFormat(1234.567, { max: 2 }) // \"1,234.57\"\n * numFormat(1234, { min: 2 }) // \"1,234.00\"\n */\nexport function numFormat(val: number, digit?: { max?: number; min?: number }): string;\nexport function numFormat(val: number | undefined, digit?: { max?: number; min?: number }): string | undefined;\nexport function numFormat(val: number | undefined, digit?: { max?: number; min?: number }): string | undefined {\n return val?.toLocaleString(undefined, {\n maximumFractionDigits: digit?.max,\n minimumFractionDigits: digit?.min,\n });\n}\n\n//#endregion\n"],
|
|
5
|
+
"mappings": "AAeO,SAAS,YAAY,MAAmC;AAC7D,MAAI,OAAO,SAAS,SAAU,QAAO,KAAK,MAAM,IAAI;AACpD,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAM,MAAM,KAAK,QAAQ,cAAc,EAAE,EAAE,KAAK;AAChD,MAAI,QAAQ,GAAI,QAAO;AACvB,QAAM,SAAS,OAAO,SAAS,KAAK,EAAE;AACtC,MAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,SAAO;AACT;AAKO,SAAS,mBAAmB,MAAmC;AACpE,QAAM,QAAQ,cAAc,IAAI;AAChC,SAAO,UAAU,SAAY,KAAK,MAAM,KAAK,IAAI;AACnD;AAMO,SAAS,cAAc,MAAmC;AAC/D,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAM,MAAM,KAAK,QAAQ,cAAc,EAAE,EAAE,KAAK;AAChD,MAAI,QAAQ,GAAI,QAAO;AACvB,QAAM,SAAS,OAAO,WAAW,GAAG;AACpC,MAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,SAAO;AACT;AAwBO,SAAS,iBAAiB,KAA+C;AAC9E,SAAO,OAAO,QAAQ,QAAQ;AAChC;AAkBO,SAAS,UAAU,KAAyB,OAA4D;AAC7G,SAAO,2BAAK,eAAe,QAAW;AAAA,IACpC,uBAAuB,+BAAO;AAAA,IAC9B,uBAAuB,+BAAO;AAAA,EAChC;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 깊은 복사
|
|
3
|
+
* - 순환 참조 지원
|
|
4
|
+
* - 커스텀 타입(DateTime, DateOnly, Time, Uuid, Uint8Array) 복사 지원
|
|
5
|
+
*
|
|
6
|
+
* @note 함수, Symbol은 복사되지 않고 참조가 유지됨
|
|
7
|
+
* @note WeakMap, WeakSet은 지원되지 않음 (일반 객체로 복사되어 빈 객체가 됨)
|
|
8
|
+
* @note 프로토타입 체인은 유지됨 (Object.setPrototypeOf 사용)
|
|
9
|
+
* @note getter/setter는 현재 값으로 평가되어 복사됨 (접근자 속성 자체는 복사되지 않음)
|
|
10
|
+
*/
|
|
11
|
+
export declare function objClone<T>(source: T): T;
|
|
12
|
+
/** objEqual 옵션 타입 */
|
|
13
|
+
export interface EqualOptions {
|
|
14
|
+
/** 비교할 키 목록. 지정 시 해당 키만 비교 (최상위 레벨에만 적용) */
|
|
15
|
+
topLevelIncludes?: string[];
|
|
16
|
+
/** 비교에서 제외할 키 목록 (최상위 레벨에만 적용) */
|
|
17
|
+
topLevelExcludes?: string[];
|
|
18
|
+
/** 배열 순서 무시 여부. true 시 O(n²) 복잡도 */
|
|
19
|
+
ignoreArrayIndex?: boolean;
|
|
20
|
+
/** 얕은 비교 여부. true 시 1단계만 비교 (참조 비교) */
|
|
21
|
+
onlyOneDepth?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 깊은 비교
|
|
25
|
+
*
|
|
26
|
+
* @param source 비교 대상 1
|
|
27
|
+
* @param target 비교 대상 2
|
|
28
|
+
* @param options 비교 옵션
|
|
29
|
+
* @param options.topLevelIncludes 비교할 키 목록. 지정 시 해당 키만 비교 (최상위 레벨에만 적용)
|
|
30
|
+
* @example `{ topLevelIncludes: ["id", "name"] }` - id, name 키만 비교
|
|
31
|
+
* @param options.topLevelExcludes 비교에서 제외할 키 목록 (최상위 레벨에만 적용)
|
|
32
|
+
* @example `{ topLevelExcludes: ["updatedAt"] }` - updatedAt 키를 제외하고 비교
|
|
33
|
+
* @param options.ignoreArrayIndex 배열 순서 무시 여부. true 시 O(n²) 복잡도
|
|
34
|
+
* @param options.onlyOneDepth 얕은 비교 여부. true 시 1단계만 비교 (참조 비교)
|
|
35
|
+
*
|
|
36
|
+
* @note topLevelIncludes/topLevelExcludes 옵션은 object 속성 키에만 적용됨.
|
|
37
|
+
* Map의 모든 키는 항상 비교에 포함됨.
|
|
38
|
+
* @note 성능 고려사항:
|
|
39
|
+
* - 기본 배열 비교: O(n) 시간 복잡도
|
|
40
|
+
* - `ignoreArrayIndex: true` 사용 시: O(n²) 시간 복잡도
|
|
41
|
+
* (대용량 배열에서 성능 저하 가능)
|
|
42
|
+
* @note `ignoreArrayIndex: true` 동작 특성:
|
|
43
|
+
* - 배열 순서를 무시하고 동일한 요소들의 순열인지 비교
|
|
44
|
+
* - 예: `[1,2,3]`과 `[3,2,1]` → true, `[1,1,1]`과 `[1,2,3]` → false
|
|
45
|
+
*/
|
|
46
|
+
export declare function objEqual(source: unknown, target: unknown, options?: EqualOptions): boolean;
|
|
47
|
+
/** objMerge 옵션 타입 */
|
|
48
|
+
export interface ObjMergeOptions {
|
|
49
|
+
/** 배열 처리 방식. "replace": target으로 대체(기본), "concat": 합침(중복 제거) */
|
|
50
|
+
arrayProcess?: "replace" | "concat";
|
|
51
|
+
/** target이 null일 때 해당 키 삭제 여부 */
|
|
52
|
+
useDelTargetNull?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 깊은 병합 (source를 base로 target을 병합)
|
|
56
|
+
*
|
|
57
|
+
* @param source 기준 객체
|
|
58
|
+
* @param target 병합할 객체
|
|
59
|
+
* @param opt 병합 옵션
|
|
60
|
+
* @param opt.arrayProcess 배열 처리 방식
|
|
61
|
+
* - `"replace"`: target 배열로 대체 (기본값)
|
|
62
|
+
* - `"concat"`: source와 target 배열을 합침 (Set으로 중복 제거)
|
|
63
|
+
* @param opt.useDelTargetNull target 값이 null일 때 해당 키 삭제 여부
|
|
64
|
+
* - `true`: target이 null이면 결과에서 해당 키 삭제
|
|
65
|
+
* - `false` 또는 미지정: source 값 유지
|
|
66
|
+
*
|
|
67
|
+
* @note 원본 객체를 수정하지 않고 새 객체를 반환함 (불변성 보장)
|
|
68
|
+
* @note arrayProcess="concat" 사용 시 Set을 통해 중복을 제거하며,
|
|
69
|
+
* 객체 배열의 경우 참조(주소) 비교로 중복을 판단함
|
|
70
|
+
* @note 타입이 다른 경우 target 값으로 덮어씀
|
|
71
|
+
*/
|
|
72
|
+
export declare function objMerge<T, P>(source: T, target: P, opt?: ObjMergeOptions): T & P;
|
|
73
|
+
/** merge3 옵션 타입 */
|
|
74
|
+
export interface ObjMerge3KeyOptions {
|
|
75
|
+
/** 비교할 하위 키 목록 (equal의 topLevelIncludes와 동일) */
|
|
76
|
+
keys?: string[];
|
|
77
|
+
/** 비교에서 제외할 하위 키 목록 */
|
|
78
|
+
excludes?: string[];
|
|
79
|
+
/** 배열 순서 무시 여부 */
|
|
80
|
+
ignoreArrayIndex?: boolean;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 3-way 병합
|
|
84
|
+
*
|
|
85
|
+
* source, origin, target 세 객체를 비교하여 병합합니다.
|
|
86
|
+
* - source와 origin이 같고 target이 다르면 → target 값 사용
|
|
87
|
+
* - target과 origin이 같고 source가 다르면 → source 값 사용
|
|
88
|
+
* - source와 target이 같으면 → 해당 값 사용
|
|
89
|
+
* - 세 값이 모두 다르면 → 충돌 발생 (origin 값 유지)
|
|
90
|
+
*
|
|
91
|
+
* @param source 변경된 버전 1
|
|
92
|
+
* @param origin 기준 버전 (공통 조상)
|
|
93
|
+
* @param target 변경된 버전 2
|
|
94
|
+
* @param optionsObj 키별 비교 옵션. 각 키에 대해 equal() 비교 옵션을 개별 지정
|
|
95
|
+
* - `keys`: 비교할 하위 키 목록 (equal의 topLevelIncludes와 동일)
|
|
96
|
+
* - `excludes`: 비교에서 제외할 하위 키 목록
|
|
97
|
+
* - `ignoreArrayIndex`: 배열 순서 무시 여부
|
|
98
|
+
* @returns conflict: 충돌 발생 여부, result: 병합 결과
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* const { conflict, result } = merge3(
|
|
102
|
+
* { a: 1, b: 2 }, // source
|
|
103
|
+
* { a: 1, b: 1 }, // origin
|
|
104
|
+
* { a: 2, b: 1 }, // target
|
|
105
|
+
* );
|
|
106
|
+
* // conflict: false, result: { a: 2, b: 2 }
|
|
107
|
+
*/
|
|
108
|
+
export declare function objMerge3<S extends Record<string, unknown>, O extends Record<string, unknown>, T extends Record<string, unknown>>(source: S, origin: O, target: T, optionsObj?: Record<string, ObjMerge3KeyOptions>): {
|
|
109
|
+
conflict: boolean;
|
|
110
|
+
result: O & S & T;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* 객체에서 특정 키들을 제외
|
|
114
|
+
* @param item 원본 객체
|
|
115
|
+
* @param omitKeys 제외할 키 배열
|
|
116
|
+
* @returns 지정된 키가 제외된 새 객체
|
|
117
|
+
* @example
|
|
118
|
+
* const user = { name: "Alice", age: 30, email: "alice@example.com" };
|
|
119
|
+
* objOmit(user, ["email"]);
|
|
120
|
+
* // { name: "Alice", age: 30 }
|
|
121
|
+
*/
|
|
122
|
+
export declare function objOmit<T extends Record<string, unknown>, K extends keyof T>(item: T, omitKeys: K[]): Omit<T, K>;
|
|
123
|
+
/**
|
|
124
|
+
* 조건에 맞는 키들을 제외
|
|
125
|
+
* @internal
|
|
126
|
+
* @param item 원본 객체
|
|
127
|
+
* @param omitKeyFn 키를 받아 제외 여부를 반환하는 함수 (true면 제외)
|
|
128
|
+
* @returns 조건에 맞는 키가 제외된 새 객체
|
|
129
|
+
* @example
|
|
130
|
+
* const data = { name: "Alice", _internal: "secret", age: 30 };
|
|
131
|
+
* objOmitByFilter(data, (key) => key.startsWith("_"));
|
|
132
|
+
* // { name: "Alice", age: 30 }
|
|
133
|
+
*/
|
|
134
|
+
export declare function objOmitByFilter<T extends Record<string, unknown>>(item: T, omitKeyFn: (key: keyof T) => boolean): T;
|
|
135
|
+
/**
|
|
136
|
+
* 객체에서 특정 키들만 선택
|
|
137
|
+
* @param item 원본 객체
|
|
138
|
+
* @param keys 선택할 키 배열
|
|
139
|
+
* @returns 지정된 키만 포함된 새 객체
|
|
140
|
+
* @example
|
|
141
|
+
* const user = { name: "Alice", age: 30, email: "alice@example.com" };
|
|
142
|
+
* objPick(user, ["name", "age"]);
|
|
143
|
+
* // { name: "Alice", age: 30 }
|
|
144
|
+
*/
|
|
145
|
+
export declare function objPick<T extends Record<string, unknown>, K extends keyof T>(item: T, keys: K[]): Pick<T, K>;
|
|
146
|
+
/**
|
|
147
|
+
* 체인 경로로 값 가져오기
|
|
148
|
+
* @example objGetChainValue(obj, "a.b[0].c")
|
|
149
|
+
*/
|
|
150
|
+
export declare function objGetChainValue(obj: unknown, chain: string, optional: true): unknown | undefined;
|
|
151
|
+
export declare function objGetChainValue(obj: unknown, chain: string): unknown;
|
|
152
|
+
/**
|
|
153
|
+
* depth만큼 같은 키로 내려가기
|
|
154
|
+
* @internal
|
|
155
|
+
* @param obj 대상 객체
|
|
156
|
+
* @param key 내려갈 키
|
|
157
|
+
* @param depth 내려갈 깊이 (1 이상)
|
|
158
|
+
* @param optional true면 중간에 null/undefined가 있어도 에러 없이 undefined 반환
|
|
159
|
+
* @throws ArgumentError depth가 1 미만일 경우
|
|
160
|
+
* @example objGetChainValueByDepth({ parent: { parent: { name: 'a' } } }, 'parent', 2) => { name: 'a' }
|
|
161
|
+
*/
|
|
162
|
+
export declare function objGetChainValueByDepth<T, K extends keyof T>(obj: T, key: K, depth: number, optional: true): T[K] | undefined;
|
|
163
|
+
export declare function objGetChainValueByDepth<T, K extends keyof T>(obj: T, key: K, depth: number): T[K];
|
|
164
|
+
/**
|
|
165
|
+
* 체인 경로로 값 설정
|
|
166
|
+
* @example objSetChainValue(obj, "a.b[0].c", value)
|
|
167
|
+
*/
|
|
168
|
+
export declare function objSetChainValue(obj: unknown, chain: string, value: unknown): void;
|
|
169
|
+
/**
|
|
170
|
+
* 체인 경로의 값 삭제
|
|
171
|
+
* @example objDeleteChainValue(obj, "a.b[0].c")
|
|
172
|
+
*/
|
|
173
|
+
export declare function objDeleteChainValue(obj: unknown, chain: string): void;
|
|
174
|
+
/**
|
|
175
|
+
* 객체에서 undefined 값을 가진 키 삭제
|
|
176
|
+
* @internal
|
|
177
|
+
*
|
|
178
|
+
* @mutates 원본 객체를 직접 수정함
|
|
179
|
+
*/
|
|
180
|
+
export declare function objClearUndefined<T extends object>(obj: T): T;
|
|
181
|
+
/**
|
|
182
|
+
* 객체의 모든 키 삭제
|
|
183
|
+
* @internal
|
|
184
|
+
*
|
|
185
|
+
* @mutates 원본 객체를 직접 수정함
|
|
186
|
+
*/
|
|
187
|
+
export declare function objClear<T extends Record<string, unknown>>(obj: T): Record<string, never>;
|
|
188
|
+
/**
|
|
189
|
+
* null을 undefined로 변환 (재귀적)
|
|
190
|
+
* @internal
|
|
191
|
+
*
|
|
192
|
+
* @mutates 원본 배열/객체를 직접 수정함
|
|
193
|
+
*/
|
|
194
|
+
export declare function objNullToUndefined<T>(obj: T): T | undefined;
|
|
195
|
+
/**
|
|
196
|
+
* flat된 객체를 nested 객체로 변환
|
|
197
|
+
* @internal
|
|
198
|
+
* @example objUnflatten({ "a.b.c": 1 }) => { a: { b: { c: 1 } } }
|
|
199
|
+
*/
|
|
200
|
+
export declare function objUnflatten(flatObj: Record<string, unknown>): Record<string, unknown>;
|
|
201
|
+
/**
|
|
202
|
+
* undefined를 가진 프로퍼티를 optional로 변환
|
|
203
|
+
* @example { a: string; b: string | undefined } → { a: string; b?: string | undefined }
|
|
204
|
+
*/
|
|
205
|
+
export type ObjUndefToOptional<T> = {
|
|
206
|
+
[K in keyof T as undefined extends T[K] ? K : never]?: T[K];
|
|
207
|
+
} & {
|
|
208
|
+
[K in keyof T as undefined extends T[K] ? never : K]: T[K];
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* optional 프로퍼티를 required + undefined 유니온으로 변환
|
|
212
|
+
* @example { a: string; b?: string } → { a: string; b: string | undefined }
|
|
213
|
+
*/
|
|
214
|
+
export type ObjOptionalToUndef<T> = {
|
|
215
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? T[K] | undefined : T[K];
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* Object.keys의 타입 안전한 버전
|
|
219
|
+
* @param obj 키를 추출할 객체
|
|
220
|
+
* @returns 객체의 키 배열
|
|
221
|
+
*/
|
|
222
|
+
export declare function objKeys<T extends object>(obj: T): (keyof T)[];
|
|
223
|
+
/**
|
|
224
|
+
* Object.entries의 타입 안전한 버전
|
|
225
|
+
* @param obj 엔트리를 추출할 객체
|
|
226
|
+
* @returns [키, 값] 튜플 배열
|
|
227
|
+
*/
|
|
228
|
+
export declare function objEntries<T extends object>(obj: T): ObjEntries<T>;
|
|
229
|
+
/**
|
|
230
|
+
* Object.fromEntries의 타입 안전한 버전
|
|
231
|
+
* @param entries [키, 값] 튜플 배열
|
|
232
|
+
* @returns 생성된 객체
|
|
233
|
+
*/
|
|
234
|
+
export declare function objFromEntries<T extends [string, unknown]>(entries: T[]): {
|
|
235
|
+
[K in T[0]]: T[1];
|
|
236
|
+
};
|
|
237
|
+
type ObjEntries<T> = {
|
|
238
|
+
[K in keyof T]: [K, T[K]];
|
|
239
|
+
}[keyof T][];
|
|
240
|
+
/**
|
|
241
|
+
* 객체의 각 엔트리를 변환하여 새 객체 반환
|
|
242
|
+
* @param obj 변환할 객체
|
|
243
|
+
* @param fn 변환 함수 (key, value) => [newKey, newValue]
|
|
244
|
+
* @returns 변환된 키와 값을 가진 새 객체
|
|
245
|
+
* @example
|
|
246
|
+
* const colors = { primary: "255, 0, 0", secondary: "0, 255, 0" };
|
|
247
|
+
*
|
|
248
|
+
* // 값만 변환
|
|
249
|
+
* objMap(colors, (key, rgb) => [null, `rgb(${rgb})`]);
|
|
250
|
+
* // { primary: "rgb(255, 0, 0)", secondary: "rgb(0, 255, 0)" }
|
|
251
|
+
*
|
|
252
|
+
* // 키와 값 모두 변환
|
|
253
|
+
* objMap(colors, (key, rgb) => [`${key}Light`, `rgb(${rgb})`]);
|
|
254
|
+
* // { primaryLight: "rgb(255, 0, 0)", secondaryLight: "rgb(0, 255, 0)" }
|
|
255
|
+
*/
|
|
256
|
+
export declare function objMap<T extends object, NK extends string, NV>(obj: T, fn: (key: keyof T, value: T[keyof T]) => [NK | null, NV]): Record<NK | Extract<keyof T, string>, NV>;
|
|
257
|
+
export {};
|
|
258
|
+
//# sourceMappingURL=obj.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obj.d.ts","sourceRoot":"","sources":["../../src/utils/obj.ts"],"names":[],"mappings":"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"}
|