@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 +1 @@
1
- {"version":3,"file":"sd-error.d.ts","sourceRoot":"","sources":["../../src/errors/sd-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,OAAQ,SAAQ,KAAK;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;IAEvB,+HAA+H;gBACnH,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;IAC/C,uGAAuG;gBAC3F,GAAG,QAAQ,EAAE,MAAM,EAAE;gBACrB,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;CAoClD"}
1
+ {"version":3,"file":"sd-error.d.ts","sourceRoot":"","sources":["../../src/errors/sd-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,OAAQ,SAAQ,KAAK;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;IAEvB,gEAAgE;gBACpD,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;IAC/C,kDAAkD;gBACtC,GAAG,QAAQ,EAAE,MAAM,EAAE;gBACrB,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;CAoClD"}
@@ -1,26 +1,47 @@
1
- class SdError extends Error {
2
- cause;
3
- constructor(arg1, ...messages) {
4
- const arg1Message = arg1 instanceof Error ? arg1.message : typeof arg1 === "string" ? arg1 : arg1 != null ? String(arg1) : void 0;
5
- const fullMessage = [arg1Message, ...messages].filter((m) => m != null).reverse().join(" => ");
6
- const cause = arg1 instanceof Error ? arg1 : void 0;
7
- super(fullMessage, { cause });
8
- Object.setPrototypeOf(this, new.target.prototype);
9
- this.name = "SdError";
10
- if ("captureStackTrace" in Error) {
11
- Error.captureStackTrace(
12
- this,
13
- new.target
14
- );
1
+ /**
2
+ * 트리 구조 조합을 지원하는 에러 클래스
3
+ * ES2024 cause 속성을 활용
4
+ *
5
+ * @example
6
+ * // 원인 에러를 감싸기
7
+ * try {
8
+ * await fetch(url);
9
+ * } catch (err) {
10
+ * throw new SdError(err, "API 호출 실패", "사용자 로드 실패");
11
+ * }
12
+ * // 결과 메시지: "사용자 로드 실패 => API 호출 실패 => 원본 에러 메시지"
13
+ *
14
+ * @example
15
+ * // 메시지만으로 생성
16
+ * throw new SdError("잘못된 상태", "처리 불가");
17
+ * // 결과 메시지: "처리 불가 => 잘못된 상태"
18
+ */
19
+ export class SdError extends Error {
20
+ cause;
21
+ constructor(arg1, ...messages) {
22
+ const arg1Message = arg1 instanceof Error
23
+ ? arg1.message
24
+ : typeof arg1 === "string"
25
+ ? arg1
26
+ : arg1 != null
27
+ ? String(arg1)
28
+ : undefined;
29
+ const fullMessage = [arg1Message, ...messages]
30
+ .filter((m) => m != null)
31
+ .reverse()
32
+ .join(" => ");
33
+ const cause = arg1 instanceof Error ? arg1 : undefined;
34
+ super(fullMessage, { cause });
35
+ Object.setPrototypeOf(this, new.target.prototype);
36
+ this.name = "SdError";
37
+ // captureStackTrace는 V8 엔진(Node.js, Chrome)에서만 사용 가능
38
+ if ("captureStackTrace" in Error) {
39
+ Error.captureStackTrace(this, new.target);
40
+ }
41
+ // 원인 체인 stack을 현재 stack에 추가
42
+ if (cause?.stack != null) {
43
+ this.stack += `\n---- cause stack ----\n${cause.stack}`;
44
+ }
15
45
  }
16
- if ((cause == null ? void 0 : cause.stack) != null) {
17
- this.stack += `
18
- ---- cause stack ----
19
- ${cause.stack}`;
20
- }
21
- }
22
46
  }
23
- export {
24
- SdError
25
- };
26
- //# sourceMappingURL=sd-error.js.map
47
+ //# sourceMappingURL=sd-error.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/errors/sd-error.ts"],
4
- "mappings": "AAkBO,MAAM,gBAAgB,MAAM;AAAA,EACxB;AAAA,EAOT,YAAY,SAAmB,UAAoB;AACjD,UAAM,cACJ,gBAAgB,QACZ,KAAK,UACL,OAAO,SAAS,WACd,OACA,QAAQ,OACN,OAAO,IAAI,IACX;AAEV,UAAM,cAAc,CAAC,aAAa,GAAG,QAAQ,EAC1C,OAAO,CAAC,MAAM,KAAK,IAAI,EACvB,QAAQ,EACR,KAAK,MAAM;AAEd,UAAM,QAAQ,gBAAgB,QAAQ,OAAO;AAE7C,UAAM,aAAa,EAAE,MAAM,CAAC;AAE5B,WAAO,eAAe,MAAM,WAAW,SAAS;AAChD,SAAK,OAAO;AAGZ,QAAI,uBAAuB,OAAO;AAChC,MAAC,MAAM;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,SAAI,+BAAO,UAAS,MAAM;AACxB,WAAK,SAAS;AAAA;AAAA,EAA4B,MAAM,KAAK;AAAA,IACvD;AAAA,EACF;AACF;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"sd-error.js","sourceRoot":"","sources":["../../src/errors/sd-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,OAAQ,SAAQ,KAAK;IACvB,KAAK,CAAS;IAOvB,YAAY,IAAc,EAAE,GAAG,QAAkB;QAC/C,MAAM,WAAW,GACf,IAAI,YAAY,KAAK;YACnB,CAAC,CAAC,IAAI,CAAC,OAAO;YACd,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ;gBACxB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,IAAI,IAAI;oBACZ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;oBACd,CAAC,CAAC,SAAS,CAAC;QAEpB,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;aACxB,OAAO,EAAE;aACT,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,KAAK,GAAG,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvD,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QAEtB,qDAAqD;QACrD,IAAI,mBAAmB,IAAI,KAAK,EAAE,CAAC;YAChC,KAAK,CAAC,iBAA+E,CACpF,IAAI,EACJ,GAAG,CAAC,MAAM,CACX,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,IAAI,4BAA4B,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;CACF"}
@@ -1,30 +1,30 @@
1
1
  import { SdError } from "./sd-error";
2
2
  /**
3
- * Timeout error
3
+ * 타임아웃 오류
4
4
  *
5
- * An error that occurs when the waiting time is exceeded.
6
- * Automatically thrown when the maximum number of attempts is exceeded in async waiting functions like Wait.until().
5
+ * 대기 시간이 초과되었을 발생하는 에러.
6
+ * Wait.until() 같은 비동기 대기 함수에서 최대 시도 횟수를 초과하면 자동으로 발생한다.
7
7
  *
8
8
  * @example
9
- * // Automatically thrown from Wait.until
9
+ * // Wait.until에서 자동 발생
10
10
  * try {
11
- * await Wait.until(() => isReady, 100, 50); // 100ms interval, max 50 attempts
11
+ * await Wait.until(() => isReady, 100, 50); // 100ms 간격, 최대 50 시도
12
12
  * } catch (err) {
13
13
  * if (err instanceof TimeoutError) {
14
- * console.log("Timeout exceeded");
14
+ * console.log("타임아웃 초과");
15
15
  * }
16
16
  * }
17
17
  *
18
18
  * @example
19
- * // Thrown directly
19
+ * // 직접 발생
20
20
  * if (elapsed > maxTime) {
21
- * throw new TimeoutError(undefined, "Waiting for API response exceeded");
21
+ * throw new TimeoutError(undefined, "API 응답 대기 초과");
22
22
  * }
23
23
  */
24
24
  export declare class TimeoutError extends SdError {
25
25
  /**
26
- * @param count Number of attempts
27
- * @param message Additional message
26
+ * @param count 시도 횟수
27
+ * @param message 추가 메시지
28
28
  */
29
29
  constructor(count?: number, message?: string);
30
30
  }
@@ -1,17 +1,36 @@
1
1
  import { SdError } from "./sd-error.js";
2
- class TimeoutError extends SdError {
3
- /**
4
- * @param count Number of attempts
5
- * @param message Additional message
6
- */
7
- constructor(count, message) {
8
- super(
9
- "Waiting time exceeded" + (count != null ? `(${count} attempts)` : "") + (message != null ? `: ${message}` : "")
10
- );
11
- this.name = "TimeoutError";
12
- }
2
+ /**
3
+ * 타임아웃 오류
4
+ *
5
+ * 대기 시간이 초과되었을 때 발생하는 에러.
6
+ * Wait.until() 같은 비동기 대기 함수에서 최대 시도 횟수를 초과하면 자동으로 발생한다.
7
+ *
8
+ * @example
9
+ * // Wait.until에서 자동 발생
10
+ * try {
11
+ * await Wait.until(() => isReady, 100, 50); // 100ms 간격, 최대 50회 시도
12
+ * } catch (err) {
13
+ * if (err instanceof TimeoutError) {
14
+ * console.log("타임아웃 초과");
15
+ * }
16
+ * }
17
+ *
18
+ * @example
19
+ * // 직접 발생
20
+ * if (elapsed > maxTime) {
21
+ * throw new TimeoutError(undefined, "API 응답 대기 초과");
22
+ * }
23
+ */
24
+ export class TimeoutError extends SdError {
25
+ /**
26
+ * @param count 시도 횟수
27
+ * @param message 추가 메시지
28
+ */
29
+ constructor(count, message) {
30
+ super("대기 시간 초과" +
31
+ (count != null ? `(${count}회 시도)` : "") +
32
+ (message != null ? `: ${message}` : ""));
33
+ this.name = "TimeoutError";
34
+ }
13
35
  }
14
- export {
15
- TimeoutError
16
- };
17
- //# sourceMappingURL=timeout-error.js.map
36
+ //# sourceMappingURL=timeout-error.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/errors/timeout-error.ts"],
4
- "mappings": "AAAA,SAAS,eAAe;AAwBjB,MAAM,qBAAqB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxC,YAAY,OAAgB,SAAkB;AAC5C;AAAA,MACE,2BACG,SAAS,OAAO,IAAI,KAAK,eAAe,OACxC,WAAW,OAAO,KAAK,OAAO,KAAK;AAAA,IACxC;AACA,SAAK,OAAO;AAAA,EACd;AACF;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"timeout-error.js","sourceRoot":"","sources":["../../src/errors/timeout-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,YAAa,SAAQ,OAAO;IACvC;;;OAGG;IACH,YAAY,KAAc,EAAE,OAAgB;QAC1C,KAAK,CACH,UAAU;YACR,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC1C,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Array extension methods
2
+ * Array 확장 메서드
3
3
  *
4
- * @remarks See type definition file (arr-ext.types.ts) for TSDoc of each method
4
+ * @remarks 메서드의 TSDoc은 타입 정의 파일(arr-ext.types.ts) 참조
5
5
  */
6
6
  import "./map-ext";
7
7
  import type { ReadonlyArrayExt, MutableArrayExt } from "./arr-ext.types";
@@ -1,24 +1,24 @@
1
1
  /**
2
- * Array extension helper functions
2
+ * Array 확장 헬퍼 함수
3
3
  */
4
4
  import type { ComparableType } from "./arr-ext.types";
5
5
  /**
6
- * Convert DateTime, DateOnly, Time to comparable primitive values
6
+ * DateTime, DateOnly, Time 비교 가능한 원시 값으로 변환
7
7
  */
8
8
  export declare function toComparable(value: ComparableType): string | number | boolean | undefined;
9
9
  /**
10
- * Comparison function for sorting
10
+ * 정렬용 비교 함수
11
11
  *
12
- * @param pp comparison target 1
13
- * @param pn comparison target 2
14
- * @param desc true: descending, false: ascending
15
- * @returns negative: pp comes first, 0: equal, positive: pn comes first
16
- * @note null/undefined values are sorted first in ascending, last in descending
12
+ * @param pp 비교 대상 1
13
+ * @param pn 비교 대상 2
14
+ * @param desc true: 내림차순, false: 오름차순
15
+ * @returns 음수: pp 앞, 0: 같음, 양수: pn
16
+ * @note null/undefined 값은 오름차순에서 앞, 내림차순에서 뒤로 정렬됨
17
17
  */
18
18
  export declare function compareForOrder(pp: ComparableType, pn: ComparableType, desc: boolean): number;
19
19
  /**
20
- * Returns a Set of indices to KEEP (i.e., first occurrence of each unique item).
21
- * Handles all deduplication strategies: matchAddress, keyFn, and default type-based.
20
+ * 유지할 index의 Set 반환 (즉, 고유 항목의 번째 등장 위치).
21
+ * matchAddress, keyFn, 기본 타입 기반 등 모든 중복 제거 전략을 처리한다.
22
22
  */
23
23
  export declare function getDistinctIndices<TItem>(items: readonly TItem[], options?: boolean | {
24
24
  matchAddress?: boolean;
@@ -1,103 +1,126 @@
1
+ /**
2
+ * Array 확장 헬퍼 함수
3
+ */
1
4
  import { DateTime } from "../types/date-time.js";
2
5
  import { DateOnly } from "../types/date-only.js";
3
6
  import { Time } from "../types/time.js";
4
7
  import { ArgumentError } from "../errors/argument-error.js";
5
8
  import { equal } from "../utils/obj.js";
6
- function toComparable(value) {
7
- if (value instanceof DateOnly || value instanceof DateTime || value instanceof Time) {
8
- return value.tick;
9
- }
10
- return value;
11
- }
12
- function compareForOrder(pp, pn, desc) {
13
- const cpp = toComparable(pp);
14
- const cpn = toComparable(pn);
15
- if (cpn === cpp) return 0;
16
- if (cpp == null) return desc ? 1 : -1;
17
- if (cpn == null) return desc ? -1 : 1;
18
- if (typeof cpn === "string" && typeof cpp === "string") {
19
- return desc ? cpn.localeCompare(cpp) : cpp.localeCompare(cpn);
20
- }
21
- if (typeof cpn === "number" && typeof cpp === "number") {
22
- if (desc) {
23
- return cpp > cpn ? -1 : cpp < cpn ? 1 : 0;
9
+ /**
10
+ * DateTime, DateOnly, Time을 비교 가능한 원시 값으로 변환
11
+ */
12
+ export function toComparable(value) {
13
+ if (value instanceof DateOnly || value instanceof DateTime || value instanceof Time) {
14
+ return value.tick;
24
15
  }
25
- return cpp < cpn ? -1 : cpp > cpn ? 1 : 0;
26
- }
27
- if (typeof cpn === "boolean" && typeof cpp === "boolean") {
28
- return cpn ? desc ? 1 : -1 : desc ? -1 : 1;
29
- }
30
- throw new ArgumentError("Cannot use orderBy with this type.", {
31
- type1: typeof cpp,
32
- type2: typeof cpn
33
- });
16
+ return value;
34
17
  }
35
- function getDistinctIndices(items, options) {
36
- const opts = typeof options === "boolean" ? { matchAddress: options } : options ?? {};
37
- const result = /* @__PURE__ */ new Set();
38
- if (opts.matchAddress === true) {
39
- const seen2 = /* @__PURE__ */ new Set();
40
- for (let i = 0; i < items.length; i++) {
41
- if (!seen2.has(items[i])) {
42
- seen2.add(items[i]);
43
- result.add(i);
44
- }
18
+ /**
19
+ * 정렬용 비교 함수
20
+ *
21
+ * @param pp 비교 대상 1
22
+ * @param pn 비교 대상 2
23
+ * @param desc true: 내림차순, false: 오름차순
24
+ * @returns 음수: pp가 앞, 0: 같음, 양수: pn이 앞
25
+ * @note null/undefined 값은 오름차순에서 앞, 내림차순에서 뒤로 정렬됨
26
+ */
27
+ export function compareForOrder(pp, pn, desc) {
28
+ const cpp = toComparable(pp);
29
+ const cpn = toComparable(pn);
30
+ if (cpn === cpp)
31
+ return 0;
32
+ if (cpp == null)
33
+ return desc ? 1 : -1;
34
+ if (cpn == null)
35
+ return desc ? -1 : 1;
36
+ if (typeof cpn === "string" && typeof cpp === "string") {
37
+ return desc ? cpn.localeCompare(cpp) : cpp.localeCompare(cpn);
45
38
  }
46
- return result;
47
- }
48
- if (opts.keyFn) {
49
- const seen2 = /* @__PURE__ */ new Set();
50
- for (let i = 0; i < items.length; i++) {
51
- const key = opts.keyFn(items[i]);
52
- if (!seen2.has(key)) {
53
- seen2.add(key);
54
- result.add(i);
55
- }
39
+ if (typeof cpn === "number" && typeof cpp === "number") {
40
+ if (desc) {
41
+ return cpp > cpn ? -1 : cpp < cpn ? 1 : 0;
42
+ }
43
+ return cpp < cpn ? -1 : cpp > cpn ? 1 : 0;
56
44
  }
57
- return result;
58
- }
59
- const seen = /* @__PURE__ */ new Map();
60
- const seenRefs = /* @__PURE__ */ new Set();
61
- for (let i = 0; i < items.length; i++) {
62
- const item = items[i];
63
- if (item === null || typeof item !== "object") {
64
- const type = typeof item;
65
- if (type === "symbol" || type === "function") {
66
- const ref = item;
67
- if (!seenRefs.has(ref)) {
68
- seenRefs.add(ref);
69
- result.add(i);
45
+ if (typeof cpn === "boolean" && typeof cpp === "boolean") {
46
+ // true > false: 오름차순에서 true가 뒤, 내림차순에서 true가 앞
47
+ return cpn ? (desc ? 1 : -1) : desc ? -1 : 1;
48
+ }
49
+ throw new ArgumentError("이 타입으로는 orderBy를 사용할 없습니다.", {
50
+ type1: typeof cpp,
51
+ type2: typeof cpn,
52
+ });
53
+ }
54
+ /**
55
+ * 유지할 index의 Set을 반환 (즉, 각 고유 항목의 첫 번째 등장 위치).
56
+ * matchAddress, keyFn, 기본 타입 기반 등 모든 중복 제거 전략을 처리한다.
57
+ */
58
+ export function getDistinctIndices(items, options) {
59
+ const opts = typeof options === "boolean" ? { matchAddress: options } : (options ?? {});
60
+ const result = new Set();
61
+ // matchAddress: Set 기반 O(n)
62
+ if (opts.matchAddress === true) {
63
+ const seen = new Set();
64
+ for (let i = 0; i < items.length; i++) {
65
+ if (!seen.has(items[i])) {
66
+ seen.add(items[i]);
67
+ result.add(i);
68
+ }
70
69
  }
71
- continue;
72
- }
73
- let key = type + ":";
74
- if (Object.is(item, -0)) {
75
- key += "-0";
76
- } else {
77
- key += String(item);
78
- }
79
- if (!seen.has(key)) {
80
- seen.set(key, item);
81
- result.add(i);
82
- }
83
- continue;
70
+ return result;
84
71
  }
85
- let hasDuplicate = false;
86
- for (const keptIdx of result) {
87
- if (equal(items[keptIdx], item)) {
88
- hasDuplicate = true;
89
- break;
90
- }
72
+ // keyFn 제공됨: 커스텀 key 기반 O(n)
73
+ if (opts.keyFn) {
74
+ const seen = new Set();
75
+ for (let i = 0; i < items.length; i++) {
76
+ const key = opts.keyFn(items[i]);
77
+ if (!seen.has(key)) {
78
+ seen.add(key);
79
+ result.add(i);
80
+ }
81
+ }
82
+ return result;
91
83
  }
92
- if (!hasDuplicate) {
93
- result.add(i);
84
+ // 기본: 엣지 케이스를 포함한 타입 기반 처리
85
+ const seen = new Map();
86
+ const seenRefs = new Set();
87
+ for (let i = 0; i < items.length; i++) {
88
+ const item = items[i];
89
+ if (item === null || typeof item !== "object") {
90
+ const type = typeof item;
91
+ if (type === "symbol" || type === "function") {
92
+ const ref = item;
93
+ if (!seenRefs.has(ref)) {
94
+ seenRefs.add(ref);
95
+ result.add(i);
96
+ }
97
+ continue;
98
+ }
99
+ let key = type + ":";
100
+ if (Object.is(item, -0)) {
101
+ key += "-0";
102
+ }
103
+ else {
104
+ key += String(item);
105
+ }
106
+ if (!seen.has(key)) {
107
+ seen.set(key, item);
108
+ result.add(i);
109
+ }
110
+ continue;
111
+ }
112
+ // 객체: 깊은 비교 (O(n²) — 이미 유지된 항목에서 중복이 없을 때만 추가)
113
+ let hasDuplicate = false;
114
+ for (const keptIdx of result) {
115
+ if (equal(items[keptIdx], item)) {
116
+ hasDuplicate = true;
117
+ break;
118
+ }
119
+ }
120
+ if (!hasDuplicate) {
121
+ result.add(i);
122
+ }
94
123
  }
95
- }
96
- return result;
124
+ return result;
97
125
  }
98
- export {
99
- compareForOrder,
100
- getDistinctIndices,
101
- toComparable
102
- };
103
- //# sourceMappingURL=arr-ext.helpers.js.map
126
+ //# sourceMappingURL=arr-ext.helpers.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/extensions/arr-ext.helpers.ts"],
4
- "mappings": "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",
5
- "names": ["seen"]
6
- }
1
+ {"version":3,"file":"arr-ext.helpers.js","sourceRoot":"","sources":["../../src/extensions/arr-ext.helpers.ts"],"names":[],"mappings":"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"}