@simplysm/core-common 13.0.99 → 14.0.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.
Files changed (181) hide show
  1. package/dist/common.types.d.ts +14 -14
  2. package/dist/common.types.js +2 -1
  3. package/dist/common.types.js.map +1 -6
  4. package/dist/env.d.ts +5 -0
  5. package/dist/env.d.ts.map +1 -1
  6. package/dist/env.js +12 -8
  7. package/dist/env.js.map +1 -6
  8. package/dist/errors/argument-error.d.ts +10 -10
  9. package/dist/errors/argument-error.d.ts.map +1 -1
  10. package/dist/errors/argument-error.js +31 -14
  11. package/dist/errors/argument-error.js.map +1 -6
  12. package/dist/errors/not-implemented-error.d.ts +8 -8
  13. package/dist/errors/not-implemented-error.js +30 -12
  14. package/dist/errors/not-implemented-error.js.map +1 -6
  15. package/dist/errors/sd-error.d.ts +10 -10
  16. package/dist/errors/sd-error.d.ts.map +1 -1
  17. package/dist/errors/sd-error.js +45 -24
  18. package/dist/errors/sd-error.js.map +1 -6
  19. package/dist/errors/timeout-error.d.ts +10 -10
  20. package/dist/errors/timeout-error.js +34 -15
  21. package/dist/errors/timeout-error.js.map +1 -6
  22. package/dist/extensions/arr-ext.d.ts +2 -2
  23. package/dist/extensions/arr-ext.helpers.d.ts +10 -10
  24. package/dist/extensions/arr-ext.helpers.js +112 -89
  25. package/dist/extensions/arr-ext.helpers.js.map +1 -6
  26. package/dist/extensions/arr-ext.js +458 -422
  27. package/dist/extensions/arr-ext.js.map +1 -6
  28. package/dist/extensions/arr-ext.types.d.ts +57 -57
  29. package/dist/extensions/arr-ext.types.d.ts.map +1 -1
  30. package/dist/extensions/arr-ext.types.js +6 -1
  31. package/dist/extensions/arr-ext.types.js.map +1 -6
  32. package/dist/extensions/map-ext.d.ts +16 -16
  33. package/dist/extensions/map-ext.js +27 -22
  34. package/dist/extensions/map-ext.js.map +1 -6
  35. package/dist/extensions/set-ext.d.ts +11 -11
  36. package/dist/extensions/set-ext.js +32 -25
  37. package/dist/extensions/set-ext.js.map +1 -6
  38. package/dist/features/debounce-queue.d.ts +17 -17
  39. package/dist/features/debounce-queue.js +98 -70
  40. package/dist/features/debounce-queue.js.map +1 -6
  41. package/dist/features/event-emitter.d.ts +20 -20
  42. package/dist/features/event-emitter.js +101 -78
  43. package/dist/features/event-emitter.js.map +1 -6
  44. package/dist/features/serial-queue.d.ts +11 -11
  45. package/dist/features/serial-queue.js +78 -57
  46. package/dist/features/serial-queue.js.map +1 -6
  47. package/dist/globals.d.ts +4 -4
  48. package/dist/globals.js +9 -1
  49. package/dist/globals.js.map +1 -6
  50. package/dist/index.js +28 -27
  51. package/dist/index.js.map +1 -6
  52. package/dist/types/date-only.d.ts +64 -64
  53. package/dist/types/date-only.d.ts.map +1 -1
  54. package/dist/types/date-only.js +263 -252
  55. package/dist/types/date-only.js.map +1 -6
  56. package/dist/types/date-time.d.ts +36 -36
  57. package/dist/types/date-time.d.ts.map +1 -1
  58. package/dist/types/date-time.js +196 -288
  59. package/dist/types/date-time.js.map +1 -6
  60. package/dist/types/lazy-gc-map.d.ts +26 -26
  61. package/dist/types/lazy-gc-map.d.ts.map +1 -1
  62. package/dist/types/lazy-gc-map.js +202 -159
  63. package/dist/types/lazy-gc-map.js.map +1 -6
  64. package/dist/types/time.d.ts +23 -23
  65. package/dist/types/time.d.ts.map +1 -1
  66. package/dist/types/time.js +169 -158
  67. package/dist/types/time.js.map +1 -6
  68. package/dist/types/uuid.d.ts +11 -11
  69. package/dist/types/uuid.d.ts.map +1 -1
  70. package/dist/types/uuid.js +95 -70
  71. package/dist/types/uuid.js.map +1 -6
  72. package/dist/utils/bytes.d.ts +17 -17
  73. package/dist/utils/bytes.js +137 -81
  74. package/dist/utils/bytes.js.map +1 -6
  75. package/dist/utils/date-format.d.ts +40 -40
  76. package/dist/utils/date-format.js +187 -101
  77. package/dist/utils/date-format.js.map +1 -6
  78. package/dist/utils/error.d.ts +4 -4
  79. package/dist/utils/error.js +11 -6
  80. package/dist/utils/error.js.map +1 -6
  81. package/dist/utils/json.d.ts +19 -19
  82. package/dist/utils/json.js +187 -135
  83. package/dist/utils/json.js.map +1 -6
  84. package/dist/utils/num.d.ts +20 -20
  85. package/dist/utils/num.js +76 -34
  86. package/dist/utils/num.js.map +1 -6
  87. package/dist/utils/obj.d.ts +111 -111
  88. package/dist/utils/obj.d.ts.map +1 -1
  89. package/dist/utils/obj.js +706 -496
  90. package/dist/utils/obj.js.map +1 -6
  91. package/dist/utils/path.d.ts +10 -10
  92. package/dist/utils/path.js +35 -18
  93. package/dist/utils/path.js.map +1 -6
  94. package/dist/utils/primitive.d.ts +5 -5
  95. package/dist/utils/primitive.js +34 -14
  96. package/dist/utils/primitive.js.map +1 -6
  97. package/dist/utils/str.d.ts +38 -38
  98. package/dist/utils/str.js +217 -113
  99. package/dist/utils/str.js.map +1 -6
  100. package/dist/utils/template-strings.d.ts +26 -26
  101. package/dist/utils/template-strings.js +113 -40
  102. package/dist/utils/template-strings.js.map +1 -6
  103. package/dist/utils/transferable.d.ts +18 -18
  104. package/dist/utils/transferable.js +218 -151
  105. package/dist/utils/transferable.js.map +1 -6
  106. package/dist/utils/wait.d.ts +9 -9
  107. package/dist/utils/wait.js +30 -15
  108. package/dist/utils/wait.js.map +1 -6
  109. package/dist/utils/xml.d.ts +13 -13
  110. package/dist/utils/xml.js +84 -46
  111. package/dist/utils/xml.js.map +1 -6
  112. package/dist/utils/zip.d.ts +22 -22
  113. package/dist/utils/zip.js +172 -148
  114. package/dist/utils/zip.js.map +1 -6
  115. package/package.json +5 -7
  116. package/src/common.types.ts +14 -14
  117. package/src/env.ts +9 -1
  118. package/src/errors/argument-error.ts +15 -15
  119. package/src/errors/not-implemented-error.ts +9 -9
  120. package/src/errors/sd-error.ts +12 -12
  121. package/src/errors/timeout-error.ts +12 -12
  122. package/src/extensions/arr-ext.helpers.ts +16 -16
  123. package/src/extensions/arr-ext.ts +35 -35
  124. package/src/extensions/arr-ext.types.ts +57 -57
  125. package/src/extensions/map-ext.ts +16 -16
  126. package/src/extensions/set-ext.ts +11 -11
  127. package/src/features/debounce-queue.ts +23 -23
  128. package/src/features/event-emitter.ts +25 -25
  129. package/src/features/serial-queue.ts +13 -13
  130. package/src/globals.ts +4 -4
  131. package/src/index.ts +5 -5
  132. package/src/types/date-only.ts +84 -83
  133. package/src/types/date-time.ts +43 -42
  134. package/src/types/lazy-gc-map.ts +44 -44
  135. package/src/types/time.ts +29 -29
  136. package/src/types/uuid.ts +15 -15
  137. package/src/utils/bytes.ts +35 -35
  138. package/src/utils/date-format.ts +59 -59
  139. package/src/utils/error.ts +4 -4
  140. package/src/utils/json.ts +41 -41
  141. package/src/utils/num.ts +20 -20
  142. package/src/utils/obj.ts +138 -138
  143. package/src/utils/path.ts +10 -10
  144. package/src/utils/primitive.ts +6 -6
  145. package/src/utils/str.ts +48 -48
  146. package/src/utils/template-strings.ts +29 -29
  147. package/src/utils/transferable.ts +38 -38
  148. package/src/utils/wait.ts +10 -10
  149. package/src/utils/xml.ts +19 -19
  150. package/src/utils/zip.ts +25 -25
  151. package/README.md +0 -160
  152. package/docs/errors.md +0 -119
  153. package/docs/extensions.md +0 -387
  154. package/docs/features.md +0 -143
  155. package/docs/types.md +0 -287
  156. package/docs/utils.md +0 -757
  157. package/tests/errors/errors.spec.ts +0 -80
  158. package/tests/extensions/array-extension.spec.ts +0 -654
  159. package/tests/extensions/map-extension.spec.ts +0 -117
  160. package/tests/extensions/set-extension.spec.ts +0 -67
  161. package/tests/types/date-only.spec.ts +0 -533
  162. package/tests/types/date-time.spec.ts +0 -246
  163. package/tests/types/lazy-gc-map.spec.ts +0 -606
  164. package/tests/types/time.spec.ts +0 -428
  165. package/tests/types/uuid.spec.ts +0 -74
  166. package/tests/utils/bytes-utils.spec.ts +0 -197
  167. package/tests/utils/date-format.spec.ts +0 -350
  168. package/tests/utils/debounce-queue.spec.ts +0 -226
  169. package/tests/utils/json.spec.ts +0 -400
  170. package/tests/utils/number.spec.ts +0 -136
  171. package/tests/utils/object.spec.ts +0 -810
  172. package/tests/utils/path.spec.ts +0 -70
  173. package/tests/utils/primitive.spec.ts +0 -43
  174. package/tests/utils/sd-event-emitter.spec.ts +0 -189
  175. package/tests/utils/serial-queue.spec.ts +0 -305
  176. package/tests/utils/string.spec.ts +0 -265
  177. package/tests/utils/template-strings.spec.ts +0 -48
  178. package/tests/utils/transferable.spec.ts +0 -639
  179. package/tests/utils/wait.spec.ts +0 -123
  180. package/tests/utils/xml.spec.ts +0 -146
  181. package/tests/utils/zip.spec.ts +0 -221
@@ -1,18 +1,18 @@
1
1
  /**
2
- * Map with automatic expiration feature
3
- * Updates access time in LRU manner, auto-deletes if not accessed for specified time
2
+ * 자동 만료 기능이 있는 Map
3
+ * LRU 방식으로 접근 시간을 갱신하고, 지정된 시간 동안 접근하지 않으면 자동 삭제
4
4
  *
5
- * @note Must call dispose() or use 'using' statement after use.
6
- * Otherwise GC timer continues running and causes memory leak.
5
+ * @note 사용 반드시 dispose() 호출하거나 'using' 문을 사용해야 함.
6
+ * 그렇지 않으면 GC 타이머가 계속 실행되어 메모리 누수 발생.
7
7
  *
8
8
  * @example
9
- * // using statement (recommended)
9
+ * // using (권장)
10
10
  * using map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });
11
11
  *
12
- * // Or explicit dispose() call
12
+ * // 또는 명시적 dispose() 호출
13
13
  * const map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });
14
14
  * try {
15
- * // ... usage
15
+ * // ... 사용
16
16
  * } finally {
17
17
  * map.dispose();
18
18
  * }
@@ -25,46 +25,46 @@ export declare class LazyGcMap<TKey, TValue> {
25
25
  private _isGcRunning;
26
26
  private _isDestroyed;
27
27
  /**
28
- * @param _options Configuration options
29
- * @param _options.gcInterval GC interval in milliseconds. Default: 1/10 of expireTime (minimum 1000ms)
30
- * @param _options.expireTime Expiration time in milliseconds. Deleted after this time since last access. Example: 60000 (60 seconds)
31
- * @param _options.onExpire Callback called on expiration. Can be async function, errors are logged and continue execution
28
+ * @param _options 설정 옵션
29
+ * @param _options.gcInterval GC 간격 (밀리초). 기본값: expireTime의 1/10 (최소 1000ms)
30
+ * @param _options.expireTime 만료 시간 (밀리초). 마지막 접근 이후 시간이 지나면 삭제됨. 예: 60000 (60)
31
+ * @param _options.onExpire 만료 호출되는 콜백. 비동기 함수 가능, 에러 발생 로그 출력 계속 실행
32
32
  */
33
33
  constructor(_options: {
34
34
  gcInterval?: number;
35
35
  expireTime: number;
36
36
  onExpire?: (key: TKey, value: TValue) => void | Promise<void>;
37
37
  });
38
- /** Number of stored items */
38
+ /** 저장된 항목 */
39
39
  get size(): number;
40
- /** Check if key exists (does not update access time) */
40
+ /** key 존재 여부 확인 (접근 시간 갱신하지 않음) */
41
41
  has(key: TKey): boolean;
42
- /** Get value (updates access time) */
42
+ /** 조회 (접근 시간 갱신) */
43
43
  get(key: TKey): TValue | undefined;
44
- /** Store value (sets access time and starts GC timer) */
44
+ /** 저장 (접근 시간 설정 GC 타이머 시작) */
45
45
  set(key: TKey, value: TValue): void;
46
- /** Delete item (stops GC timer if empty) */
46
+ /** 항목 삭제 (비어있으면 GC 타이머 중지) */
47
47
  delete(key: TKey): boolean;
48
- /** Clean up instance (stop GC timer and delete data) */
48
+ /** 인스턴스 정리 (GC 타이머 중지 데이터 삭제) */
49
49
  dispose(): void;
50
- /** Support for 'using' statement */
50
+ /** 'using' 지원 */
51
51
  [Symbol.dispose](): void;
52
52
  /**
53
- * Delete all items (instance can still be used)
53
+ * 모든 항목 삭제 (인스턴스는 계속 사용 가능)
54
54
  */
55
55
  clear(): void;
56
56
  /**
57
- * Return value for key, or create and store via factory if not found
58
- * @param key Key to look up
59
- * @param factory Function to create value if key not found
60
- * @returns Existing or newly created value
57
+ * key 대한 값을 반환하거나, 없으면 팩토리로 생성하여 저장 반환
58
+ * @param key 조회할 key
59
+ * @param factory key가 없을 값을 생성하는 함수
60
+ * @returns 기존 또는 새로 생성된 값
61
61
  */
62
62
  getOrCreate(key: TKey, factory: () => TValue): TValue;
63
- /** Iterate over values only (Iterator) */
63
+ /** 값만 순회 (Iterator) */
64
64
  values(): IterableIterator<TValue>;
65
- /** Iterate over keys only (Iterator) */
65
+ /** key만 순회 (Iterator) */
66
66
  keys(): IterableIterator<TKey>;
67
- /** Iterate over entries (Iterator) */
67
+ /** 엔트리 순회 (Iterator) */
68
68
  entries(): IterableIterator<[TKey, TValue]>;
69
69
  private _startGc;
70
70
  private _runGc;
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-gc-map.d.ts","sourceRoot":"","sources":["../../src/types/lazy-gc-map.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,SAAS,CAAC,IAAI,EAAE,MAAM;IAoB/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnB3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAG/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0D;IAG/E,OAAO,CAAC,QAAQ,CAAC,CAAiC;IAElD,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;;OAKG;gBAEgB,QAAQ,EAAE;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/D;IAGH,6BAA6B;IAC7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,wDAAwD;IACxD,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAKvB,sCAAsC;IACtC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IAUlC,yDAAyD;IACzD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOnC,4CAA4C;IAC5C,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAU1B,wDAAwD;IACxD,OAAO,IAAI,IAAI;IAOf,oCAAoC;IACpC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,GAAG,MAAM;IAerD,0CAA0C;IACzC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAOnC,wCAAwC;IACvC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;IAK/B,sCAAsC;IACrC,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAS5C,OAAO,CAAC,QAAQ;YAUF,MAAM;IAmDpB,OAAO,CAAC,OAAO;CAQhB"}
1
+ {"version":3,"file":"lazy-gc-map.d.ts","sourceRoot":"","sources":["../../src/types/lazy-gc-map.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,SAAS,CAAC,IAAI,EAAE,MAAM;IAoB/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnB3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAG/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0D;IAG/E,OAAO,CAAC,QAAQ,CAAC,CAAiC;IAElD,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;;OAKG;gBAEgB,QAAQ,EAAE;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/D;IAGH,eAAe;IACf,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mCAAmC;IACnC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAKvB,sBAAsB;IACtB,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IAUlC,kCAAkC;IAClC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOnC,8BAA8B;IAC9B,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAU1B,mCAAmC;IACnC,OAAO,IAAI,IAAI;IAOf,mBAAmB;IACnB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,GAAG,MAAM;IAerD,uBAAuB;IACtB,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAOnC,yBAAyB;IACxB,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;IAK/B,wBAAwB;IACvB,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAS5C,OAAO,CAAC,QAAQ;YAUF,MAAM;IAmDpB,OAAO,CAAC,OAAO;CAQhB"}
@@ -1,165 +1,208 @@
1
1
  import consola from "consola";
2
- class LazyGcMap {
3
- /**
4
- * @param _options Configuration options
5
- * @param _options.gcInterval GC interval in milliseconds. Default: 1/10 of expireTime (minimum 1000ms)
6
- * @param _options.expireTime Expiration time in milliseconds. Deleted after this time since last access. Example: 60000 (60 seconds)
7
- * @param _options.onExpire Callback called on expiration. Can be async function, errors are logged and continue execution
8
- */
9
- constructor(_options) {
10
- this._options = _options;
11
- }
12
- static _logger = consola.withTag("LazyGcMap");
13
- // Store actual data and last access time together
14
- _map = /* @__PURE__ */ new Map();
15
- // GC timer
16
- _gcTimer;
17
- // Flag to prevent duplicate GC runs
18
- _isGcRunning = false;
19
- // Whether dispose() has been called
20
- _isDestroyed = false;
21
- /** Number of stored items */
22
- get size() {
23
- return this._map.size;
24
- }
25
- /** Check if key exists (does not update access time) */
26
- has(key) {
27
- if (this._isDestroyed) return false;
28
- return this._map.has(key);
29
- }
30
- /** Get value (updates access time) */
31
- get(key) {
32
- if (this._isDestroyed) return void 0;
33
- const item = this._map.get(key);
34
- if (item == null) return void 0;
35
- item.lastAccess = Date.now();
36
- return item.value;
37
- }
38
- /** Store value (sets access time and starts GC timer) */
39
- set(key, value) {
40
- if (this._isDestroyed) return;
41
- this._map.set(key, { value, lastAccess: Date.now() });
42
- this._startGc();
43
- }
44
- /** Delete item (stops GC timer if empty) */
45
- delete(key) {
46
- if (this._isDestroyed) return false;
47
- const result = this._map.delete(key);
48
- if (this._map.size === 0) {
49
- this._stopGc();
50
- }
51
- return result;
52
- }
53
- /** Clean up instance (stop GC timer and delete data) */
54
- dispose() {
55
- if (this._isDestroyed) return;
56
- this._isDestroyed = true;
57
- this._map.clear();
58
- this._stopGc();
59
- }
60
- /** Support for 'using' statement */
61
- [Symbol.dispose]() {
62
- this.dispose();
63
- }
64
- /**
65
- * Delete all items (instance can still be used)
66
- */
67
- clear() {
68
- if (this._isDestroyed) return;
69
- this._map.clear();
70
- this._stopGc();
71
- }
72
- /**
73
- * Return value for key, or create and store via factory if not found
74
- * @param key Key to look up
75
- * @param factory Function to create value if key not found
76
- * @returns Existing or newly created value
77
- */
78
- getOrCreate(key, factory) {
79
- if (this._isDestroyed) {
80
- throw new Error("LazyGcMap has already been disposed.");
81
- }
82
- const item = this._map.get(key);
83
- if (item == null) {
84
- const value = factory();
85
- this.set(key, value);
86
- return value;
87
- }
88
- item.lastAccess = Date.now();
89
- return item.value;
90
- }
91
- /** Iterate over values only (Iterator) */
92
- *values() {
93
- if (this._isDestroyed) return;
94
- for (const item of this._map.values()) {
95
- yield item.value;
96
- }
97
- }
98
- /** Iterate over keys only (Iterator) */
99
- *keys() {
100
- if (this._isDestroyed) return;
101
- yield* this._map.keys();
102
- }
103
- /** Iterate over entries (Iterator) */
104
- *entries() {
105
- if (this._isDestroyed) return;
106
- for (const [key, item] of this._map.entries()) {
107
- yield [key, item.value];
108
- }
109
- }
110
- //#region GC logic
111
- _startGc() {
112
- if (this._isDestroyed) return;
113
- if (this._gcTimer != null) return;
114
- const interval = this._options.gcInterval ?? Math.max(this._options.expireTime / 10, 1e3);
115
- this._gcTimer = setInterval(() => {
116
- void this._runGc();
117
- }, interval);
118
- }
119
- async _runGc() {
120
- if (this._isGcRunning) return;
121
- this._isGcRunning = true;
122
- try {
123
- const now = Date.now();
124
- const expiredEntries = [];
125
- for (const [key, item] of this._map) {
126
- if (now - item.lastAccess > this._options.expireTime) {
127
- expiredEntries.push({ key, item });
2
+ /**
3
+ * 자동 만료 기능이 있는 Map
4
+ * LRU 방식으로 접근 시간을 갱신하고, 지정된 시간 동안 접근하지 않으면 자동 삭제
5
+ *
6
+ * @note 사용 반드시 dispose()를 호출하거나 'using' 문을 사용해야 함.
7
+ * 그렇지 않으면 GC 타이머가 계속 실행되어 메모리 누수 발생.
8
+ *
9
+ * @example
10
+ * // using 문 (권장)
11
+ * using map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });
12
+ *
13
+ * // 또는 명시적 dispose() 호출
14
+ * const map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });
15
+ * try {
16
+ * // ... 사용
17
+ * } finally {
18
+ * map.dispose();
19
+ * }
20
+ */
21
+ export class LazyGcMap {
22
+ _options;
23
+ static _logger = consola.withTag("LazyGcMap");
24
+ // 실제 데이터와 마지막 접근 시간을 함께 저장
25
+ _map = new Map();
26
+ // GC 타이머
27
+ _gcTimer;
28
+ // 중복 GC 실행 방지 플래그
29
+ _isGcRunning = false;
30
+ // dispose()가 호출되었는지 여부
31
+ _isDestroyed = false;
32
+ /**
33
+ * @param _options 설정 옵션
34
+ * @param _options.gcInterval GC 간격 (밀리초). 기본값: expireTime의 1/10 (최소 1000ms)
35
+ * @param _options.expireTime 만료 시간 (밀리초). 마지막 접근 이후 이 시간이 지나면 삭제됨. 예: 60000 (60초)
36
+ * @param _options.onExpire 만료 시 호출되는 콜백. 비동기 함수 가능, 에러 발생 시 로그 출력 후 계속 실행
37
+ */
38
+ constructor(_options) {
39
+ this._options = _options;
40
+ }
41
+ /** 저장된 항목 */
42
+ get size() {
43
+ return this._map.size;
44
+ }
45
+ /** key 존재 여부 확인 (접근 시간 갱신하지 않음) */
46
+ has(key) {
47
+ if (this._isDestroyed)
48
+ return false;
49
+ return this._map.has(key);
50
+ }
51
+ /** 값 조회 (접근 시간 갱신) */
52
+ get(key) {
53
+ if (this._isDestroyed)
54
+ return undefined;
55
+ const item = this._map.get(key);
56
+ if (item == null)
57
+ return undefined;
58
+ // 조회 시 접근 시간 갱신 (LRU)
59
+ item.lastAccess = Date.now();
60
+ return item.value;
61
+ }
62
+ /** 값 저장 (접근 시간 설정 및 GC 타이머 시작) */
63
+ set(key, value) {
64
+ if (this._isDestroyed)
65
+ return;
66
+ this._map.set(key, { value, lastAccess: Date.now() });
67
+ // 데이터 추가 시 GC 타이머 시작
68
+ this._startGc();
69
+ }
70
+ /** 항목 삭제 (비어있으면 GC 타이머 중지) */
71
+ delete(key) {
72
+ if (this._isDestroyed)
73
+ return false;
74
+ const result = this._map.delete(key);
75
+ // 비어있으면 타이머 중지
76
+ if (this._map.size === 0) {
77
+ this._stopGc();
128
78
  }
129
- }
130
- for (const { key, item } of expiredEntries) {
131
- const currentItem = this._map.get(key);
132
- if (currentItem !== item) {
133
- continue;
79
+ return result;
80
+ }
81
+ /** 인스턴스 정리 (GC 타이머 중지 및 데이터 삭제) */
82
+ dispose() {
83
+ if (this._isDestroyed)
84
+ return;
85
+ this._isDestroyed = true;
86
+ this._map.clear();
87
+ this._stopGc();
88
+ }
89
+ /** 'using' 문 지원 */
90
+ [Symbol.dispose]() {
91
+ this.dispose();
92
+ }
93
+ /**
94
+ * 모든 항목 삭제 (인스턴스는 계속 사용 가능)
95
+ */
96
+ clear() {
97
+ if (this._isDestroyed)
98
+ return;
99
+ this._map.clear();
100
+ this._stopGc();
101
+ }
102
+ /**
103
+ * key에 대한 값을 반환하거나, 없으면 팩토리로 생성하여 저장 후 반환
104
+ * @param key 조회할 key
105
+ * @param factory key가 없을 때 값을 생성하는 함수
106
+ * @returns 기존 값 또는 새로 생성된 값
107
+ */
108
+ getOrCreate(key, factory) {
109
+ if (this._isDestroyed) {
110
+ throw new Error("LazyGcMap이 이미 dispose되었습니다.");
134
111
  }
135
- if (this._options.onExpire != null) {
136
- try {
137
- await this._options.onExpire(key, item.value);
138
- } catch (err) {
139
- LazyGcMap._logger.error("onExpire callback error", err);
140
- }
112
+ const item = this._map.get(key);
113
+ if (item == null) {
114
+ const value = factory();
115
+ this.set(key, value);
116
+ return value;
141
117
  }
142
- const afterItem = this._map.get(key);
143
- if (afterItem === item) {
144
- this._map.delete(key);
118
+ item.lastAccess = Date.now();
119
+ return item.value;
120
+ }
121
+ /** 값만 순회 (Iterator) */
122
+ *values() {
123
+ if (this._isDestroyed)
124
+ return;
125
+ for (const item of this._map.values()) {
126
+ yield item.value;
145
127
  }
146
- }
147
- if (this._map.size === 0) {
148
- this._stopGc();
149
- }
150
- } finally {
151
- this._isGcRunning = false;
152
- }
153
- }
154
- _stopGc() {
155
- if (this._gcTimer != null) {
156
- clearInterval(this._gcTimer);
157
- this._gcTimer = void 0;
158
- }
159
- }
160
- //#endregion
128
+ }
129
+ /** key만 순회 (Iterator) */
130
+ *keys() {
131
+ if (this._isDestroyed)
132
+ return;
133
+ yield* this._map.keys();
134
+ }
135
+ /** 엔트리 순회 (Iterator) */
136
+ *entries() {
137
+ if (this._isDestroyed)
138
+ return;
139
+ for (const [key, item] of this._map.entries()) {
140
+ yield [key, item.value];
141
+ }
142
+ }
143
+ //#region GC logic
144
+ _startGc() {
145
+ if (this._isDestroyed)
146
+ return;
147
+ if (this._gcTimer != null)
148
+ return;
149
+ const interval = this._options.gcInterval ?? Math.max(this._options.expireTime / 10, 1000);
150
+ this._gcTimer = setInterval(() => {
151
+ void this._runGc();
152
+ }, interval);
153
+ }
154
+ async _runGc() {
155
+ // 이미 실행 중이면 건너뜀 (onExpire 콜백이 오래 걸릴 때 중복 실행 방지)
156
+ if (this._isGcRunning)
157
+ return;
158
+ this._isGcRunning = true;
159
+ try {
160
+ const now = Date.now();
161
+ // 1. 만료된 항목 수집 (삭제 전)
162
+ const expiredEntries = [];
163
+ for (const [key, item] of this._map) {
164
+ if (now - item.lastAccess > this._options.expireTime) {
165
+ expiredEntries.push({ key, item });
166
+ }
167
+ }
168
+ // 2. 각 항목에 대해 콜백 실행 후 삭제
169
+ for (const { key, item } of expiredEntries) {
170
+ // 콜백 전 현재 상태 확인 (이미 교체되었거나 삭제된 경우 건너뜀)
171
+ const currentItem = this._map.get(key);
172
+ if (currentItem !== item) {
173
+ continue;
174
+ }
175
+ // 만료 콜백 실행
176
+ if (this._options.onExpire != null) {
177
+ try {
178
+ await this._options.onExpire(key, item.value);
179
+ }
180
+ catch (err) {
181
+ LazyGcMap._logger.error("onExpire 콜백 오류", err);
182
+ }
183
+ }
184
+ // 콜백 후 항목이 다시 등록되었는지 확인
185
+ // 시나리오: onExpire 콜백이 같은 key로 set()을 호출하면,
186
+ // 새로 등록된 항목을 삭제하면 안 됨. 항목 참조가 같으면 재등록되지 않은 것이므로 삭제.
187
+ const afterItem = this._map.get(key);
188
+ if (afterItem === item) {
189
+ this._map.delete(key);
190
+ }
191
+ }
192
+ // 정리 후 비어있으면 GC 중지
193
+ if (this._map.size === 0) {
194
+ this._stopGc();
195
+ }
196
+ }
197
+ finally {
198
+ this._isGcRunning = false;
199
+ }
200
+ }
201
+ _stopGc() {
202
+ if (this._gcTimer != null) {
203
+ clearInterval(this._gcTimer);
204
+ this._gcTimer = undefined;
205
+ }
206
+ }
161
207
  }
162
- export {
163
- LazyGcMap
164
- };
165
- //# sourceMappingURL=lazy-gc-map.js.map
208
+ //# sourceMappingURL=lazy-gc-map.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/types/lazy-gc-map.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"lazy-gc-map.js","sourceRoot":"","sources":["../../src/types/lazy-gc-map.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,SAAS;IAoBD;IAnBX,MAAM,CAAU,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE/D,2BAA2B;IACV,IAAI,GAAG,IAAI,GAAG,EAA+C,CAAC;IAE/E,SAAS;IACD,QAAQ,CAAkC;IAClD,kBAAkB;IACV,YAAY,GAAG,KAAK,CAAC;IAC7B,uBAAuB;IACf,YAAY,GAAG,KAAK,CAAC;IAE7B;;;;;OAKG;IACH,YACmB,QAIhB;QAJgB,aAAQ,GAAR,QAAQ,CAIxB;IACA,CAAC;IAEJ,eAAe;IACf,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,mCAAmC;IACnC,GAAG,CAAC,GAAS;QACX,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,sBAAsB;IACtB,GAAG,CAAC,GAAS;QACX,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAEnC,sBAAsB;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,kCAAkC;IAClC,GAAG,CAAC,GAAS,EAAE,KAAa;QAC1B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,qBAAqB;QACrB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,MAAM,CAAC,GAAS;QACd,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,eAAe;QACf,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,mCAAmC;IACnC,OAAO;QACL,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,mBAAmB;IACnB,CAAC,MAAM,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,GAAS,EAAE,OAAqB;QAC1C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,uBAAuB;IACvB,CAAC,MAAM;QACL,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,CAAC,IAAI;QACH,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,wBAAwB;IACxB,CAAC,OAAO;QACN,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,kBAAkB;IAEV,QAAQ;QACd,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;YAAE,OAAO;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3F,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,gDAAgD;QAChD,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,sBAAsB;YACtB,MAAM,cAAc,GAAiE,EAAE,CAAC;YACxF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACrD,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,yBAAyB;YACzB,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,cAAc,EAAE,CAAC;gBAC3C,uCAAuC;gBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;oBACzB,SAAS;gBACX,CAAC;gBAED,WAAW;gBACX,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;oBACnC,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAChD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;gBAED,wBAAwB;gBACxB,0CAA0C;gBAC1C,oDAAoD;gBACpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACrC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Time class (without date: HH:mm:ss.fff, immutable)
2
+ * 시간 클래스 (날짜 제외: HH:mm:ss.fff, 불변)
3
3
  *
4
- * An immutable class that stores only time without date information.
5
- * Values exceeding 24 hours or negative values are automatically normalized.
4
+ * 날짜 정보 없이 시간만 저장하는 불변 클래스.
5
+ * 24시간을 초과하거나 음수인 값은 자동으로 정규화됨.
6
6
  *
7
7
  * @example
8
8
  * const now = new Time();
@@ -12,20 +12,20 @@
12
12
  export declare class Time {
13
13
  private static readonly MS_PER_DAY;
14
14
  private readonly _tick;
15
- /** Create with current time */
15
+ /** 현재 시간으로 생성 */
16
16
  constructor();
17
- /** Create with hour, minute, second, millisecond */
17
+ /** 시, 분, 초, 밀리초로 생성 */
18
18
  constructor(hour: number, minute: number, second?: number, millisecond?: number);
19
- /** Create from tick (millisecond) */
19
+ /** tick (밀리초)으로 생성 */
20
20
  constructor(tick: number);
21
- /** Create by extracting time part only from Date object */
21
+ /** Date 객체에서 시간 부분만 추출하여 생성 */
22
22
  constructor(date: Date);
23
23
  /**
24
- * Parse a string to create Time instance
24
+ * 문자열을 파싱하여 Time 인스턴스 생성
25
25
  *
26
- * @param str Time string
27
- * @returns Parsed Time instance
28
- * @throws ArgumentError If unsupported format
26
+ * @param str 시간 문자열
27
+ * @returns 파싱된 Time 인스턴스
28
+ * @throws ArgumentError 지원하지 않는 형식인 경우
29
29
  *
30
30
  * @example
31
31
  * Time.parse("10:30:00") // HH:mm:ss
@@ -39,28 +39,28 @@ export declare class Time {
39
39
  get second(): number;
40
40
  get millisecond(): number;
41
41
  get tick(): number;
42
- /** Whether time is set correctly */
42
+ /** 시간이 올바르게 설정되었는지 여부 */
43
43
  get isValid(): boolean;
44
- /** Return new instance with specified hour */
44
+ /** 지정된 시로 인스턴스 반환 */
45
45
  setHour(hour: number): Time;
46
- /** Return new instance with specified minute */
46
+ /** 지정된 분으로 인스턴스 반환 */
47
47
  setMinute(minute: number): Time;
48
- /** Return new instance with specified second */
48
+ /** 지정된 초로 인스턴스 반환 */
49
49
  setSecond(second: number): Time;
50
- /** Return new instance with specified millisecond */
50
+ /** 지정된 밀리초로 인스턴스 반환 */
51
51
  setMillisecond(millisecond: number): Time;
52
- /** Return new instance with specified hours added (24-hour wraparound) */
52
+ /** 지정된 시간을 더한 인스턴스 반환 (24시간 순환) */
53
53
  addHours(hours: number): Time;
54
- /** Return new instance with specified minutes added (24-hour wraparound) */
54
+ /** 지정된 분을 더한 인스턴스 반환 (24시간 순환) */
55
55
  addMinutes(minutes: number): Time;
56
- /** Return new instance with specified seconds added (24-hour wraparound) */
56
+ /** 지정된 초를 더한 인스턴스 반환 (24시간 순환) */
57
57
  addSeconds(seconds: number): Time;
58
- /** Return new instance with specified milliseconds added (24-hour wraparound) */
58
+ /** 지정된 밀리초를 더한 인스턴스 반환 (24시간 순환) */
59
59
  addMilliseconds(milliseconds: number): Time;
60
60
  /**
61
- * Convert to string with specified format
62
- * @param format Format string
63
- * @see dtFormat for supported format strings
61
+ * 지정된 형식으로 문자열 변환
62
+ * @param format 형식 문자열
63
+ * @see dtFormat 지원되는 형식 문자열 참조
64
64
  */
65
65
  toFormatString(formatStr: string): string;
66
66
  toString(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/types/time.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAEzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,+BAA+B;;IAE/B,oDAAoD;gBACxC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAC/E,qCAAqC;gBACzB,IAAI,EAAE,MAAM;IACxB,2DAA2D;gBAC/C,IAAI,EAAE,IAAI;IA8BtB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IA+C/B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,oCAAoC;IACpC,IAAI,OAAO,IAAI,OAAO,CAErB;IAMD,8CAA8C;IAC9C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,gDAAgD;IAChD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,gDAAgD;IAChD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,qDAAqD;IACrD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQzC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,4EAA4E;IAC5E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjC,4EAA4E;IAC5E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjC,iFAAiF;IACjF,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAU3C;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IASzC,QAAQ,IAAI,MAAM;CAKnB"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/types/time.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAEzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,iBAAiB;;IAEjB,uBAAuB;gBACX,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAC/E,sBAAsB;gBACV,IAAI,EAAE,MAAM;IACxB,+BAA+B;gBACnB,IAAI,EAAE,IAAI;IA8BtB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IA+C/B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,yBAAyB;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IAMD,uBAAuB;IACvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,wBAAwB;IACxB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,uBAAuB;IACvB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,yBAAyB;IACzB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQzC,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,oCAAoC;IACpC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjC,oCAAoC;IACpC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjC,sCAAsC;IACtC,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAU3C;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IASzC,QAAQ,IAAI,MAAM;CAKnB"}