@simplysm/core-common 13.0.100 → 14.0.4

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.
Files changed (184) hide show
  1. package/README.md +86 -92
  2. package/dist/common.types.d.ts +14 -14
  3. package/dist/common.types.js +2 -1
  4. package/dist/common.types.js.map +1 -6
  5. package/dist/env.d.ts +8 -1
  6. package/dist/env.d.ts.map +1 -1
  7. package/dist/env.js +13 -9
  8. package/dist/env.js.map +1 -6
  9. package/dist/errors/argument-error.d.ts +10 -10
  10. package/dist/errors/argument-error.d.ts.map +1 -1
  11. package/dist/errors/argument-error.js +31 -14
  12. package/dist/errors/argument-error.js.map +1 -6
  13. package/dist/errors/not-implemented-error.d.ts +8 -8
  14. package/dist/errors/not-implemented-error.js +30 -12
  15. package/dist/errors/not-implemented-error.js.map +1 -6
  16. package/dist/errors/sd-error.d.ts +10 -10
  17. package/dist/errors/sd-error.d.ts.map +1 -1
  18. package/dist/errors/sd-error.js +45 -24
  19. package/dist/errors/sd-error.js.map +1 -6
  20. package/dist/errors/timeout-error.d.ts +10 -10
  21. package/dist/errors/timeout-error.js +34 -15
  22. package/dist/errors/timeout-error.js.map +1 -6
  23. package/dist/extensions/arr-ext.d.ts +2 -2
  24. package/dist/extensions/arr-ext.helpers.d.ts +10 -10
  25. package/dist/extensions/arr-ext.helpers.js +112 -89
  26. package/dist/extensions/arr-ext.helpers.js.map +1 -6
  27. package/dist/extensions/arr-ext.js +458 -422
  28. package/dist/extensions/arr-ext.js.map +1 -6
  29. package/dist/extensions/arr-ext.types.d.ts +57 -57
  30. package/dist/extensions/arr-ext.types.d.ts.map +1 -1
  31. package/dist/extensions/arr-ext.types.js +6 -1
  32. package/dist/extensions/arr-ext.types.js.map +1 -6
  33. package/dist/extensions/map-ext.d.ts +16 -16
  34. package/dist/extensions/map-ext.js +27 -22
  35. package/dist/extensions/map-ext.js.map +1 -6
  36. package/dist/extensions/set-ext.d.ts +11 -11
  37. package/dist/extensions/set-ext.js +32 -25
  38. package/dist/extensions/set-ext.js.map +1 -6
  39. package/dist/features/debounce-queue.d.ts +17 -17
  40. package/dist/features/debounce-queue.js +98 -70
  41. package/dist/features/debounce-queue.js.map +1 -6
  42. package/dist/features/event-emitter.d.ts +20 -20
  43. package/dist/features/event-emitter.js +101 -78
  44. package/dist/features/event-emitter.js.map +1 -6
  45. package/dist/features/serial-queue.d.ts +11 -11
  46. package/dist/features/serial-queue.js +78 -57
  47. package/dist/features/serial-queue.js.map +1 -6
  48. package/dist/globals.d.ts +4 -4
  49. package/dist/globals.js +9 -1
  50. package/dist/globals.js.map +1 -6
  51. package/dist/index.js +28 -27
  52. package/dist/index.js.map +1 -6
  53. package/dist/types/date-only.d.ts +64 -64
  54. package/dist/types/date-only.d.ts.map +1 -1
  55. package/dist/types/date-only.js +263 -252
  56. package/dist/types/date-only.js.map +1 -6
  57. package/dist/types/date-time.d.ts +36 -36
  58. package/dist/types/date-time.d.ts.map +1 -1
  59. package/dist/types/date-time.js +196 -288
  60. package/dist/types/date-time.js.map +1 -6
  61. package/dist/types/lazy-gc-map.d.ts +26 -26
  62. package/dist/types/lazy-gc-map.d.ts.map +1 -1
  63. package/dist/types/lazy-gc-map.js +202 -159
  64. package/dist/types/lazy-gc-map.js.map +1 -6
  65. package/dist/types/time.d.ts +23 -23
  66. package/dist/types/time.d.ts.map +1 -1
  67. package/dist/types/time.js +169 -158
  68. package/dist/types/time.js.map +1 -6
  69. package/dist/types/uuid.d.ts +11 -11
  70. package/dist/types/uuid.d.ts.map +1 -1
  71. package/dist/types/uuid.js +95 -70
  72. package/dist/types/uuid.js.map +1 -6
  73. package/dist/utils/bytes.d.ts +17 -17
  74. package/dist/utils/bytes.js +137 -81
  75. package/dist/utils/bytes.js.map +1 -6
  76. package/dist/utils/date-format.d.ts +40 -40
  77. package/dist/utils/date-format.js +187 -101
  78. package/dist/utils/date-format.js.map +1 -6
  79. package/dist/utils/error.d.ts +4 -4
  80. package/dist/utils/error.js +11 -6
  81. package/dist/utils/error.js.map +1 -6
  82. package/dist/utils/json.d.ts +19 -19
  83. package/dist/utils/json.js +187 -135
  84. package/dist/utils/json.js.map +1 -6
  85. package/dist/utils/num.d.ts +20 -20
  86. package/dist/utils/num.js +76 -34
  87. package/dist/utils/num.js.map +1 -6
  88. package/dist/utils/obj.d.ts +111 -111
  89. package/dist/utils/obj.d.ts.map +1 -1
  90. package/dist/utils/obj.js +706 -496
  91. package/dist/utils/obj.js.map +1 -6
  92. package/dist/utils/path.d.ts +10 -10
  93. package/dist/utils/path.js +35 -18
  94. package/dist/utils/path.js.map +1 -6
  95. package/dist/utils/primitive.d.ts +5 -5
  96. package/dist/utils/primitive.js +34 -14
  97. package/dist/utils/primitive.js.map +1 -6
  98. package/dist/utils/str.d.ts +38 -38
  99. package/dist/utils/str.js +217 -113
  100. package/dist/utils/str.js.map +1 -6
  101. package/dist/utils/template-strings.d.ts +26 -26
  102. package/dist/utils/template-strings.js +113 -40
  103. package/dist/utils/template-strings.js.map +1 -6
  104. package/dist/utils/transferable.d.ts +18 -18
  105. package/dist/utils/transferable.js +218 -151
  106. package/dist/utils/transferable.js.map +1 -6
  107. package/dist/utils/wait.d.ts +9 -9
  108. package/dist/utils/wait.js +30 -15
  109. package/dist/utils/wait.js.map +1 -6
  110. package/dist/utils/xml.d.ts +13 -13
  111. package/dist/utils/xml.js +84 -46
  112. package/dist/utils/xml.js.map +1 -6
  113. package/dist/utils/zip.d.ts +22 -22
  114. package/dist/utils/zip.js +172 -148
  115. package/dist/utils/zip.js.map +1 -6
  116. package/docs/array-extensions.md +430 -0
  117. package/docs/env.md +52 -0
  118. package/docs/errors.md +41 -56
  119. package/docs/features.md +82 -97
  120. package/docs/type-utilities.md +91 -0
  121. package/docs/types.md +221 -201
  122. package/docs/utils.md +319 -435
  123. package/package.json +7 -5
  124. package/src/common.types.ts +14 -14
  125. package/src/env.ts +12 -3
  126. package/src/errors/argument-error.ts +15 -15
  127. package/src/errors/not-implemented-error.ts +9 -9
  128. package/src/errors/sd-error.ts +12 -12
  129. package/src/errors/timeout-error.ts +12 -12
  130. package/src/extensions/arr-ext.helpers.ts +16 -16
  131. package/src/extensions/arr-ext.ts +35 -35
  132. package/src/extensions/arr-ext.types.ts +57 -57
  133. package/src/extensions/map-ext.ts +16 -16
  134. package/src/extensions/set-ext.ts +11 -11
  135. package/src/features/debounce-queue.ts +23 -23
  136. package/src/features/event-emitter.ts +25 -25
  137. package/src/features/serial-queue.ts +13 -13
  138. package/src/globals.ts +4 -4
  139. package/src/index.ts +5 -5
  140. package/src/types/date-only.ts +84 -83
  141. package/src/types/date-time.ts +43 -42
  142. package/src/types/lazy-gc-map.ts +44 -44
  143. package/src/types/time.ts +29 -29
  144. package/src/types/uuid.ts +15 -15
  145. package/src/utils/bytes.ts +35 -35
  146. package/src/utils/date-format.ts +59 -59
  147. package/src/utils/error.ts +4 -4
  148. package/src/utils/json.ts +41 -41
  149. package/src/utils/num.ts +20 -20
  150. package/src/utils/obj.ts +138 -138
  151. package/src/utils/path.ts +10 -10
  152. package/src/utils/primitive.ts +6 -6
  153. package/src/utils/str.ts +48 -48
  154. package/src/utils/template-strings.ts +29 -29
  155. package/src/utils/transferable.ts +38 -38
  156. package/src/utils/wait.ts +10 -10
  157. package/src/utils/xml.ts +19 -19
  158. package/src/utils/zip.ts +25 -25
  159. package/docs/extensions.md +0 -387
  160. package/tests/errors/errors.spec.ts +0 -80
  161. package/tests/extensions/array-extension.spec.ts +0 -654
  162. package/tests/extensions/map-extension.spec.ts +0 -117
  163. package/tests/extensions/set-extension.spec.ts +0 -67
  164. package/tests/types/date-only.spec.ts +0 -533
  165. package/tests/types/date-time.spec.ts +0 -246
  166. package/tests/types/lazy-gc-map.spec.ts +0 -606
  167. package/tests/types/time.spec.ts +0 -428
  168. package/tests/types/uuid.spec.ts +0 -74
  169. package/tests/utils/bytes-utils.spec.ts +0 -197
  170. package/tests/utils/date-format.spec.ts +0 -350
  171. package/tests/utils/debounce-queue.spec.ts +0 -226
  172. package/tests/utils/json.spec.ts +0 -400
  173. package/tests/utils/number.spec.ts +0 -136
  174. package/tests/utils/object.spec.ts +0 -810
  175. package/tests/utils/path.spec.ts +0 -70
  176. package/tests/utils/primitive.spec.ts +0 -43
  177. package/tests/utils/sd-event-emitter.spec.ts +0 -189
  178. package/tests/utils/serial-queue.spec.ts +0 -305
  179. package/tests/utils/string.spec.ts +0 -265
  180. package/tests/utils/template-strings.spec.ts +0 -48
  181. package/tests/utils/transferable.spec.ts +0 -639
  182. package/tests/utils/wait.spec.ts +0 -123
  183. package/tests/utils/xml.spec.ts +0 -146
  184. package/tests/utils/zip.spec.ts +0 -221
@@ -1,3 +1,7 @@
1
+ /**
2
+ * JSON 변환 유틸리티
3
+ * 커스텀 타입(DateTime, DateOnly, Time, Uuid 등)을 지원하는 JSON 직렬화/역직렬화
4
+ */
1
5
  import { DateTime } from "../types/date-time.js";
2
6
  import { DateOnly } from "../types/date-only.js";
3
7
  import { Time } from "../types/time.js";
@@ -6,149 +10,197 @@ import { nullToUndefined } from "./obj.js";
6
10
  import { SdError } from "../errors/sd-error.js";
7
11
  import { toHex, fromHex } from "./bytes.js";
8
12
  import { env } from "../env.js";
9
- function stringify(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) } : {}
13
+ //#region stringify
14
+ /**
15
+ * 객체를 JSON 문자열로 직렬화
16
+ * DateTime, DateOnly, Time, Uuid, Set, Map, Error, Uint8Array 커스텀 타입 지원.
17
+ *
18
+ * @param obj 직렬화할 객체
19
+ * @param options 직렬화 옵션
20
+ * @param options.space JSON 들여쓰기 (숫자: 공백 수, 문자열: 들여쓰기 문자열)
21
+ * @param options.replacer 커스텀 replacer 함수. 기본 타입 변환 전에 호출됨
22
+ * @param options.redactBytes true이면 Uint8Array 내용을 "__hidden__"으로 대체 (로깅용). 이 옵션으로 직렬화된 결과는 jsonParse()로 원래 Uint8Array를 복원할 수 없음
23
+ *
24
+ * @remarks
25
+ * - 순환 참조가 있는 객체는 TypeError를 발생시킴
26
+ * - 객체에 toJSON 메서드가 있으면 호출하여 결과를 사용 (Date, DateTime 같은 커스텀 타입 제외)
27
+ * - 전역 프로토타입을 수정하지 않으므로 Worker 환경에서 안전
28
+ */
29
+ export function stringify(obj, options) {
30
+ // 순환 참조 감지용 WeakSet
31
+ const seen = new WeakSet();
32
+ /**
33
+ * 객체를 재귀적으로 순회하며 특수 타입을 __type__ 형식으로 변환
34
+ *
35
+ * JSON.stringify의 replacer는 toJSON 호출 후의 값을 받으므로,
36
+ * Date 같은 타입은 사전에 변환해야 올바르게 처리됨.
37
+ * 전역 프로토타입을 수정하지 않으므로 Worker 환경에서 안전.
38
+ *
39
+ * @param key 현재 값의 key (루트는 undefined)
40
+ * @param value 변환할 값
41
+ */
42
+ const convertSpecialTypes = (key, value) => {
43
+ // 커스텀 replacer 적용
44
+ const currValue = options?.replacer !== undefined ? options.replacer(key, value) : value;
45
+ if (currValue instanceof Date) {
46
+ return { __type__: "Date", data: currValue.toISOString() };
53
47
  }
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: toHex(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;
48
+ if (currValue instanceof DateTime) {
49
+ return { __type__: "DateTime", data: currValue.toString() };
86
50
  }
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 parse(json) {
97
- try {
98
- return nullToUndefined(
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);
51
+ if (currValue instanceof DateOnly) {
52
+ return { __type__: "DateOnly", data: currValue.toString() };
53
+ }
54
+ if (currValue instanceof Time) {
55
+ return { __type__: "Time", data: currValue.toString() };
56
+ }
57
+ if (currValue instanceof Uuid) {
58
+ return { __type__: "Uuid", data: currValue.toString() };
59
+ }
60
+ if (currValue instanceof Set) {
61
+ return {
62
+ __type__: "Set",
63
+ data: Array.from(currValue).map((item, i) => convertSpecialTypes(String(i), item)),
64
+ };
65
+ }
66
+ if (currValue instanceof Map) {
67
+ return {
68
+ __type__: "Map",
69
+ data: Array.from(currValue.entries()).map(([k, v], i) => [
70
+ convertSpecialTypes(String(i), k),
71
+ convertSpecialTypes(String(i), v),
72
+ ]),
73
+ };
74
+ }
75
+ if (currValue instanceof Error) {
76
+ return {
77
+ __type__: "Error",
78
+ data: {
79
+ name: currValue.name,
80
+ message: currValue.message,
81
+ stack: currValue.stack,
82
+ ...("code" in currValue ? { code: currValue.code } : {}),
83
+ ...("detail" in currValue ? { detail: currValue.detail } : {}),
84
+ ...("cause" in currValue ? { cause: convertSpecialTypes("cause", currValue.cause) } : {}),
85
+ },
86
+ };
87
+ }
88
+ if (currValue instanceof Uint8Array) {
89
+ if (options?.redactBytes === true) {
90
+ return { __type__: "Uint8Array", data: "__hidden__" };
114
91
  }
115
- if (typed.__type__ === "Uuid" && typeof typed.data === "string") {
116
- return new Uuid(typed.data);
92
+ return { __type__: "Uint8Array", data: toHex(currValue) };
93
+ }
94
+ // Array 처리
95
+ if (Array.isArray(currValue)) {
96
+ // 순환 참조 감지
97
+ if (seen.has(currValue)) {
98
+ throw new TypeError("Converting circular structure to JSON");
117
99
  }
118
- if (typed.__type__ === "Set" && Array.isArray(typed.data)) {
119
- return new Set(typed.data);
100
+ seen.add(currValue);
101
+ const result = currValue.map((item, i) => convertSpecialTypes(String(i), item));
102
+ seen.delete(currValue);
103
+ return result;
104
+ }
105
+ // 일반 객체 처리
106
+ if (currValue !== null && typeof currValue === "object") {
107
+ // 순환 참조 감지
108
+ if (seen.has(currValue)) {
109
+ throw new TypeError("Converting circular structure to JSON");
120
110
  }
121
- if (typed.__type__ === "Map" && Array.isArray(typed.data)) {
122
- return new Map(typed.data);
111
+ seen.add(currValue);
112
+ // toJSON 메서드가 있으면 호출 (Date, DateTime 같은 커스텀 타입은 위에서 이미 처리됨)
113
+ if ("toJSON" in currValue &&
114
+ typeof currValue.toJSON === "function") {
115
+ const toJsonResult = currValue.toJSON(key);
116
+ seen.delete(currValue);
117
+ return convertSpecialTypes(key, toJsonResult);
123
118
  }
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;
119
+ const result = {};
120
+ for (const [k, v] of Object.entries(currValue)) {
121
+ const converted = convertSpecialTypes(k, v);
122
+ // undefined는 JSON에서 제외됨
123
+ if (converted !== undefined) {
124
+ result[k] = converted;
125
+ }
129
126
  }
130
- if (typed.__type__ === "Uint8Array" && typeof typed.data === "string") {
131
- if (typed.data === "__hidden__") {
132
- throw new SdError(
133
- "Uint8Array serialized with redactBytes option cannot be restored via parse"
134
- );
135
- }
136
- return fromHex(typed.data);
127
+ seen.delete(currValue);
128
+ return result;
129
+ }
130
+ return currValue;
131
+ };
132
+ // 전체 객체를 먼저 변환한 후 JSON.stringify 호출
133
+ // Date.prototype.toJSON을 수정하지 않으므로 동시성 환경에서 안전
134
+ const converted = convertSpecialTypes(undefined, obj);
135
+ return JSON.stringify(converted, null, options?.space);
136
+ }
137
+ //#endregion
138
+ //#region parse
139
+ /**
140
+ * JSON 문자열을 객체로 역직렬화
141
+ * DateTime, DateOnly, Time, Uuid, Set, Map, Error, Uint8Array 등 커스텀 타입 복원.
142
+ *
143
+ * @remarks
144
+ * `__type__`과 `data` key를 가진 객체가 타입 복원에 사용됨.
145
+ * 사용자 데이터에 `{ __type__: "Date" | "DateTime" | "DateOnly" | "Time" | "Uuid" | "Set" | "Map" | "Error" | "Uint8Array", data: ... }`
146
+ * 형식의 객체가 포함되어 있으면 의도치 않게 타입으로 변환될 수 있으므로 주의.
147
+ * 모든 JSON null 값은 undefined로 변환됨.
148
+ * 이는 simplysm 프레임워크의 null-free 규칙을 위한 의도적인 동작.
149
+ *
150
+ * @security 개발 모드(`__DEV__`)에서는 에러 메시지에 전체 JSON 문자열이 포함됨.
151
+ * 운영 모드에서는 JSON 길이만 포함됨.
152
+ */
153
+ export function parse(json) {
154
+ try {
155
+ return nullToUndefined(JSON.parse(json, (_key, value) => {
156
+ if (value != null && typeof value === "object") {
157
+ // __type__ 마커 기반 타입 복원
158
+ if ("__type__" in value && "data" in value) {
159
+ const typed = value;
160
+ if (typed.__type__ === "Date" && typeof typed.data === "string") {
161
+ return new Date(Date.parse(typed.data));
162
+ }
163
+ if (typed.__type__ === "DateTime" && typeof typed.data === "string") {
164
+ return DateTime.parse(typed.data);
165
+ }
166
+ if (typed.__type__ === "DateOnly" && typeof typed.data === "string") {
167
+ return DateOnly.parse(typed.data);
168
+ }
169
+ if (typed.__type__ === "Time" && typeof typed.data === "string") {
170
+ return Time.parse(typed.data);
171
+ }
172
+ if (typed.__type__ === "Uuid" && typeof typed.data === "string") {
173
+ return new Uuid(typed.data);
174
+ }
175
+ if (typed.__type__ === "Set" && Array.isArray(typed.data)) {
176
+ return new Set(typed.data);
177
+ }
178
+ if (typed.__type__ === "Map" && Array.isArray(typed.data)) {
179
+ return new Map(typed.data);
180
+ }
181
+ if (typed.__type__ === "Error" && typeof typed.data === "object") {
182
+ const errorData = typed.data;
183
+ const error = new Error(errorData["message"]);
184
+ Object.assign(error, errorData);
185
+ return error;
186
+ }
187
+ if (typed.__type__ === "Uint8Array" && typeof typed.data === "string") {
188
+ if (typed.data === "__hidden__") {
189
+ throw new SdError("redactBytes 옵션으로 직렬화된 Uint8Array는 parse로 복원할 수 없습니다");
190
+ }
191
+ return fromHex(typed.data);
192
+ }
193
+ }
137
194
  }
138
- }
195
+ return value;
196
+ }));
197
+ }
198
+ catch (err) {
199
+ if (env.DEV) {
200
+ throw new SdError(err, "JSON 파싱 오류: \n" + json);
139
201
  }
140
- return value;
141
- })
142
- );
143
- } catch (err) {
144
- if (env.DEV) {
145
- throw new SdError(err, "JSON parsing error: \n" + json);
202
+ throw new SdError(err, `JSON 파싱 오류 (길이: ${json.length})`);
146
203
  }
147
- throw new SdError(err, `JSON parsing error (length: ${json.length})`);
148
- }
149
204
  }
150
- export {
151
- parse,
152
- stringify
153
- };
154
- //# sourceMappingURL=json.js.map
205
+ //#endregion
206
+ //# sourceMappingURL=json.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/json.ts"],
4
- "mappings": "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",
5
- "names": ["converted"]
6
- }
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"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"}
@@ -1,33 +1,33 @@
1
1
  /**
2
- * Number utility functions
2
+ * 숫자 유틸리티 함수
3
3
  */
4
4
  /**
5
- * Parse string to integer
6
- * Remove non-numeric characters (except 0-9, -, .) before parsing
5
+ * 문자열을 정수로 파싱
6
+ * 파싱 비숫자 문자(0-9, -, . 제외) 제거
7
7
  *
8
- * @note Strings with decimal points return only the integer part (e.g., '12.34' → 12).
9
- * Use {@link parseRoundedInt} if rounding is needed.
10
- * @note Hyphens (-) in the middle of the string are preserved, which may result in unintended negative numbers.
11
- * Example: `"A-123B"` → `-123`
8
+ * @note 소수점이 있는 문자열은 정수 부분만 반환 (예: '12.34' → 12).
9
+ * 반올림이 필요하면 {@link parseRoundedInt} 사용.
10
+ * @note 문자열 중간의 하이픈(-) 유지되므로 의도치 않은 음수가 있음.
11
+ * 예: `"A-123B"` → `-123`
12
12
  */
13
13
  export declare function parseInt(text: unknown): number | undefined;
14
14
  /**
15
- * Parse string to float, then round and return integer
15
+ * 문자열을 float 파싱한 반올림하여 정수 반환
16
16
  */
17
17
  export declare function parseRoundedInt(text: unknown): number | undefined;
18
18
  /**
19
- * Parse string to float
20
- * Remove non-numeric characters before parsing
19
+ * 문자열을 float로 파싱
20
+ * 파싱 비숫자 문자 제거
21
21
  */
22
22
  export declare function parseFloat(text: unknown): number | undefined;
23
23
  /**
24
- * Check undefined, null, 0 (type guard)
24
+ * undefined, null, 0 검사 (타입 가드)
25
25
  *
26
- * Acts as a type guard, guaranteeing that if true is returned, `val` is `0 | undefined`.
27
- * If false is returned, `val` is guaranteed to be a valid non-zero number.
26
+ * 타입 가드로 동작하여, true 반환하면 `val`이 `0 | undefined`임을 보장.
27
+ * false 반환하면 `val`이 유효한 0이 아닌 숫자임을 보장.
28
28
  *
29
- * @param val Value to check
30
- * @returns true if undefined, null, or 0
29
+ * @param val 검사할
30
+ * @returns undefined, null, 또는 0이면 true
31
31
  * @example
32
32
  * const count: number | undefined = getValue();
33
33
  * if (isNullOrEmpty(count)) {
@@ -40,11 +40,11 @@ export declare function parseFloat(text: unknown): number | undefined;
40
40
  */
41
41
  export declare function isNullOrEmpty(val: number | undefined): val is 0 | undefined;
42
42
  /**
43
- * Format number to string with thousand separators
44
- * @param val Number to format
45
- * @param digit Decimal place options
46
- * @param digit.max Maximum decimal places
47
- * @param digit.min Minimum decimal places (pad with 0 if insufficient)
43
+ * 숫자를 단위 구분자가 포함된 문자열로 포맷
44
+ * @param val 포맷할 숫자
45
+ * @param digit 소수점 옵션
46
+ * @param digit.max 최대 소수점 자릿수
47
+ * @param digit.min 최소 소수점 자릿수 (부족하면 0으로 채움)
48
48
  * @example
49
49
  * format(1234.567, { max: 2 }) // "1,234.57"
50
50
  * format(1234, { min: 2 }) // "1,234.00"
package/dist/utils/num.js CHANGED
@@ -1,39 +1,81 @@
1
- function parseInt(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;
1
+ /**
2
+ * 숫자 유틸리티 함수
3
+ */
4
+ //#region parseInt / parseFloat / parseRoundedInt
5
+ /**
6
+ * 문자열을 정수로 파싱
7
+ * 파싱 전 비숫자 문자(0-9, -, . 제외) 제거
8
+ *
9
+ * @note 소수점이 있는 문자열은 정수 부분만 반환 (예: '12.34' → 12).
10
+ * 반올림이 필요하면 {@link parseRoundedInt} 사용.
11
+ * @note 문자열 중간의 하이픈(-)은 유지되므로 의도치 않은 음수가 될 수 있음.
12
+ * 예: `"A-123B"` → `-123`
13
+ */
14
+ export function parseInt(text) {
15
+ if (typeof text === "number")
16
+ return Math.trunc(text);
17
+ if (typeof text !== "string")
18
+ return undefined;
19
+ const txt = text.replace(/[^0-9.\-]/g, "").trim();
20
+ if (txt === "")
21
+ return undefined;
22
+ const result = Number.parseInt(txt, 10);
23
+ if (Number.isNaN(result))
24
+ return undefined;
25
+ return result;
9
26
  }
10
- function parseRoundedInt(text) {
11
- const float = parseFloat(text);
12
- return float !== void 0 ? Math.round(float) : void 0;
27
+ /**
28
+ * 문자열을 float 파싱한 후 반올림하여 정수 반환
29
+ */
30
+ export function parseRoundedInt(text) {
31
+ const float = parseFloat(text);
32
+ return float !== undefined ? Math.round(float) : undefined;
13
33
  }
14
- function parseFloat(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;
34
+ /**
35
+ * 문자열을 float로 파싱
36
+ * 파싱 비숫자 문자 제거
37
+ */
38
+ export function parseFloat(text) {
39
+ if (typeof text === "number")
40
+ return text;
41
+ if (typeof text !== "string")
42
+ return undefined;
43
+ const txt = text.replace(/[^0-9.\-]/g, "").trim();
44
+ if (txt === "")
45
+ return undefined;
46
+ const result = Number.parseFloat(txt);
47
+ if (Number.isNaN(result))
48
+ return undefined;
49
+ return result;
22
50
  }
23
- function isNullOrEmpty(val) {
24
- return val == null || val === 0;
51
+ //#endregion
52
+ //#region isNullOrEmpty
53
+ /**
54
+ * undefined, null, 0 검사 (타입 가드)
55
+ *
56
+ * 타입 가드로 동작하여, true를 반환하면 `val`이 `0 | undefined`임을 보장.
57
+ * false를 반환하면 `val`이 유효한 0이 아닌 숫자임을 보장.
58
+ *
59
+ * @param val 검사할 값
60
+ * @returns undefined, null, 또는 0이면 true
61
+ * @example
62
+ * const count: number | undefined = getValue();
63
+ * if (isNullOrEmpty(count)) {
64
+ * // count: 0 | undefined
65
+ * console.log("Empty");
66
+ * } else {
67
+ * // count: number (non-zero value)
68
+ * console.log(`Count: ${count}`);
69
+ * }
70
+ */
71
+ export function isNullOrEmpty(val) {
72
+ return val == null || val === 0;
25
73
  }
26
- function format(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
- });
74
+ export function format(val, digit) {
75
+ return val?.toLocaleString(undefined, {
76
+ maximumFractionDigits: digit?.max,
77
+ minimumFractionDigits: digit?.min,
78
+ });
31
79
  }
32
- export {
33
- format,
34
- isNullOrEmpty,
35
- parseFloat,
36
- parseInt,
37
- parseRoundedInt
38
- };
39
- //# sourceMappingURL=num.js.map
80
+ //#endregion
81
+ //# sourceMappingURL=num.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/num.ts"],
4
- "mappings": "AAeO,SAAS,SAAS,MAAmC;AAC1D,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,gBAAgB,MAAmC;AACjE,QAAM,QAAQ,WAAW,IAAI;AAC7B,SAAO,UAAU,SAAY,KAAK,MAAM,KAAK,IAAI;AACnD;AAMO,SAAS,WAAW,MAAmC;AAC5D,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,cAAc,KAA+C;AAC3E,SAAO,OAAO,QAAQ,QAAQ;AAChC;AAqBO,SAAS,OACd,KACA,OACoB;AACpB,SAAO,2BAAK,eAAe,QAAW;AAAA,IACpC,uBAAuB,+BAAO;AAAA,IAC9B,uBAAuB,+BAAO;AAAA,EAChC;AACF;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"num.js","sourceRoot":"","sources":["../../src/utils/num.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iDAAiD;AAEjD;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,YAAY;AAEZ,uBAAuB;AAEvB;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAAC,GAAuB;IACnD,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC;AAClC,CAAC;AAqBD,MAAM,UAAU,MAAM,CACpB,GAAuB,EACvB,KAAsC;IAEtC,OAAO,GAAG,EAAE,cAAc,CAAC,SAAS,EAAE;QACpC,qBAAqB,EAAE,KAAK,EAAE,GAAG;QACjC,qBAAqB,EAAE,KAAK,EAAE,GAAG;KAClC,CAAC,CAAC;AACL,CAAC;AAED,YAAY"}