@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/types/uuid.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Bytes } from \"../common.types\";\nimport { ArgumentError } from \"../errors/argument-error\";\n\n/**\n * UUID v4 \uD074\uB798\uC2A4\n *\n * crypto.getRandomValues \uAE30\uBC18\uC73C\uB85C \uC554\uD638\uD559\uC801\uC73C\uB85C \uC548\uC804\uD55C UUID\uB97C \uC0DD\uC131\uD55C\uB2E4. (Chrome 79+, Node.js \uACF5\uC6A9)\n *\n * @example\n * const id = Uuid.new();\n * const fromStr = new Uuid(\"550e8400-e29b-41d4-a716-446655440000\");\n */\nexport class Uuid {\n // 0x00 ~ 0xFF\uC5D0 \uB300\uD55C hex \uBB38\uC790\uC5F4 \uBBF8\uB9AC \uACC4\uC0B0 (256\uAC1C)\n private static readonly _hexTable: string[] = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\n\n private static readonly _uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n /** 16\uBC14\uC774\uD2B8 \uBC30\uC5F4\uC744 UUID \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658 */\n private static _bytesToUuidStr(bytes: Uint8Array): string {\n const h = Uuid._hexTable;\n return (\n h[bytes[0]] +\n h[bytes[1]] +\n h[bytes[2]] +\n h[bytes[3]] +\n \"-\" +\n h[bytes[4]] +\n h[bytes[5]] +\n \"-\" +\n h[bytes[6]] +\n h[bytes[7]] +\n \"-\" +\n h[bytes[8]] +\n h[bytes[9]] +\n \"-\" +\n h[bytes[10]] +\n h[bytes[11]] +\n h[bytes[12]] +\n h[bytes[13]] +\n h[bytes[14]] +\n h[bytes[15]]\n );\n }\n\n /** \uC0C8 UUID v4 \uC778\uC2A4\uD134\uC2A4 \uC0DD\uC131 */\n static new(): Uuid {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n\n // UUID v4 \uC124\uC815\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n return new Uuid(Uuid._bytesToUuidStr(bytes));\n }\n\n /**\n * 16\uBC14\uC774\uD2B8 Uint8Array\uC5D0\uC11C UUID \uC0DD\uC131\n * @param bytes 16\uBC14\uC774\uD2B8 \uBC30\uC5F4\n * @throws {ArgumentError} \uBC14\uC774\uD2B8 \uD06C\uAE30\uAC00 16\uC774 \uC544\uB2CC \uACBD\uC6B0\n */\n static fromBytes(bytes: Bytes): Uuid {\n if (bytes.length !== 16) {\n throw new ArgumentError(\"UUID \uBC14\uC774\uD2B8 \uD06C\uAE30\uB294 16\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.\", { length: bytes.length });\n }\n\n return new Uuid(Uuid._bytesToUuidStr(bytes));\n }\n\n private readonly _uuid: string;\n\n /**\n * @param uuid UUID \uBB38\uC790\uC5F4 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \uD615\uC2DD)\n * @throws {ArgumentError} \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uACBD\uC6B0\n */\n constructor(uuid: string) {\n if (!Uuid._uuidRegex.test(uuid)) {\n throw new ArgumentError(\"UUID \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\", { uuid });\n }\n this._uuid = uuid;\n }\n\n /** UUID\uB97C \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658 */\n toString(): string {\n return this._uuid;\n }\n\n /** UUID\uB97C 16\uBC14\uC774\uD2B8 Uint8Array\uB85C \uBCC0\uD658 */\n toBytes(): Bytes {\n const u = this._uuid;\n // UUID \uD615\uC2DD: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)\n // \uD558\uC774\uD508 \uC704\uCE58: 8, 13, 18, 23\n return new Uint8Array([\n Number.parseInt(u.substring(0, 2), 16),\n Number.parseInt(u.substring(2, 4), 16),\n Number.parseInt(u.substring(4, 6), 16),\n Number.parseInt(u.substring(6, 8), 16),\n Number.parseInt(u.substring(9, 11), 16),\n Number.parseInt(u.substring(11, 13), 16),\n Number.parseInt(u.substring(14, 16), 16),\n Number.parseInt(u.substring(16, 18), 16),\n Number.parseInt(u.substring(19, 21), 16),\n Number.parseInt(u.substring(21, 23), 16),\n Number.parseInt(u.substring(24, 26), 16),\n Number.parseInt(u.substring(26, 28), 16),\n Number.parseInt(u.substring(28, 30), 16),\n Number.parseInt(u.substring(30, 32), 16),\n Number.parseInt(u.substring(32, 34), 16),\n Number.parseInt(u.substring(34, 36), 16),\n ]);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Bytes } from "../common.types";
|
|
2
|
+
/**
|
|
3
|
+
* 여러 Uint8Array 연결
|
|
4
|
+
* @param arrays 연결할 Uint8Array 배열
|
|
5
|
+
* @returns 연결된 새 Uint8Array
|
|
6
|
+
* @example
|
|
7
|
+
* const a = new Uint8Array([1, 2]);
|
|
8
|
+
* const b = new Uint8Array([3, 4]);
|
|
9
|
+
* bytesConcat([a, b]);
|
|
10
|
+
* // Uint8Array([1, 2, 3, 4])
|
|
11
|
+
*/
|
|
12
|
+
export declare function bytesConcat(arrays: Bytes[]): Bytes;
|
|
13
|
+
/**
|
|
14
|
+
* hex 문자열로 변환
|
|
15
|
+
* @param bytes 변환할 Uint8Array
|
|
16
|
+
* @returns 소문자 hex 문자열
|
|
17
|
+
* @example
|
|
18
|
+
* bytesToHex(new Uint8Array([255, 0, 127]));
|
|
19
|
+
* // "ff007f"
|
|
20
|
+
*/
|
|
21
|
+
export declare function bytesToHex(bytes: Bytes): string;
|
|
22
|
+
/**
|
|
23
|
+
* hex 문자열에서 Uint8Array로 변환
|
|
24
|
+
* @param hex 변환할 hex 문자열 (소문자/대문자 모두 허용)
|
|
25
|
+
* @returns 변환된 Uint8Array
|
|
26
|
+
* @throws {ArgumentError} 홀수 길이 또는 유효하지 않은 hex 문자가 포함된 경우
|
|
27
|
+
* @example
|
|
28
|
+
* bytesFromHex("ff007f");
|
|
29
|
+
* // Uint8Array([255, 0, 127])
|
|
30
|
+
*/
|
|
31
|
+
export declare function bytesFromHex(hex: string): Bytes;
|
|
32
|
+
/**
|
|
33
|
+
* Bytes를 base64 문자열로 변환
|
|
34
|
+
* @param bytes 변환할 Uint8Array
|
|
35
|
+
* @returns base64 인코딩된 문자열
|
|
36
|
+
* @example
|
|
37
|
+
* bytesToBase64(new Uint8Array([72, 101, 108, 108, 111]));
|
|
38
|
+
* // "SGVsbG8="
|
|
39
|
+
*/
|
|
40
|
+
export declare function bytesToBase64(bytes: Bytes): string;
|
|
41
|
+
/**
|
|
42
|
+
* base64 문자열을 Bytes로 변환
|
|
43
|
+
* @param base64 변환할 base64 문자열
|
|
44
|
+
* @returns 디코딩된 Uint8Array
|
|
45
|
+
* @throws {ArgumentError} 유효하지 않은 base64 문자가 포함된 경우
|
|
46
|
+
* @example
|
|
47
|
+
* bytesFromBase64("SGVsbG8=");
|
|
48
|
+
* // Uint8Array([72, 101, 108, 108, 111])
|
|
49
|
+
*/
|
|
50
|
+
export declare function bytesFromBase64(base64: string): Bytes;
|
|
51
|
+
//# sourceMappingURL=bytes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/utils/bytes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA0B7C;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CASlD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAO/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAY/C;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAiBlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAoCrD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ArgumentError } from "../errors/argument-error";
|
|
2
|
+
const hexTable = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0"));
|
|
3
|
+
const BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
4
|
+
const BASE64_LOOKUP = Array.from({ length: 256 }, (_, i) => {
|
|
5
|
+
const idx = BASE64_CHARS.indexOf(String.fromCharCode(i));
|
|
6
|
+
return idx === -1 ? 0 : idx;
|
|
7
|
+
});
|
|
8
|
+
function bytesConcat(arrays) {
|
|
9
|
+
const total = arrays.reduce((sum, arr) => sum + arr.length, 0);
|
|
10
|
+
const result = new Uint8Array(total);
|
|
11
|
+
let offset = 0;
|
|
12
|
+
for (const arr of arrays) {
|
|
13
|
+
result.set(arr, offset);
|
|
14
|
+
offset += arr.length;
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
function bytesToHex(bytes) {
|
|
19
|
+
const h = hexTable;
|
|
20
|
+
let result = "";
|
|
21
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
22
|
+
result += h[bytes[i]];
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
function bytesFromHex(hex) {
|
|
27
|
+
if (hex.length % 2 !== 0) {
|
|
28
|
+
throw new ArgumentError("hex \uBB38\uC790\uC5F4\uC740 \uC9DD\uC218 \uAE38\uC774\uC5EC\uC57C \uD569\uB2C8\uB2E4", { hex });
|
|
29
|
+
}
|
|
30
|
+
if (hex.length > 0 && !/^[0-9a-fA-F]+$/.test(hex)) {
|
|
31
|
+
throw new ArgumentError("\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 hex \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4", { hex });
|
|
32
|
+
}
|
|
33
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
34
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
35
|
+
bytes[i] = Number.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
|
|
36
|
+
}
|
|
37
|
+
return bytes;
|
|
38
|
+
}
|
|
39
|
+
function bytesToBase64(bytes) {
|
|
40
|
+
if (bytes.length === 0) {
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
let result = "";
|
|
44
|
+
const len = bytes.length;
|
|
45
|
+
for (let i = 0; i < len; i += 3) {
|
|
46
|
+
const b1 = bytes[i];
|
|
47
|
+
const b2 = i + 1 < len ? bytes[i + 1] : 0;
|
|
48
|
+
const b3 = i + 2 < len ? bytes[i + 2] : 0;
|
|
49
|
+
result += BASE64_CHARS[b1 >> 2];
|
|
50
|
+
result += BASE64_CHARS[(b1 & 3) << 4 | b2 >> 4];
|
|
51
|
+
result += i + 1 < len ? BASE64_CHARS[(b2 & 15) << 2 | b3 >> 6] : "=";
|
|
52
|
+
result += i + 2 < len ? BASE64_CHARS[b3 & 63] : "=";
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
function bytesFromBase64(base64) {
|
|
57
|
+
const cleanBase64 = base64.replace(/\s/g, "").replace(/=+$/, "");
|
|
58
|
+
if (cleanBase64.length === 0) {
|
|
59
|
+
return new Uint8Array(0);
|
|
60
|
+
}
|
|
61
|
+
if (!/^[A-Za-z0-9+/]+$/.test(cleanBase64)) {
|
|
62
|
+
throw new ArgumentError("\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 base64 \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4", { base64: base64.substring(0, 20) });
|
|
63
|
+
}
|
|
64
|
+
if (cleanBase64.length % 4 === 1) {
|
|
65
|
+
throw new ArgumentError("\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 base64 \uAE38\uC774\uC785\uB2C8\uB2E4", { length: cleanBase64.length });
|
|
66
|
+
}
|
|
67
|
+
const len = cleanBase64.length;
|
|
68
|
+
const byteLen = Math.floor(len * 3 / 4);
|
|
69
|
+
const bytes = new Uint8Array(byteLen);
|
|
70
|
+
let byteIdx = 0;
|
|
71
|
+
for (let i = 0; i < len; i += 4) {
|
|
72
|
+
const c1 = BASE64_LOOKUP[cleanBase64.charCodeAt(i)];
|
|
73
|
+
const c2 = i + 1 < len ? BASE64_LOOKUP[cleanBase64.charCodeAt(i + 1)] : 0;
|
|
74
|
+
const c3 = i + 2 < len ? BASE64_LOOKUP[cleanBase64.charCodeAt(i + 2)] : 0;
|
|
75
|
+
const c4 = i + 3 < len ? BASE64_LOOKUP[cleanBase64.charCodeAt(i + 3)] : 0;
|
|
76
|
+
bytes[byteIdx++] = c1 << 2 | c2 >> 4;
|
|
77
|
+
if (byteIdx < byteLen) bytes[byteIdx++] = (c2 & 15) << 4 | c3 >> 2;
|
|
78
|
+
if (byteIdx < byteLen) bytes[byteIdx++] = (c3 & 3) << 6 | c4;
|
|
79
|
+
}
|
|
80
|
+
return bytes;
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
bytesConcat,
|
|
84
|
+
bytesFromBase64,
|
|
85
|
+
bytesFromHex,
|
|
86
|
+
bytesToBase64,
|
|
87
|
+
bytesToHex
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=bytes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/bytes.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Bytes } from \"../common.types\";\nimport { ArgumentError } from \"../errors/argument-error\";\n\n/**\n * Uint8Array \uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218 (\uBCF5\uC7A1\uD55C \uC5F0\uC0B0\uB9CC)\n *\n * \uAE30\uB2A5:\n * - bytesConcat: \uC5EC\uB7EC Uint8Array \uC5F0\uACB0\n * - bytesToHex: Uint8Array\uB97C hex \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\n * - bytesFromHex: hex \uBB38\uC790\uC5F4\uC744 Uint8Array\uB85C \uBCC0\uD658\n * - bytesToBase64: Uint8Array\uB97C base64 \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\n * - bytesFromBase64: base64 \uBB38\uC790\uC5F4\uC744 Uint8Array\uB85C \uBCC0\uD658\n */\n\n/** hex \uBCC0\uD658\uC6A9 \uB8E9\uC5C5 \uD14C\uC774\uBE14 (\uC131\uB2A5 \uCD5C\uC801\uD654) */\nconst hexTable: string[] = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\n\n/** base64 \uC778\uCF54\uB529 \uD14C\uC774\uBE14 */\nconst BASE64_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/** base64 \uB514\uCF54\uB529 \uB8E9\uC5C5 \uD14C\uC774\uBE14 (O(1) \uC870\uD68C, \uBAA8\uB4E0 \uBC14\uC774\uD2B8 \uAC12 \uCEE4\uBC84) */\nconst BASE64_LOOKUP: number[] = Array.from({ length: 256 }, (_, i) => {\n const idx = BASE64_CHARS.indexOf(String.fromCharCode(i));\n return idx === -1 ? 0 : idx;\n});\n\n/**\n * \uC5EC\uB7EC Uint8Array \uC5F0\uACB0\n * @param arrays \uC5F0\uACB0\uD560 Uint8Array \uBC30\uC5F4\n * @returns \uC5F0\uACB0\uB41C \uC0C8 Uint8Array\n * @example\n * const a = new Uint8Array([1, 2]);\n * const b = new Uint8Array([3, 4]);\n * bytesConcat([a, b]);\n * // Uint8Array([1, 2, 3, 4])\n */\nexport function bytesConcat(arrays: Bytes[]): Bytes {\n const total = arrays.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(total);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n\n/**\n * hex \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\n * @param bytes \uBCC0\uD658\uD560 Uint8Array\n * @returns \uC18C\uBB38\uC790 hex \uBB38\uC790\uC5F4\n * @example\n * bytesToHex(new Uint8Array([255, 0, 127]));\n * // \"ff007f\"\n */\nexport function bytesToHex(bytes: Bytes): string {\n const h = hexTable;\n let result = \"\";\n for (let i = 0; i < bytes.length; i++) {\n result += h[bytes[i]];\n }\n return result;\n}\n\n/**\n * hex \uBB38\uC790\uC5F4\uC5D0\uC11C Uint8Array\uB85C \uBCC0\uD658\n * @param hex \uBCC0\uD658\uD560 hex \uBB38\uC790\uC5F4 (\uC18C\uBB38\uC790/\uB300\uBB38\uC790 \uBAA8\uB450 \uD5C8\uC6A9)\n * @returns \uBCC0\uD658\uB41C Uint8Array\n * @throws {ArgumentError} \uD640\uC218 \uAE38\uC774 \uB610\uB294 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 hex \uBB38\uC790\uAC00 \uD3EC\uD568\uB41C \uACBD\uC6B0\n * @example\n * bytesFromHex(\"ff007f\");\n * // Uint8Array([255, 0, 127])\n */\nexport function bytesFromHex(hex: string): Bytes {\n if (hex.length % 2 !== 0) {\n throw new ArgumentError(\"hex \uBB38\uC790\uC5F4\uC740 \uC9DD\uC218 \uAE38\uC774\uC5EC\uC57C \uD569\uB2C8\uB2E4\", { hex });\n }\n if (hex.length > 0 && !/^[0-9a-fA-F]+$/.test(hex)) {\n throw new ArgumentError(\"\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 hex \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4\", { hex });\n }\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Number.parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Bytes\uB97C base64 \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\n * @param bytes \uBCC0\uD658\uD560 Uint8Array\n * @returns base64 \uC778\uCF54\uB529\uB41C \uBB38\uC790\uC5F4\n * @example\n * bytesToBase64(new Uint8Array([72, 101, 108, 108, 111]));\n * // \"SGVsbG8=\"\n */\nexport function bytesToBase64(bytes: Bytes): string {\n if (bytes.length === 0) {\n return \"\";\n }\n\n let result = \"\";\n const len = bytes.length;\n for (let i = 0; i < len; i += 3) {\n const b1 = bytes[i];\n const b2 = i + 1 < len ? bytes[i + 1] : 0;\n const b3 = i + 2 < len ? bytes[i + 2] : 0;\n result += BASE64_CHARS[b1 >> 2];\n result += BASE64_CHARS[((b1 & 3) << 4) | (b2 >> 4)];\n result += i + 1 < len ? BASE64_CHARS[((b2 & 15) << 2) | (b3 >> 6)] : \"=\";\n result += i + 2 < len ? BASE64_CHARS[b3 & 63] : \"=\";\n }\n return result;\n}\n\n/**\n * base64 \uBB38\uC790\uC5F4\uC744 Bytes\uB85C \uBCC0\uD658\n * @param base64 \uBCC0\uD658\uD560 base64 \uBB38\uC790\uC5F4\n * @returns \uB514\uCF54\uB529\uB41C Uint8Array\n * @throws {ArgumentError} \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 base64 \uBB38\uC790\uAC00 \uD3EC\uD568\uB41C \uACBD\uC6B0\n * @example\n * bytesFromBase64(\"SGVsbG8=\");\n * // Uint8Array([72, 101, 108, 108, 111])\n */\nexport function bytesFromBase64(base64: string): Bytes {\n // \uACF5\uBC31 \uC81C\uAC70 \uBC0F \uD328\uB529 \uC815\uADDC\uD654\n const cleanBase64 = base64.replace(/\\s/g, \"\").replace(/=+$/, \"\");\n\n // \uBE48 \uBB38\uC790\uC5F4 \uCC98\uB9AC\n if (cleanBase64.length === 0) {\n return new Uint8Array(0);\n }\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC: \uBB38\uC790\n if (!/^[A-Za-z0-9+/]+$/.test(cleanBase64)) {\n throw new ArgumentError(\"\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 base64 \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4\", { base64: base64.substring(0, 20) });\n }\n\n // \uC720\uD6A8\uC131 \uAC80\uC0AC: \uAE38\uC774 (\uD328\uB529 \uC81C\uAC70 \uD6C4 \uB098\uBA38\uC9C0\uAC00 1\uC774\uBA74 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC74C)\n if (cleanBase64.length % 4 === 1) {\n throw new ArgumentError(\"\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 base64 \uAE38\uC774\uC785\uB2C8\uB2E4\", { length: cleanBase64.length });\n }\n\n const len = cleanBase64.length;\n const byteLen = Math.floor((len * 3) / 4);\n const bytes = new Uint8Array(byteLen);\n\n let byteIdx = 0;\n for (let i = 0; i < len; i += 4) {\n const c1 = BASE64_LOOKUP[cleanBase64.charCodeAt(i)];\n const c2 = i + 1 < len ? BASE64_LOOKUP[cleanBase64.charCodeAt(i + 1)] : 0;\n const c3 = i + 2 < len ? BASE64_LOOKUP[cleanBase64.charCodeAt(i + 2)] : 0;\n const c4 = i + 3 < len ? BASE64_LOOKUP[cleanBase64.charCodeAt(i + 3)] : 0;\n\n bytes[byteIdx++] = (c1 << 2) | (c2 >> 4);\n if (byteIdx < byteLen) bytes[byteIdx++] = ((c2 & 15) << 4) | (c3 >> 2);\n if (byteIdx < byteLen) bytes[byteIdx++] = ((c3 & 3) << 6) | c4;\n }\n\n return bytes;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 월 설정 시 연도/월/일 정규화 결과
|
|
3
|
+
*/
|
|
4
|
+
export interface DtNormalizedMonth {
|
|
5
|
+
year: number;
|
|
6
|
+
month: number;
|
|
7
|
+
day: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 월 설정 시 연도/월/일을 정규화
|
|
11
|
+
* - 월이 1-12 범위를 벗어나면 연도를 조정
|
|
12
|
+
* - 대상 월의 일수보다 현재 일자가 크면 해당 월의 마지막 날로 조정
|
|
13
|
+
*
|
|
14
|
+
* @param year 기준 연도
|
|
15
|
+
* @param month 설정할 월 (1-12 범위 외의 값도 허용)
|
|
16
|
+
* @param day 기준 일자
|
|
17
|
+
* @returns 정규화된 연도, 월, 일
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* normalizeMonth(2025, 13, 15) // { year: 2026, month: 1, day: 15 }
|
|
21
|
+
* normalizeMonth(2025, 2, 31) // { year: 2025, month: 2, day: 28 }
|
|
22
|
+
*/
|
|
23
|
+
export declare function normalizeMonth(year: number, month: number, day: number): DtNormalizedMonth;
|
|
24
|
+
/**
|
|
25
|
+
* 12시간제를 24시간제로 변환
|
|
26
|
+
* - 오전 12시 = 0시, 오후 12시 = 12시
|
|
27
|
+
* - 오전 1-11시 = 1-11시, 오후 1-11시 = 13-23시
|
|
28
|
+
*
|
|
29
|
+
* @param rawHour 12시간제 시 (1-12)
|
|
30
|
+
* @param isPM 오후 여부
|
|
31
|
+
* @returns 24시간제 시 (0-23)
|
|
32
|
+
*/
|
|
33
|
+
export declare function convert12To24(rawHour: number, isPM: boolean): number;
|
|
34
|
+
/**
|
|
35
|
+
* 포맷 문자열에 따라 날짜/시간을 문자열로 변환한다
|
|
36
|
+
*
|
|
37
|
+
* @param formatString 포맷 문자열
|
|
38
|
+
* @param args 날짜/시간 구성 요소
|
|
39
|
+
*
|
|
40
|
+
* @remarks
|
|
41
|
+
* C#과 동일한 포맷 문자열을 지원한다:
|
|
42
|
+
*
|
|
43
|
+
* | 포맷 | 설명 | 예시 |
|
|
44
|
+
* |------|------|------|
|
|
45
|
+
* | yyyy | 4자리 연도 | 2024 |
|
|
46
|
+
* | yy | 2자리 연도 | 24 |
|
|
47
|
+
* | MM | 0으로 패딩된 월 | 01~12 |
|
|
48
|
+
* | M | 월 | 1~12 |
|
|
49
|
+
* | ddd | 요일 (한글) | 일, 월, 화, 수, 목, 금, 토 |
|
|
50
|
+
* | dd | 0으로 패딩된 일 | 01~31 |
|
|
51
|
+
* | d | 일 | 1~31 |
|
|
52
|
+
* | tt | 오전/오후 | 오전, 오후 |
|
|
53
|
+
* | hh | 0으로 패딩된 12시간 | 01~12 |
|
|
54
|
+
* | h | 12시간 | 1~12 |
|
|
55
|
+
* | HH | 0으로 패딩된 24시간 | 00~23 |
|
|
56
|
+
* | H | 24시간 | 0~23 |
|
|
57
|
+
* | mm | 0으로 패딩된 분 | 00~59 |
|
|
58
|
+
* | m | 분 | 0~59 |
|
|
59
|
+
* | ss | 0으로 패딩된 초 | 00~59 |
|
|
60
|
+
* | s | 초 | 0~59 |
|
|
61
|
+
* | fff | 밀리초 (3자리) | 000~999 |
|
|
62
|
+
* | ff | 밀리초 (2자리) | 00~99 |
|
|
63
|
+
* | f | 밀리초 (1자리) | 0~9 |
|
|
64
|
+
* | zzz | 타임존 오프셋 (±HH:mm) | +09:00 |
|
|
65
|
+
* | zz | 타임존 오프셋 (±HH) | +09 |
|
|
66
|
+
* | z | 타임존 오프셋 (±H) | +9 |
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* formatDate("yyyy-MM-dd", { year: 2024, month: 3, day: 15 });
|
|
71
|
+
* // "2024-03-15"
|
|
72
|
+
*
|
|
73
|
+
* formatDate("yyyy년 M월 d일 (ddd)", { year: 2024, month: 3, day: 15 });
|
|
74
|
+
* // "2024년 3월 15일 (금)"
|
|
75
|
+
*
|
|
76
|
+
* formatDate("tt h:mm:ss", { hour: 14, minute: 30, second: 45 });
|
|
77
|
+
* // "오후 2:30:45"
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function formatDate(formatString: string, args: {
|
|
81
|
+
year?: number;
|
|
82
|
+
month?: number;
|
|
83
|
+
day?: number;
|
|
84
|
+
hour?: number;
|
|
85
|
+
minute?: number;
|
|
86
|
+
second?: number;
|
|
87
|
+
millisecond?: number;
|
|
88
|
+
timezoneOffsetMinutes?: number;
|
|
89
|
+
}): string;
|
|
90
|
+
//# sourceMappingURL=date-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-format.d.ts","sourceRoot":"","sources":["../../src/utils/date-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAY1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAKpE;AAyCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,UAAU,CACxB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GACA,MAAM,CAwFR"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
function normalizeMonth(year, month, day) {
|
|
2
|
+
const normalizedYear = year + Math.floor((month - 1) / 12);
|
|
3
|
+
const normalizedMonth = ((month - 1) % 12 + 12) % 12 + 1;
|
|
4
|
+
const lastDay = new Date(normalizedYear, normalizedMonth, 0).getDate();
|
|
5
|
+
const normalizedDay = Math.min(day, lastDay);
|
|
6
|
+
return { year: normalizedYear, month: normalizedMonth, day: normalizedDay };
|
|
7
|
+
}
|
|
8
|
+
function convert12To24(rawHour, isPM) {
|
|
9
|
+
if (rawHour === 12) {
|
|
10
|
+
return isPM ? 12 : 0;
|
|
11
|
+
}
|
|
12
|
+
return isPM ? rawHour + 12 : rawHour;
|
|
13
|
+
}
|
|
14
|
+
const patterns = {
|
|
15
|
+
yyyy: /yyyy/g,
|
|
16
|
+
yy: /yy/g,
|
|
17
|
+
MM: /MM/g,
|
|
18
|
+
M: /M/g,
|
|
19
|
+
ddd: /ddd/g,
|
|
20
|
+
dd: /dd/g,
|
|
21
|
+
d: /d/g,
|
|
22
|
+
tt: /tt/g,
|
|
23
|
+
hh: /hh/g,
|
|
24
|
+
h: /h/g,
|
|
25
|
+
HH: /HH/g,
|
|
26
|
+
H: /H/g,
|
|
27
|
+
mm: /mm/g,
|
|
28
|
+
m: /m/g,
|
|
29
|
+
ss: /ss/g,
|
|
30
|
+
s: /s/g,
|
|
31
|
+
fff: /fff/g,
|
|
32
|
+
ff: /ff/g,
|
|
33
|
+
f: /f/g,
|
|
34
|
+
zzz: /zzz/g,
|
|
35
|
+
zz: /zz/g,
|
|
36
|
+
z: /z/g
|
|
37
|
+
};
|
|
38
|
+
const weekStrings = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
|
|
39
|
+
function formatDate(formatString, args) {
|
|
40
|
+
const { year, month, day, hour, minute, second, millisecond, timezoneOffsetMinutes } = args;
|
|
41
|
+
const absOffsetMinutes = timezoneOffsetMinutes !== void 0 ? Math.abs(timezoneOffsetMinutes) : void 0;
|
|
42
|
+
const offsetHour = absOffsetMinutes !== void 0 ? Math.floor(absOffsetMinutes / 60) : void 0;
|
|
43
|
+
const offsetMinute = absOffsetMinutes !== void 0 ? absOffsetMinutes % 60 : void 0;
|
|
44
|
+
const offsetSign = timezoneOffsetMinutes !== void 0 ? timezoneOffsetMinutes >= 0 ? "+" : "-" : void 0;
|
|
45
|
+
const week = year !== void 0 && month !== void 0 && day !== void 0 ? new Date(year, month - 1, day).getDay() : void 0;
|
|
46
|
+
let result = formatString;
|
|
47
|
+
if (year !== void 0) {
|
|
48
|
+
const yearStr = year.toString();
|
|
49
|
+
result = result.replace(patterns.yyyy, yearStr);
|
|
50
|
+
result = result.replace(patterns.yy, yearStr.substring(2, 4));
|
|
51
|
+
}
|
|
52
|
+
if (month !== void 0) {
|
|
53
|
+
const monthStr = month.toString();
|
|
54
|
+
result = result.replace(patterns.MM, monthStr.padStart(2, "0"));
|
|
55
|
+
result = result.replace(patterns.M, monthStr);
|
|
56
|
+
}
|
|
57
|
+
if (week !== void 0) {
|
|
58
|
+
result = result.replace(patterns.ddd, weekStrings[week]);
|
|
59
|
+
}
|
|
60
|
+
if (day !== void 0) {
|
|
61
|
+
const dayStr = day.toString();
|
|
62
|
+
result = result.replace(patterns.dd, dayStr.padStart(2, "0"));
|
|
63
|
+
result = result.replace(patterns.d, dayStr);
|
|
64
|
+
}
|
|
65
|
+
if (hour !== void 0) {
|
|
66
|
+
result = result.replace(patterns.tt, hour < 12 ? "\uC624\uC804" : "\uC624\uD6C4");
|
|
67
|
+
const hour12 = hour % 12 || 12;
|
|
68
|
+
const hour12Str = hour12.toString();
|
|
69
|
+
result = result.replace(patterns.hh, hour12Str.padStart(2, "0"));
|
|
70
|
+
result = result.replace(patterns.h, hour12Str);
|
|
71
|
+
const hourStr = hour.toString();
|
|
72
|
+
result = result.replace(patterns.HH, hourStr.padStart(2, "0"));
|
|
73
|
+
result = result.replace(patterns.H, hourStr);
|
|
74
|
+
}
|
|
75
|
+
if (minute !== void 0) {
|
|
76
|
+
const minuteStr = minute.toString();
|
|
77
|
+
result = result.replace(patterns.mm, minuteStr.padStart(2, "0"));
|
|
78
|
+
result = result.replace(patterns.m, minuteStr);
|
|
79
|
+
}
|
|
80
|
+
if (second !== void 0) {
|
|
81
|
+
const secondStr = second.toString();
|
|
82
|
+
result = result.replace(patterns.ss, secondStr.padStart(2, "0"));
|
|
83
|
+
result = result.replace(patterns.s, secondStr);
|
|
84
|
+
}
|
|
85
|
+
if (millisecond !== void 0) {
|
|
86
|
+
const msStr = millisecond.toString().padStart(3, "0");
|
|
87
|
+
result = result.replace(patterns.fff, msStr);
|
|
88
|
+
result = result.replace(patterns.ff, msStr.substring(0, 2));
|
|
89
|
+
result = result.replace(patterns.f, msStr.substring(0, 1));
|
|
90
|
+
}
|
|
91
|
+
if (offsetSign !== void 0 && offsetHour !== void 0 && offsetMinute !== void 0) {
|
|
92
|
+
result = result.replace(
|
|
93
|
+
patterns.zzz,
|
|
94
|
+
`${offsetSign}${offsetHour.toString().padStart(2, "0")}:${offsetMinute.toString().padStart(2, "0")}`
|
|
95
|
+
);
|
|
96
|
+
result = result.replace(patterns.zz, `${offsetSign}${offsetHour.toString().padStart(2, "0")}`);
|
|
97
|
+
result = result.replace(patterns.z, `${offsetSign}${offsetHour}`);
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
convert12To24,
|
|
103
|
+
formatDate,
|
|
104
|
+
normalizeMonth
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=date-format.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/date-format.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * \uC6D4 \uC124\uC815 \uC2DC \uC5F0\uB3C4/\uC6D4/\uC77C \uC815\uADDC\uD654 \uACB0\uACFC\n */\nexport interface DtNormalizedMonth {\n year: number;\n month: number;\n day: number;\n}\n\n/**\n * \uC6D4 \uC124\uC815 \uC2DC \uC5F0\uB3C4/\uC6D4/\uC77C\uC744 \uC815\uADDC\uD654\n * - \uC6D4\uC774 1-12 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uBA74 \uC5F0\uB3C4\uB97C \uC870\uC815\n * - \uB300\uC0C1 \uC6D4\uC758 \uC77C\uC218\uBCF4\uB2E4 \uD604\uC7AC \uC77C\uC790\uAC00 \uD06C\uBA74 \uD574\uB2F9 \uC6D4\uC758 \uB9C8\uC9C0\uB9C9 \uB0A0\uB85C \uC870\uC815\n *\n * @param year \uAE30\uC900 \uC5F0\uB3C4\n * @param month \uC124\uC815\uD560 \uC6D4 (1-12 \uBC94\uC704 \uC678\uC758 \uAC12\uB3C4 \uD5C8\uC6A9)\n * @param day \uAE30\uC900 \uC77C\uC790\n * @returns \uC815\uADDC\uD654\uB41C \uC5F0\uB3C4, \uC6D4, \uC77C\n *\n * @example\n * normalizeMonth(2025, 13, 15) // { year: 2026, month: 1, day: 15 }\n * normalizeMonth(2025, 2, 31) // { year: 2025, month: 2, day: 28 }\n */\nexport function normalizeMonth(year: number, month: number, day: number): DtNormalizedMonth {\n // \uC6D4 \uC624\uBC84\uD50C\uB85C\uC6B0/\uC5B8\uB354\uD50C\uB85C\uC6B0 \uC815\uADDC\uD654\n // month\uAC00 1-12 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uBA74 \uC5F0\uB3C4\uB97C \uC870\uC815\n const normalizedYear = year + Math.floor((month - 1) / 12);\n // JavaScript % \uC5F0\uC0B0\uC790\uB294 \uC74C\uC218\uC5D0\uC11C \uC74C\uC218\uB97C \uBC18\uD658\uD558\uBBC0\uB85C (% 12 + 12) % 12 \uD328\uD134\uC73C\uB85C 0-11 \uBC94\uC704\uB97C \uBCF4\uC7A5 \uD6C4 1-12\uB85C \uBCC0\uD658\n const normalizedMonth = ((((month - 1) % 12) + 12) % 12) + 1;\n\n // \uB300\uC0C1 \uC6D4\uC758 \uB9C8\uC9C0\uB9C9 \uB0A0 \uAD6C\uD558\uAE30\n const lastDay = new Date(normalizedYear, normalizedMonth, 0).getDate();\n const normalizedDay = Math.min(day, lastDay);\n\n return { year: normalizedYear, month: normalizedMonth, day: normalizedDay };\n}\n\n/**\n * 12\uC2DC\uAC04\uC81C\uB97C 24\uC2DC\uAC04\uC81C\uB85C \uBCC0\uD658\n * - \uC624\uC804 12\uC2DC = 0\uC2DC, \uC624\uD6C4 12\uC2DC = 12\uC2DC\n * - \uC624\uC804 1-11\uC2DC = 1-11\uC2DC, \uC624\uD6C4 1-11\uC2DC = 13-23\uC2DC\n *\n * @param rawHour 12\uC2DC\uAC04\uC81C \uC2DC (1-12)\n * @param isPM \uC624\uD6C4 \uC5EC\uBD80\n * @returns 24\uC2DC\uAC04\uC81C \uC2DC (0-23)\n */\nexport function convert12To24(rawHour: number, isPM: boolean): number {\n if (rawHour === 12) {\n return isPM ? 12 : 0;\n }\n return isPM ? rawHour + 12 : rawHour;\n}\n\n//#region \uC815\uADDC\uC2DD \uCE90\uC2F1 (\uBAA8\uB4C8 \uB85C\uB4DC \uC2DC 1\uD68C\uB9CC \uC0DD\uC131)\n\n/**\n * \uD3EC\uB9F7 \uD328\uD134 \uC815\uADDC\uC2DD\n *\n * \uC21C\uC11C \uC911\uC694:\n * dtFormat() \uD568\uC218\uC5D0\uC11C \uAE34 \uD328\uD134(yyyy, MM, dd \uB4F1)\uC744 \uBA3C\uC800 \uCC98\uB9AC\uD574\uC57C\n * \uC9E7\uC740 \uD328\uD134(y, M, d \uB4F1)\uC774 \uBD80\uBD84 \uB9E4\uCE6D\uB418\uB294 \uAC83\uC744 \uBC29\uC9C0\uD569\uB2C8\uB2E4.\n * \uC608: \"yyyy\"\uB97C \uBA3C\uC800 \uCC98\uB9AC\uD558\uC9C0 \uC54A\uC73C\uBA74 \"yy\"\uAC00 \uB450 \uBC88 \uB9E4\uCE6D\uB420 \uC218 \uC788\uC74C\n */\nconst patterns = {\n yyyy: /yyyy/g,\n yy: /yy/g,\n MM: /MM/g,\n M: /M/g,\n ddd: /ddd/g,\n dd: /dd/g,\n d: /d/g,\n tt: /tt/g,\n hh: /hh/g,\n h: /h/g,\n HH: /HH/g,\n H: /H/g,\n mm: /mm/g,\n m: /m/g,\n ss: /ss/g,\n s: /s/g,\n fff: /fff/g,\n ff: /ff/g,\n f: /f/g,\n zzz: /zzz/g,\n zz: /zz/g,\n z: /z/g,\n};\n\nconst weekStrings = [\"\uC77C\", \"\uC6D4\", \"\uD654\", \"\uC218\", \"\uBAA9\", \"\uAE08\", \"\uD1A0\"];\n\n//#endregion\n\n/**\n * \uD3EC\uB9F7 \uBB38\uC790\uC5F4\uC5D0 \uB530\uB77C \uB0A0\uC9DC/\uC2DC\uAC04\uC744 \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\uD55C\uB2E4\n *\n * @param formatString \uD3EC\uB9F7 \uBB38\uC790\uC5F4\n * @param args \uB0A0\uC9DC/\uC2DC\uAC04 \uAD6C\uC131 \uC694\uC18C\n *\n * @remarks\n * C#\uACFC \uB3D9\uC77C\uD55C \uD3EC\uB9F7 \uBB38\uC790\uC5F4\uC744 \uC9C0\uC6D0\uD55C\uB2E4:\n *\n * | \uD3EC\uB9F7 | \uC124\uBA85 | \uC608\uC2DC |\n * |------|------|------|\n * | yyyy | 4\uC790\uB9AC \uC5F0\uB3C4 | 2024 |\n * | yy | 2\uC790\uB9AC \uC5F0\uB3C4 | 24 |\n * | MM | 0\uC73C\uB85C \uD328\uB529\uB41C \uC6D4 | 01~12 |\n * | M | \uC6D4 | 1~12 |\n * | ddd | \uC694\uC77C (\uD55C\uAE00) | \uC77C, \uC6D4, \uD654, \uC218, \uBAA9, \uAE08, \uD1A0 |\n * | dd | 0\uC73C\uB85C \uD328\uB529\uB41C \uC77C | 01~31 |\n * | d | \uC77C | 1~31 |\n * | tt | \uC624\uC804/\uC624\uD6C4 | \uC624\uC804, \uC624\uD6C4 |\n * | hh | 0\uC73C\uB85C \uD328\uB529\uB41C 12\uC2DC\uAC04 | 01~12 |\n * | h | 12\uC2DC\uAC04 | 1~12 |\n * | HH | 0\uC73C\uB85C \uD328\uB529\uB41C 24\uC2DC\uAC04 | 00~23 |\n * | H | 24\uC2DC\uAC04 | 0~23 |\n * | mm | 0\uC73C\uB85C \uD328\uB529\uB41C \uBD84 | 00~59 |\n * | m | \uBD84 | 0~59 |\n * | ss | 0\uC73C\uB85C \uD328\uB529\uB41C \uCD08 | 00~59 |\n * | s | \uCD08 | 0~59 |\n * | fff | \uBC00\uB9AC\uCD08 (3\uC790\uB9AC) | 000~999 |\n * | ff | \uBC00\uB9AC\uCD08 (2\uC790\uB9AC) | 00~99 |\n * | f | \uBC00\uB9AC\uCD08 (1\uC790\uB9AC) | 0~9 |\n * | zzz | \uD0C0\uC784\uC874 \uC624\uD504\uC14B (\u00B1HH:mm) | +09:00 |\n * | zz | \uD0C0\uC784\uC874 \uC624\uD504\uC14B (\u00B1HH) | +09 |\n * | z | \uD0C0\uC784\uC874 \uC624\uD504\uC14B (\u00B1H) | +9 |\n *\n * @example\n * ```typescript\n * formatDate(\"yyyy-MM-dd\", { year: 2024, month: 3, day: 15 });\n * // \"2024-03-15\"\n *\n * formatDate(\"yyyy\uB144 M\uC6D4 d\uC77C (ddd)\", { year: 2024, month: 3, day: 15 });\n * // \"2024\uB144 3\uC6D4 15\uC77C (\uAE08)\"\n *\n * formatDate(\"tt h:mm:ss\", { hour: 14, minute: 30, second: 45 });\n * // \"\uC624\uD6C4 2:30:45\"\n * ```\n */\nexport function formatDate(\n formatString: string,\n args: {\n year?: number;\n month?: number;\n day?: number;\n hour?: number;\n minute?: number;\n second?: number;\n millisecond?: number;\n timezoneOffsetMinutes?: number;\n },\n): string {\n const { year, month, day, hour, minute, second, millisecond, timezoneOffsetMinutes } = args;\n\n const absOffsetMinutes = timezoneOffsetMinutes !== undefined ? Math.abs(timezoneOffsetMinutes) : undefined;\n const offsetHour = absOffsetMinutes !== undefined ? Math.floor(absOffsetMinutes / 60) : undefined;\n const offsetMinute = absOffsetMinutes !== undefined ? absOffsetMinutes % 60 : undefined;\n const offsetSign = timezoneOffsetMinutes !== undefined ? (timezoneOffsetMinutes >= 0 ? \"+\" : \"-\") : undefined;\n\n const week =\n year !== undefined && month !== undefined && day !== undefined\n ? new Date(year, month - 1, day).getDay()\n : undefined;\n\n let result = formatString;\n\n // \uC5F0\uB3C4\n if (year !== undefined) {\n const yearStr = year.toString();\n result = result.replace(patterns.yyyy, yearStr);\n result = result.replace(patterns.yy, yearStr.substring(2, 4));\n }\n\n // \uC6D4\n if (month !== undefined) {\n const monthStr = month.toString();\n result = result.replace(patterns.MM, monthStr.padStart(2, \"0\"));\n result = result.replace(patterns.M, monthStr);\n }\n\n // \uC694\uC77C\n if (week !== undefined) {\n result = result.replace(patterns.ddd, weekStrings[week]);\n }\n\n // \uC77C\n if (day !== undefined) {\n const dayStr = day.toString();\n result = result.replace(patterns.dd, dayStr.padStart(2, \"0\"));\n result = result.replace(patterns.d, dayStr);\n }\n\n // \uC2DC\uAC04\n if (hour !== undefined) {\n result = result.replace(patterns.tt, hour < 12 ? \"\uC624\uC804\" : \"\uC624\uD6C4\");\n\n const hour12 = hour % 12 || 12;\n const hour12Str = hour12.toString();\n result = result.replace(patterns.hh, hour12Str.padStart(2, \"0\"));\n result = result.replace(patterns.h, hour12Str);\n\n const hourStr = hour.toString();\n result = result.replace(patterns.HH, hourStr.padStart(2, \"0\"));\n result = result.replace(patterns.H, hourStr);\n }\n\n // \uBD84\n if (minute !== undefined) {\n const minuteStr = minute.toString();\n result = result.replace(patterns.mm, minuteStr.padStart(2, \"0\"));\n result = result.replace(patterns.m, minuteStr);\n }\n\n // \uCD08\n if (second !== undefined) {\n const secondStr = second.toString();\n result = result.replace(patterns.ss, secondStr.padStart(2, \"0\"));\n result = result.replace(patterns.s, secondStr);\n }\n\n // \uBC00\uB9AC\uCD08\n if (millisecond !== undefined) {\n const msStr = millisecond.toString().padStart(3, \"0\");\n result = result.replace(patterns.fff, msStr);\n result = result.replace(patterns.ff, msStr.substring(0, 2));\n result = result.replace(patterns.f, msStr.substring(0, 1));\n }\n\n // \uD0C0\uC784\uC874\n if (offsetSign !== undefined && offsetHour !== undefined && offsetMinute !== undefined) {\n result = result.replace(\n patterns.zzz,\n `${offsetSign}${offsetHour.toString().padStart(2, \"0\")}:${offsetMinute.toString().padStart(2, \"0\")}`,\n );\n result = result.replace(patterns.zz, `${offsetSign}${offsetHour.toString().padStart(2, \"0\")}`);\n result = result.replace(patterns.z, `${offsetSign}${offsetHour}`);\n }\n\n return result;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 객체를 JSON 문자열로 직렬화
|
|
3
|
+
* DateTime, DateOnly, Time, Uuid, Set, Map, Error, Uint8Array 등 커스텀 타입 지원
|
|
4
|
+
*
|
|
5
|
+
* @param obj 직렬화할 객체
|
|
6
|
+
* @param options 직렬화 옵션
|
|
7
|
+
* @param options.space JSON 들여쓰기 (숫자: 공백 수, 문자열: 들여쓰기 문자열)
|
|
8
|
+
* @param options.replacer 커스텀 replacer 함수. 기본 타입 변환 전에 호출됨
|
|
9
|
+
* @param options.redactBytes true 시 Uint8Array 내용을 "__hidden__"으로 대체 (로깅용). 이 옵션으로 직렬화한 결과는 jsonParse()로 원본 Uint8Array를 복원할 수 없음
|
|
10
|
+
*
|
|
11
|
+
* @remarks
|
|
12
|
+
* - 순환 참조가 있는 객체는 TypeError를 던짐
|
|
13
|
+
* - 객체의 toJSON 메서드가 있으면 호출하여 결과를 사용함 (Date, DateTime 등 커스텀 타입 제외)
|
|
14
|
+
* - 전역 프로토타입을 수정하지 않아 Worker 환경에서도 안전함
|
|
15
|
+
*/
|
|
16
|
+
export declare function jsonStringify(obj: unknown, options?: {
|
|
17
|
+
space?: string | number;
|
|
18
|
+
replacer?: (key: string | undefined, value: unknown) => unknown;
|
|
19
|
+
redactBytes?: boolean;
|
|
20
|
+
}): string;
|
|
21
|
+
/**
|
|
22
|
+
* JSON 문자열을 객체로 역직렬화
|
|
23
|
+
* DateTime, DateOnly, Time, Uuid, Set, Map, Error, Uint8Array 등 커스텀 타입 복원
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
* `__type__`과 `data` 키를 가진 객체는 타입 복원에 사용된다.
|
|
27
|
+
* 사용자 데이터에 `{ __type__: "Date" | "DateTime" | "DateOnly" | "Time" | "Uuid" | "Set" | "Map" | "Error" | "Uint8Array", data: ... }`
|
|
28
|
+
* 형태가 있으면 의도치 않게 타입 변환될 수 있으므로 주의한다.
|
|
29
|
+
*
|
|
30
|
+
* @security 개발 모드(`__DEV__`)에서만 에러 메시지에 JSON 문자열 전체가 포함된다.
|
|
31
|
+
* 프로덕션 모드에서는 JSON 길이만 포함된다.
|
|
32
|
+
*/
|
|
33
|
+
export declare function jsonParse<T = unknown>(json: string): T;
|
|
34
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAChE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GACA,MAAM,CAkHR;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAqDtD"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { DateTime } from "../types/date-time";
|
|
2
|
+
import { DateOnly } from "../types/date-only";
|
|
3
|
+
import { Time } from "../types/time";
|
|
4
|
+
import { Uuid } from "../types/uuid";
|
|
5
|
+
import { objNullToUndefined } from "./obj";
|
|
6
|
+
import { SdError } from "../errors/sd-error";
|
|
7
|
+
import { bytesToHex, bytesFromHex } from "./bytes";
|
|
8
|
+
import { env } from "../env";
|
|
9
|
+
function jsonStringify(obj, options) {
|
|
10
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
11
|
+
const convertSpecialTypes = (key, value) => {
|
|
12
|
+
const currValue = (options == null ? void 0 : options.replacer) !== void 0 ? options.replacer(key, value) : value;
|
|
13
|
+
if (currValue instanceof Date) {
|
|
14
|
+
return { __type__: "Date", data: currValue.toISOString() };
|
|
15
|
+
}
|
|
16
|
+
if (currValue instanceof DateTime) {
|
|
17
|
+
return { __type__: "DateTime", data: currValue.toString() };
|
|
18
|
+
}
|
|
19
|
+
if (currValue instanceof DateOnly) {
|
|
20
|
+
return { __type__: "DateOnly", data: currValue.toString() };
|
|
21
|
+
}
|
|
22
|
+
if (currValue instanceof Time) {
|
|
23
|
+
return { __type__: "Time", data: currValue.toString() };
|
|
24
|
+
}
|
|
25
|
+
if (currValue instanceof Uuid) {
|
|
26
|
+
return { __type__: "Uuid", data: currValue.toString() };
|
|
27
|
+
}
|
|
28
|
+
if (currValue instanceof Set) {
|
|
29
|
+
return {
|
|
30
|
+
__type__: "Set",
|
|
31
|
+
data: Array.from(currValue).map((item, i) => convertSpecialTypes(String(i), item))
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (currValue instanceof Map) {
|
|
35
|
+
return {
|
|
36
|
+
__type__: "Map",
|
|
37
|
+
data: Array.from(currValue.entries()).map(([k, v], i) => [
|
|
38
|
+
convertSpecialTypes(String(i), k),
|
|
39
|
+
convertSpecialTypes(String(i), v)
|
|
40
|
+
])
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (currValue instanceof Error) {
|
|
44
|
+
return {
|
|
45
|
+
__type__: "Error",
|
|
46
|
+
data: {
|
|
47
|
+
name: currValue.name,
|
|
48
|
+
message: currValue.message,
|
|
49
|
+
stack: currValue.stack,
|
|
50
|
+
..."code" in currValue ? { code: currValue.code } : {},
|
|
51
|
+
..."detail" in currValue ? { detail: currValue.detail } : {},
|
|
52
|
+
..."cause" in currValue ? { cause: convertSpecialTypes("cause", currValue.cause) } : {}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (currValue instanceof Uint8Array) {
|
|
57
|
+
if ((options == null ? void 0 : options.redactBytes) === true) {
|
|
58
|
+
return { __type__: "Uint8Array", data: "__hidden__" };
|
|
59
|
+
}
|
|
60
|
+
return { __type__: "Uint8Array", data: bytesToHex(currValue) };
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(currValue)) {
|
|
63
|
+
if (seen.has(currValue)) {
|
|
64
|
+
throw new TypeError("Converting circular structure to JSON");
|
|
65
|
+
}
|
|
66
|
+
seen.add(currValue);
|
|
67
|
+
const result = currValue.map((item, i) => convertSpecialTypes(String(i), item));
|
|
68
|
+
seen.delete(currValue);
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
if (currValue !== null && typeof currValue === "object") {
|
|
72
|
+
if (seen.has(currValue)) {
|
|
73
|
+
throw new TypeError("Converting circular structure to JSON");
|
|
74
|
+
}
|
|
75
|
+
seen.add(currValue);
|
|
76
|
+
if ("toJSON" in currValue && typeof currValue.toJSON === "function") {
|
|
77
|
+
const toJsonResult = currValue.toJSON(key);
|
|
78
|
+
seen.delete(currValue);
|
|
79
|
+
return convertSpecialTypes(key, toJsonResult);
|
|
80
|
+
}
|
|
81
|
+
const result = {};
|
|
82
|
+
for (const [k, v] of Object.entries(currValue)) {
|
|
83
|
+
const converted2 = convertSpecialTypes(k, v);
|
|
84
|
+
if (converted2 !== void 0) {
|
|
85
|
+
result[k] = converted2;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
seen.delete(currValue);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
return currValue;
|
|
92
|
+
};
|
|
93
|
+
const converted = convertSpecialTypes(void 0, obj);
|
|
94
|
+
return JSON.stringify(converted, null, options == null ? void 0 : options.space);
|
|
95
|
+
}
|
|
96
|
+
function jsonParse(json) {
|
|
97
|
+
try {
|
|
98
|
+
return objNullToUndefined(
|
|
99
|
+
JSON.parse(json, (_key, value) => {
|
|
100
|
+
if (value != null && typeof value === "object") {
|
|
101
|
+
if ("__type__" in value && "data" in value) {
|
|
102
|
+
const typed = value;
|
|
103
|
+
if (typed.__type__ === "Date" && typeof typed.data === "string") {
|
|
104
|
+
return new Date(Date.parse(typed.data));
|
|
105
|
+
}
|
|
106
|
+
if (typed.__type__ === "DateTime" && typeof typed.data === "string") {
|
|
107
|
+
return DateTime.parse(typed.data);
|
|
108
|
+
}
|
|
109
|
+
if (typed.__type__ === "DateOnly" && typeof typed.data === "string") {
|
|
110
|
+
return DateOnly.parse(typed.data);
|
|
111
|
+
}
|
|
112
|
+
if (typed.__type__ === "Time" && typeof typed.data === "string") {
|
|
113
|
+
return Time.parse(typed.data);
|
|
114
|
+
}
|
|
115
|
+
if (typed.__type__ === "Uuid" && typeof typed.data === "string") {
|
|
116
|
+
return new Uuid(typed.data);
|
|
117
|
+
}
|
|
118
|
+
if (typed.__type__ === "Set" && Array.isArray(typed.data)) {
|
|
119
|
+
return new Set(typed.data);
|
|
120
|
+
}
|
|
121
|
+
if (typed.__type__ === "Map" && Array.isArray(typed.data)) {
|
|
122
|
+
return new Map(typed.data);
|
|
123
|
+
}
|
|
124
|
+
if (typed.__type__ === "Error" && typeof typed.data === "object") {
|
|
125
|
+
const errorData = typed.data;
|
|
126
|
+
const error = new Error(errorData["message"]);
|
|
127
|
+
Object.assign(error, errorData);
|
|
128
|
+
return error;
|
|
129
|
+
}
|
|
130
|
+
if (typed.__type__ === "Uint8Array" && typeof typed.data === "string") {
|
|
131
|
+
if (typed.data === "__hidden__") {
|
|
132
|
+
throw new SdError("redactBytes \uC635\uC158\uC73C\uB85C \uC9C1\uB82C\uD654\uB41C Uint8Array\uB294 parse\uB85C \uBCF5\uC6D0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4");
|
|
133
|
+
}
|
|
134
|
+
return bytesFromHex(typed.data);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return value;
|
|
139
|
+
})
|
|
140
|
+
);
|
|
141
|
+
} catch (err) {
|
|
142
|
+
if (env.DEV) {
|
|
143
|
+
throw new SdError(err, "JSON \uD30C\uC2F1 \uC5D0\uB7EC: \n" + json);
|
|
144
|
+
}
|
|
145
|
+
throw new SdError(err, `JSON \uD30C\uC2F1 \uC5D0\uB7EC (length: ${json.length})`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export {
|
|
149
|
+
jsonParse,
|
|
150
|
+
jsonStringify
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=json.js.map
|