@simplysm/core-common 13.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/.cache/typecheck-browser.tsbuildinfo +1 -0
  2. package/.cache/typecheck-node.tsbuildinfo +1 -0
  3. package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
  4. package/.cache/typecheck-tests-node.tsbuildinfo +1 -0
  5. package/README.md +887 -0
  6. package/dist/common.types.d.ts +74 -0
  7. package/dist/common.types.d.ts.map +1 -0
  8. package/dist/common.types.js +5 -0
  9. package/dist/common.types.js.map +7 -0
  10. package/dist/env.d.ts +6 -0
  11. package/dist/env.d.ts.map +1 -0
  12. package/dist/env.js +9 -0
  13. package/dist/env.js.map +7 -0
  14. package/dist/errors/argument-error.d.ts +25 -0
  15. package/dist/errors/argument-error.d.ts.map +1 -0
  16. package/dist/errors/argument-error.js +18 -0
  17. package/dist/errors/argument-error.js.map +7 -0
  18. package/dist/errors/not-implemented-error.d.ts +29 -0
  19. package/dist/errors/not-implemented-error.d.ts.map +1 -0
  20. package/dist/errors/not-implemented-error.js +14 -0
  21. package/dist/errors/not-implemented-error.js.map +7 -0
  22. package/dist/errors/sd-error.d.ts +27 -0
  23. package/dist/errors/sd-error.d.ts.map +1 -0
  24. package/dist/errors/sd-error.js +23 -0
  25. package/dist/errors/sd-error.js.map +7 -0
  26. package/dist/errors/timeout-error.d.ts +31 -0
  27. package/dist/errors/timeout-error.d.ts.map +1 -0
  28. package/dist/errors/timeout-error.js +17 -0
  29. package/dist/errors/timeout-error.js.map +7 -0
  30. package/dist/extensions/arr-ext.d.ts +15 -0
  31. package/dist/extensions/arr-ext.d.ts.map +1 -0
  32. package/dist/extensions/arr-ext.helpers.d.ts +19 -0
  33. package/dist/extensions/arr-ext.helpers.d.ts.map +1 -0
  34. package/dist/extensions/arr-ext.helpers.js +35 -0
  35. package/dist/extensions/arr-ext.helpers.js.map +7 -0
  36. package/dist/extensions/arr-ext.js +546 -0
  37. package/dist/extensions/arr-ext.js.map +7 -0
  38. package/dist/extensions/arr-ext.types.d.ts +215 -0
  39. package/dist/extensions/arr-ext.types.d.ts.map +1 -0
  40. package/dist/extensions/arr-ext.types.js +1 -0
  41. package/dist/extensions/arr-ext.types.js.map +7 -0
  42. package/dist/extensions/map-ext.d.ts +57 -0
  43. package/dist/extensions/map-ext.d.ts.map +1 -0
  44. package/dist/extensions/map-ext.js +26 -0
  45. package/dist/extensions/map-ext.js.map +7 -0
  46. package/dist/extensions/set-ext.d.ts +36 -0
  47. package/dist/extensions/set-ext.d.ts.map +1 -0
  48. package/dist/extensions/set-ext.js +29 -0
  49. package/dist/extensions/set-ext.js.map +7 -0
  50. package/dist/features/debounce-queue.d.ts +53 -0
  51. package/dist/features/debounce-queue.d.ts.map +1 -0
  52. package/dist/features/debounce-queue.js +80 -0
  53. package/dist/features/debounce-queue.js.map +7 -0
  54. package/dist/features/event-emitter.d.ts +66 -0
  55. package/dist/features/event-emitter.d.ts.map +1 -0
  56. package/dist/features/event-emitter.js +82 -0
  57. package/dist/features/event-emitter.js.map +7 -0
  58. package/dist/features/serial-queue.d.ts +47 -0
  59. package/dist/features/serial-queue.d.ts.map +1 -0
  60. package/dist/features/serial-queue.js +66 -0
  61. package/dist/features/serial-queue.js.map +7 -0
  62. package/dist/globals.d.ts +12 -0
  63. package/dist/globals.d.ts.map +1 -0
  64. package/dist/globals.js +1 -0
  65. package/dist/globals.js.map +7 -0
  66. package/dist/index.d.ts +32 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +31 -0
  69. package/dist/index.js.map +7 -0
  70. package/dist/types/date-only.d.ts +152 -0
  71. package/dist/types/date-only.d.ts.map +1 -0
  72. package/dist/types/date-only.js +251 -0
  73. package/dist/types/date-only.js.map +7 -0
  74. package/dist/types/date-time.d.ts +96 -0
  75. package/dist/types/date-time.d.ts.map +1 -0
  76. package/dist/types/date-time.js +220 -0
  77. package/dist/types/date-time.js.map +7 -0
  78. package/dist/types/lazy-gc-map.d.ts +80 -0
  79. package/dist/types/lazy-gc-map.d.ts.map +1 -0
  80. package/dist/types/lazy-gc-map.js +179 -0
  81. package/dist/types/lazy-gc-map.js.map +7 -0
  82. package/dist/types/time.d.ts +68 -0
  83. package/dist/types/time.d.ts.map +1 -0
  84. package/dist/types/time.js +151 -0
  85. package/dist/types/time.js.map +7 -0
  86. package/dist/types/uuid.d.ts +35 -0
  87. package/dist/types/uuid.d.ts.map +1 -0
  88. package/dist/types/uuid.js +71 -0
  89. package/dist/types/uuid.js.map +7 -0
  90. package/dist/utils/bytes.d.ts +51 -0
  91. package/dist/utils/bytes.d.ts.map +1 -0
  92. package/dist/utils/bytes.js +89 -0
  93. package/dist/utils/bytes.js.map +7 -0
  94. package/dist/utils/date-format.d.ts +90 -0
  95. package/dist/utils/date-format.d.ts.map +1 -0
  96. package/dist/utils/date-format.js +106 -0
  97. package/dist/utils/date-format.js.map +7 -0
  98. package/dist/utils/json.d.ts +34 -0
  99. package/dist/utils/json.d.ts.map +1 -0
  100. package/dist/utils/json.js +152 -0
  101. package/dist/utils/json.js.map +7 -0
  102. package/dist/utils/num.d.ts +60 -0
  103. package/dist/utils/num.d.ts.map +1 -0
  104. package/dist/utils/num.js +39 -0
  105. package/dist/utils/num.js.map +7 -0
  106. package/dist/utils/obj.d.ts +258 -0
  107. package/dist/utils/obj.d.ts.map +1 -0
  108. package/dist/utils/obj.js +538 -0
  109. package/dist/utils/obj.js.map +7 -0
  110. package/dist/utils/path.d.ts +23 -0
  111. package/dist/utils/path.d.ts.map +1 -0
  112. package/dist/utils/path.js +21 -0
  113. package/dist/utils/path.js.map +7 -0
  114. package/dist/utils/primitive.d.ts +18 -0
  115. package/dist/utils/primitive.d.ts.map +1 -0
  116. package/dist/utils/primitive.js +20 -0
  117. package/dist/utils/primitive.js.map +7 -0
  118. package/dist/utils/str.d.ts +103 -0
  119. package/dist/utils/str.d.ts.map +1 -0
  120. package/dist/utils/str.js +128 -0
  121. package/dist/utils/str.js.map +7 -0
  122. package/dist/utils/template-strings.d.ts +84 -0
  123. package/dist/utils/template-strings.d.ts.map +1 -0
  124. package/dist/utils/template-strings.js +49 -0
  125. package/dist/utils/template-strings.js.map +7 -0
  126. package/dist/utils/transferable.d.ts +47 -0
  127. package/dist/utils/transferable.d.ts.map +1 -0
  128. package/dist/utils/transferable.js +153 -0
  129. package/dist/utils/transferable.js.map +7 -0
  130. package/dist/utils/wait.d.ts +19 -0
  131. package/dist/utils/wait.d.ts.map +1 -0
  132. package/dist/utils/wait.js +19 -0
  133. package/dist/utils/wait.js.map +7 -0
  134. package/dist/utils/xml.d.ts +36 -0
  135. package/dist/utils/xml.d.ts.map +1 -0
  136. package/dist/utils/xml.js +51 -0
  137. package/dist/utils/xml.js.map +7 -0
  138. package/dist/zip/sd-zip.d.ts +80 -0
  139. package/dist/zip/sd-zip.d.ts.map +1 -0
  140. package/dist/zip/sd-zip.js +153 -0
  141. package/dist/zip/sd-zip.js.map +7 -0
  142. package/package.json +31 -0
  143. package/src/common.types.ts +91 -0
  144. package/src/env.ts +11 -0
  145. package/src/errors/argument-error.ts +40 -0
  146. package/src/errors/not-implemented-error.ts +32 -0
  147. package/src/errors/sd-error.ts +53 -0
  148. package/src/errors/timeout-error.ts +36 -0
  149. package/src/extensions/arr-ext.helpers.ts +53 -0
  150. package/src/extensions/arr-ext.ts +777 -0
  151. package/src/extensions/arr-ext.types.ts +258 -0
  152. package/src/extensions/map-ext.ts +86 -0
  153. package/src/extensions/set-ext.ts +68 -0
  154. package/src/features/debounce-queue.ts +116 -0
  155. package/src/features/event-emitter.ts +112 -0
  156. package/src/features/serial-queue.ts +94 -0
  157. package/src/globals.ts +12 -0
  158. package/src/index.ts +55 -0
  159. package/src/types/date-only.ts +329 -0
  160. package/src/types/date-time.ts +294 -0
  161. package/src/types/lazy-gc-map.ts +244 -0
  162. package/src/types/time.ts +210 -0
  163. package/src/types/uuid.ts +113 -0
  164. package/src/utils/bytes.ts +160 -0
  165. package/src/utils/date-format.ts +239 -0
  166. package/src/utils/json.ts +230 -0
  167. package/src/utils/num.ts +97 -0
  168. package/src/utils/obj.ts +956 -0
  169. package/src/utils/path.ts +40 -0
  170. package/src/utils/primitive.ts +33 -0
  171. package/src/utils/str.ts +252 -0
  172. package/src/utils/template-strings.ts +132 -0
  173. package/src/utils/transferable.ts +269 -0
  174. package/src/utils/wait.ts +40 -0
  175. package/src/utils/xml.ts +105 -0
  176. package/src/zip/sd-zip.ts +218 -0
  177. package/tests/errors/errors.spec.ts +196 -0
  178. package/tests/extensions/array-extension.spec.ts +790 -0
  179. package/tests/extensions/map-extension.spec.ts +147 -0
  180. package/tests/extensions/set-extension.spec.ts +74 -0
  181. package/tests/types/date-only.spec.ts +636 -0
  182. package/tests/types/date-time.spec.ts +391 -0
  183. package/tests/types/lazy-gc-map.spec.ts +692 -0
  184. package/tests/types/time.spec.ts +559 -0
  185. package/tests/types/types.spec.ts +55 -0
  186. package/tests/types/uuid.spec.ts +91 -0
  187. package/tests/utils/bytes-utils.spec.ts +230 -0
  188. package/tests/utils/date-format.spec.ts +371 -0
  189. package/tests/utils/debounce-queue.spec.ts +272 -0
  190. package/tests/utils/json.spec.ts +475 -0
  191. package/tests/utils/number.spec.ts +184 -0
  192. package/tests/utils/object.spec.ts +827 -0
  193. package/tests/utils/path.spec.ts +78 -0
  194. package/tests/utils/primitive.spec.ts +55 -0
  195. package/tests/utils/sd-event-emitter.spec.ts +216 -0
  196. package/tests/utils/serial-queue.spec.ts +365 -0
  197. package/tests/utils/string.spec.ts +294 -0
  198. package/tests/utils/template-strings.spec.ts +96 -0
  199. package/tests/utils/transferable.spec.ts +698 -0
  200. package/tests/utils/wait.spec.ts +145 -0
  201. package/tests/utils/xml.spec.ts +146 -0
  202. package/tests/zip/sd-zip.spec.ts +234 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/features/event-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAG7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwD;IAErF;;;;;;OAMG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAgB7E;;;;;OAKG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAgB9E;;;;;OAKG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAI/F;;;;;OAKG;IACH,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM;IAI1D;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGzB"}
@@ -0,0 +1,82 @@
1
+ class EventEmitter {
2
+ _target = new EventTarget();
3
+ // 이벤트 타입별로 리스너 맵 관리 (같은 리스너를 다른 이벤트에 등록 가능)
4
+ // 다형적 리스너 관리를 위해 Function 타입 사용
5
+ _listenerMap = /* @__PURE__ */ new Map();
6
+ /**
7
+ * 이벤트 리스너 등록
8
+ *
9
+ * @param type 이벤트 타입
10
+ * @param listener 이벤트 핸들러
11
+ * @note 같은 리스너를 같은 이벤트에 중복 등록하면 무시됨
12
+ */
13
+ on(type, listener) {
14
+ let typeMap = this._listenerMap.get(type);
15
+ if (!typeMap) {
16
+ typeMap = /* @__PURE__ */ new Map();
17
+ this._listenerMap.set(type, typeMap);
18
+ }
19
+ if (typeMap.has(listener)) return;
20
+ const wrappedListener = (e) => listener(e.detail);
21
+ typeMap.set(listener, wrappedListener);
22
+ this._target.addEventListener(type, wrappedListener);
23
+ }
24
+ /**
25
+ * 이벤트 리스너 제거
26
+ *
27
+ * @param type 이벤트 타입
28
+ * @param listener 제거할 이벤트 핸들러
29
+ */
30
+ off(type, listener) {
31
+ const typeMap = this._listenerMap.get(type);
32
+ if (!typeMap) return;
33
+ const wrappedListener = typeMap.get(listener);
34
+ if (wrappedListener) {
35
+ this._target.removeEventListener(type, wrappedListener);
36
+ typeMap.delete(listener);
37
+ if (typeMap.size === 0) {
38
+ this._listenerMap.delete(type);
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * 이벤트 발생
44
+ *
45
+ * @param type 이벤트 타입
46
+ * @param args 이벤트 데이터 (void 타입이면 생략)
47
+ */
48
+ emit(type, ...args) {
49
+ this._target.dispatchEvent(new CustomEvent(type, { detail: args[0] }));
50
+ }
51
+ /**
52
+ * 특정 이벤트의 리스너 수 반환
53
+ *
54
+ * @param type 이벤트 타입
55
+ * @returns 등록된 리스너 수
56
+ */
57
+ listenerCount(type) {
58
+ var _a;
59
+ return ((_a = this._listenerMap.get(type)) == null ? void 0 : _a.size) ?? 0;
60
+ }
61
+ /**
62
+ * 모든 이벤트 리스너를 제거한다.
63
+ */
64
+ dispose() {
65
+ for (const [type, typeMap] of this._listenerMap) {
66
+ for (const wrappedListener of typeMap.values()) {
67
+ this._target.removeEventListener(type, wrappedListener);
68
+ }
69
+ }
70
+ this._listenerMap.clear();
71
+ }
72
+ /**
73
+ * using 문 지원
74
+ */
75
+ [Symbol.dispose]() {
76
+ this.dispose();
77
+ }
78
+ }
79
+ export {
80
+ EventEmitter
81
+ };
82
+ //# sourceMappingURL=event-emitter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/features/event-emitter.ts"],
4
+ "sourcesContent": ["/**\n * EventTarget \uB798\uD37C - EventEmitter\uC640 \uC720\uC0AC\uD55C API \uC81C\uACF5\n *\n * \uBE0C\uB77C\uC6B0\uC800\uC640 Node.js \uBAA8\uB450\uC5D0\uC11C \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uD0C0\uC785 \uC548\uC804\uD55C \uC774\uBCA4\uD2B8 \uC5D0\uBBF8\uD130\uC774\uB2E4.\n * \uB0B4\uBD80\uC801\uC73C\uB85C EventTarget\uC744 \uC0AC\uC6A9\uD558\uC5EC \uAD6C\uD604\uB418\uC5B4 \uC788\uB2E4.\n *\n * @typeParam T \uC774\uBCA4\uD2B8 \uD0C0\uC785 \uB9F5. \uD0A4\uB294 \uC774\uBCA4\uD2B8 \uC774\uB984, \uAC12\uC740 \uC774\uBCA4\uD2B8 \uB370\uC774\uD130 \uD0C0\uC785\n *\n * @example\n * interface MyEvents {\n * data: string;\n * error: Error;\n * done: void;\n * }\n *\n * class MyEmitter extends EventEmitter<MyEvents> {}\n *\n * const emitter = new MyEmitter();\n * emitter.on(\"data\", (data) => console.log(data)); // data: string\n * emitter.emit(\"data\", \"hello\");\n * emitter.emit(\"done\"); // void \uD0C0\uC785\uC740 \uC778\uC790 \uC5C6\uC774 \uD638\uCD9C\n */\nexport class EventEmitter<T extends { [K in keyof T]: unknown } = Record<string, unknown>> {\n private readonly _target = new EventTarget();\n // \uC774\uBCA4\uD2B8 \uD0C0\uC785\uBCC4\uB85C \uB9AC\uC2A4\uB108 \uB9F5 \uAD00\uB9AC (\uAC19\uC740 \uB9AC\uC2A4\uB108\uB97C \uB2E4\uB978 \uC774\uBCA4\uD2B8\uC5D0 \uB4F1\uB85D \uAC00\uB2A5)\n // \uB2E4\uD615\uC801 \uB9AC\uC2A4\uB108 \uAD00\uB9AC\uB97C \uC704\uD574 Function \uD0C0\uC785 \uC0AC\uC6A9\n private readonly _listenerMap = new Map<string, Map<Function, (e: Event) => void>>();\n\n /**\n * \uC774\uBCA4\uD2B8 \uB9AC\uC2A4\uB108 \uB4F1\uB85D\n *\n * @param type \uC774\uBCA4\uD2B8 \uD0C0\uC785\n * @param listener \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC\n * @note \uAC19\uC740 \uB9AC\uC2A4\uB108\uB97C \uAC19\uC740 \uC774\uBCA4\uD2B8\uC5D0 \uC911\uBCF5 \uB4F1\uB85D\uD558\uBA74 \uBB34\uC2DC\uB428\n */\n on<K extends keyof T & string>(type: K, listener: (data: T[K]) => void): void {\n // \uC774\uBCA4\uD2B8 \uD0C0\uC785\uBCC4 \uB9F5 \uAC00\uC838\uC624\uAC70\uB098 \uC0DD\uC131\n let typeMap = this._listenerMap.get(type);\n if (!typeMap) {\n typeMap = new Map();\n this._listenerMap.set(type, typeMap);\n }\n\n // \uC774\uBBF8 \uD574\uB2F9 \uC774\uBCA4\uD2B8\uC5D0 \uB4F1\uB85D\uB41C \uB9AC\uC2A4\uB108\uBA74 \uBB34\uC2DC (\uC911\uBCF5 \uB4F1\uB85D \uBC29\uC9C0)\n if (typeMap.has(listener)) return;\n\n const wrappedListener = (e: Event) => listener((e as CustomEvent).detail);\n typeMap.set(listener, wrappedListener);\n this._target.addEventListener(type, wrappedListener);\n }\n\n /**\n * \uC774\uBCA4\uD2B8 \uB9AC\uC2A4\uB108 \uC81C\uAC70\n *\n * @param type \uC774\uBCA4\uD2B8 \uD0C0\uC785\n * @param listener \uC81C\uAC70\uD560 \uC774\uBCA4\uD2B8 \uD578\uB4E4\uB7EC\n */\n off<K extends keyof T & string>(type: K, listener: (data: T[K]) => void): void {\n const typeMap = this._listenerMap.get(type);\n if (!typeMap) return;\n\n const wrappedListener = typeMap.get(listener);\n if (wrappedListener) {\n this._target.removeEventListener(type, wrappedListener);\n typeMap.delete(listener);\n\n // \uBE48 \uB9F5 \uC815\uB9AC\n if (typeMap.size === 0) {\n this._listenerMap.delete(type);\n }\n }\n }\n\n /**\n * \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n *\n * @param type \uC774\uBCA4\uD2B8 \uD0C0\uC785\n * @param args \uC774\uBCA4\uD2B8 \uB370\uC774\uD130 (void \uD0C0\uC785\uC774\uBA74 \uC0DD\uB7B5)\n */\n emit<K extends keyof T & string>(type: K, ...args: T[K] extends void ? [] : [data: T[K]]): void {\n this._target.dispatchEvent(new CustomEvent(type, { detail: args[0] }));\n }\n\n /**\n * \uD2B9\uC815 \uC774\uBCA4\uD2B8\uC758 \uB9AC\uC2A4\uB108 \uC218 \uBC18\uD658\n *\n * @param type \uC774\uBCA4\uD2B8 \uD0C0\uC785\n * @returns \uB4F1\uB85D\uB41C \uB9AC\uC2A4\uB108 \uC218\n */\n listenerCount<K extends keyof T & string>(type: K): number {\n return this._listenerMap.get(type)?.size ?? 0;\n }\n\n /**\n * \uBAA8\uB4E0 \uC774\uBCA4\uD2B8 \uB9AC\uC2A4\uB108\uB97C \uC81C\uAC70\uD55C\uB2E4.\n */\n dispose(): void {\n for (const [type, typeMap] of this._listenerMap) {\n for (const wrappedListener of typeMap.values()) {\n this._target.removeEventListener(type, wrappedListener);\n }\n }\n this._listenerMap.clear();\n }\n\n /**\n * using \uBB38 \uC9C0\uC6D0\n */\n [Symbol.dispose](): void {\n this.dispose();\n }\n}\n"],
5
+ "mappings": "AAsBO,MAAM,aAA8E;AAAA,EACxE,UAAU,IAAI,YAAY;AAAA;AAAA;AAAA,EAG1B,eAAe,oBAAI,IAA+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnF,GAA+B,MAAS,UAAsC;AAE5E,QAAI,UAAU,KAAK,aAAa,IAAI,IAAI;AACxC,QAAI,CAAC,SAAS;AACZ,gBAAU,oBAAI,IAAI;AAClB,WAAK,aAAa,IAAI,MAAM,OAAO;AAAA,IACrC;AAGA,QAAI,QAAQ,IAAI,QAAQ,EAAG;AAE3B,UAAM,kBAAkB,CAAC,MAAa,SAAU,EAAkB,MAAM;AACxE,YAAQ,IAAI,UAAU,eAAe;AACrC,SAAK,QAAQ,iBAAiB,MAAM,eAAe;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAgC,MAAS,UAAsC;AAC7E,UAAM,UAAU,KAAK,aAAa,IAAI,IAAI;AAC1C,QAAI,CAAC,QAAS;AAEd,UAAM,kBAAkB,QAAQ,IAAI,QAAQ;AAC5C,QAAI,iBAAiB;AACnB,WAAK,QAAQ,oBAAoB,MAAM,eAAe;AACtD,cAAQ,OAAO,QAAQ;AAGvB,UAAI,QAAQ,SAAS,GAAG;AACtB,aAAK,aAAa,OAAO,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAiC,SAAY,MAAmD;AAC9F,SAAK,QAAQ,cAAc,IAAI,YAAY,MAAM,EAAE,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAA0C,MAAiB;AAzF7D;AA0FI,aAAO,UAAK,aAAa,IAAI,IAAI,MAA1B,mBAA6B,SAAQ;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,eAAW,CAAC,MAAM,OAAO,KAAK,KAAK,cAAc;AAC/C,iBAAW,mBAAmB,QAAQ,OAAO,GAAG;AAC9C,aAAK,QAAQ,oBAAoB,MAAM,eAAe;AAAA,MACxD;AAAA,IACF;AACA,SAAK,aAAa,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,CAAC,OAAO,OAAO,IAAU;AACvB,SAAK,QAAQ;AAAA,EACf;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 비동기 함수 직렬 큐
3
+ *
4
+ * 큐에 추가된 함수들을 순서대로 실행합니다.
5
+ * 한 작업이 완료되어야 다음 작업이 시작됩니다.
6
+ * 에러가 발생해도 후속 작업은 계속 실행됩니다.
7
+ *
8
+ * @example
9
+ * const queue = new SerialQueue();
10
+ * queue.run(async () => { await fetch("/api/1"); });
11
+ * queue.run(async () => { await fetch("/api/2"); }); // 1번 완료 후 실행
12
+ * queue.run(async () => { await fetch("/api/3"); }); // 2번 완료 후 실행
13
+ *
14
+ * @example
15
+ * // 에러 처리
16
+ * queue.on("error", (err) => console.error(err));
17
+ */
18
+ import { SdError } from "../errors/sd-error";
19
+ import { EventEmitter } from "./event-emitter";
20
+ interface SerialQueueEvents {
21
+ error: SdError;
22
+ }
23
+ export declare class SerialQueue extends EventEmitter<SerialQueueEvents> {
24
+ private readonly _gap;
25
+ private static readonly _logger;
26
+ private readonly _queue;
27
+ private _isQueueRunning;
28
+ /**
29
+ * @param _gap 각 작업 사이의 간격 (ms)
30
+ */
31
+ constructor(_gap?: number);
32
+ /**
33
+ * 대기 중인 큐 비우기 (현재 실행 중인 작업은 완료됨)
34
+ */
35
+ dispose(): void;
36
+ /**
37
+ * using 문 지원
38
+ */
39
+ [Symbol.dispose](): void;
40
+ /**
41
+ * 함수를 큐에 추가하고 실행
42
+ */
43
+ run(fn: () => void | Promise<void>): void;
44
+ private _process;
45
+ }
46
+ export {};
47
+ //# sourceMappingURL=serial-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-queue.d.ts","sourceRoot":"","sources":["../../src/features/serial-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,UAAU,iBAAiB;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,WAAY,SAAQ,YAAY,CAAC,iBAAiB,CAAC;IASlD,OAAO,CAAC,QAAQ,CAAC,IAAI;IARjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAEzE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,eAAe,CAAS;IAEhC;;OAEG;gBAC0B,IAAI,GAAE,MAAU;IAI7C;;OAEG;IACM,OAAO,IAAI,IAAI;IAKxB;;OAEG;IACM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIjC;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;YAK3B,QAAQ;CA+BvB"}
@@ -0,0 +1,66 @@
1
+ import { SdError } from "../errors/sd-error";
2
+ import { EventEmitter } from "./event-emitter";
3
+ import { createConsola } from "consola";
4
+ import { waitTime } from "../utils/wait";
5
+ class SerialQueue extends EventEmitter {
6
+ /**
7
+ * @param _gap 각 작업 사이의 간격 (ms)
8
+ */
9
+ constructor(_gap = 0) {
10
+ super();
11
+ this._gap = _gap;
12
+ }
13
+ static _logger = createConsola().withTag("SerialQueue");
14
+ _queue = [];
15
+ _isQueueRunning = false;
16
+ /**
17
+ * 대기 중인 큐 비우기 (현재 실행 중인 작업은 완료됨)
18
+ */
19
+ dispose() {
20
+ this._queue.length = 0;
21
+ super.dispose();
22
+ }
23
+ /**
24
+ * using 문 지원
25
+ */
26
+ [Symbol.dispose]() {
27
+ this.dispose();
28
+ }
29
+ /**
30
+ * 함수를 큐에 추가하고 실행
31
+ */
32
+ run(fn) {
33
+ this._queue.push(fn);
34
+ void this._process();
35
+ }
36
+ async _process() {
37
+ if (this._isQueueRunning) return;
38
+ this._isQueueRunning = true;
39
+ try {
40
+ while (this._queue.length > 0) {
41
+ const fn = this._queue.shift();
42
+ if (!fn) break;
43
+ try {
44
+ await fn();
45
+ } catch (err) {
46
+ const error = err instanceof Error ? err : new Error(String(err));
47
+ const sdError = new SdError(error, "\uD050 \uC791\uC5C5 \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD");
48
+ if (this.listenerCount("error") > 0) {
49
+ this.emit("error", sdError);
50
+ } else {
51
+ SerialQueue._logger.error(sdError);
52
+ }
53
+ }
54
+ if (this._gap > 0 && this._queue.length > 0) {
55
+ await waitTime(this._gap);
56
+ }
57
+ }
58
+ } finally {
59
+ this._isQueueRunning = false;
60
+ }
61
+ }
62
+ }
63
+ export {
64
+ SerialQueue
65
+ };
66
+ //# sourceMappingURL=serial-queue.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/features/serial-queue.ts"],
4
+ "sourcesContent": ["/**\n * \uBE44\uB3D9\uAE30 \uD568\uC218 \uC9C1\uB82C \uD050\n *\n * \uD050\uC5D0 \uCD94\uAC00\uB41C \uD568\uC218\uB4E4\uC744 \uC21C\uC11C\uB300\uB85C \uC2E4\uD589\uD569\uB2C8\uB2E4.\n * \uD55C \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uC5B4\uC57C \uB2E4\uC74C \uC791\uC5C5\uC774 \uC2DC\uC791\uB429\uB2C8\uB2E4.\n * \uC5D0\uB7EC\uAC00 \uBC1C\uC0DD\uD574\uB3C4 \uD6C4\uC18D \uC791\uC5C5\uC740 \uACC4\uC18D \uC2E4\uD589\uB429\uB2C8\uB2E4.\n *\n * @example\n * const queue = new SerialQueue();\n * queue.run(async () => { await fetch(\"/api/1\"); });\n * queue.run(async () => { await fetch(\"/api/2\"); }); // 1\uBC88 \uC644\uB8CC \uD6C4 \uC2E4\uD589\n * queue.run(async () => { await fetch(\"/api/3\"); }); // 2\uBC88 \uC644\uB8CC \uD6C4 \uC2E4\uD589\n *\n * @example\n * // \uC5D0\uB7EC \uCC98\uB9AC\n * queue.on(\"error\", (err) => console.error(err));\n */\nimport { SdError } from \"../errors/sd-error\";\nimport { EventEmitter } from \"./event-emitter\";\nimport { createConsola } from \"consola\";\nimport { waitTime } from \"../utils/wait\";\n\ninterface SerialQueueEvents {\n error: SdError;\n}\n\nexport class SerialQueue extends EventEmitter<SerialQueueEvents> {\n private static readonly _logger = createConsola().withTag(\"SerialQueue\");\n\n private readonly _queue: (() => void | Promise<void>)[] = [];\n private _isQueueRunning = false;\n\n /**\n * @param _gap \uAC01 \uC791\uC5C5 \uC0AC\uC774\uC758 \uAC04\uACA9 (ms)\n */\n constructor(private readonly _gap: number = 0) {\n super();\n }\n\n /**\n * \uB300\uAE30 \uC911\uC778 \uD050 \uBE44\uC6B0\uAE30 (\uD604\uC7AC \uC2E4\uD589 \uC911\uC778 \uC791\uC5C5\uC740 \uC644\uB8CC\uB428)\n */\n override dispose(): void {\n this._queue.length = 0;\n super.dispose();\n }\n\n /**\n * using \uBB38 \uC9C0\uC6D0\n */\n override [Symbol.dispose](): void {\n this.dispose();\n }\n\n /**\n * \uD568\uC218\uB97C \uD050\uC5D0 \uCD94\uAC00\uD558\uACE0 \uC2E4\uD589\n */\n run(fn: () => void | Promise<void>): void {\n this._queue.push(fn);\n void this._process();\n }\n\n private async _process(): Promise<void> {\n if (this._isQueueRunning) return;\n this._isQueueRunning = true;\n\n try {\n while (this._queue.length > 0) {\n const fn = this._queue.shift();\n if (!fn) break;\n\n try {\n await fn();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const sdError = new SdError(error, \"\uD050 \uC791\uC5C5 \uC2E4\uD589 \uC911 \uC624\uB958 \uBC1C\uC0DD\");\n\n // \uB9AC\uC2A4\uB108\uAC00 \uC788\uC73C\uBA74 \uC774\uBCA4\uD2B8\uB85C \uC804\uB2EC, \uC5C6\uC73C\uBA74 \uB85C\uAE45\n if (this.listenerCount(\"error\") > 0) {\n this.emit(\"error\", sdError);\n } else {\n SerialQueue._logger.error(sdError);\n }\n }\n\n if (this._gap > 0 && this._queue.length > 0) {\n await waitTime(this._gap);\n }\n }\n } finally {\n this._isQueueRunning = false;\n }\n }\n}\n"],
5
+ "mappings": "AAiBA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAMlB,MAAM,oBAAoB,aAAgC;AAAA;AAAA;AAAA;AAAA,EAS/D,YAA6B,OAAe,GAAG;AAC7C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAVA,OAAwB,UAAU,cAAc,EAAE,QAAQ,aAAa;AAAA,EAEtD,SAAyC,CAAC;AAAA,EACnD,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAYjB,UAAgB;AACvB,SAAK,OAAO,SAAS;AACrB,UAAM,QAAQ;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,CAAU,OAAO,OAAO,IAAU;AAChC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAsC;AACxC,SAAK,OAAO,KAAK,EAAE;AACnB,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAEA,MAAc,WAA0B;AACtC,QAAI,KAAK,gBAAiB;AAC1B,SAAK,kBAAkB;AAEvB,QAAI;AACF,aAAO,KAAK,OAAO,SAAS,GAAG;AAC7B,cAAM,KAAK,KAAK,OAAO,MAAM;AAC7B,YAAI,CAAC,GAAI;AAET,YAAI;AACF,gBAAM,GAAG;AAAA,QACX,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAM,UAAU,IAAI,QAAQ,OAAO,mEAAiB;AAGpD,cAAI,KAAK,cAAc,OAAO,IAAI,GAAG;AACnC,iBAAK,KAAK,SAAS,OAAO;AAAA,UAC5B,OAAO;AACL,wBAAY,QAAQ,MAAM,OAAO;AAAA,UACnC;AAAA,QACF;AAEA,YAAI,KAAK,OAAO,KAAK,KAAK,OAAO,SAAS,GAAG;AAC3C,gBAAM,SAAS,KAAK,IAAI;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 개발 모드 여부
3
+ *
4
+ * 빌드 시점에 치환됨:
5
+ * - 라이브러리 빌드: 치환하지 않음 (그대로 유지)
6
+ * - client/server 빌드: `define: { '__DEV__': 'true/false' }`로 치환
7
+ */
8
+ export {};
9
+ declare global {
10
+ const __DEV__: boolean;
11
+ }
12
+ //# sourceMappingURL=globals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC;AAEV,OAAO,CAAC,MAAM,CAAC;IACb,MAAM,OAAO,EAAE,OAAO,CAAC;CACxB"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=globals.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,32 @@
1
+ import "./extensions/arr-ext";
2
+ import "./extensions/set-ext";
3
+ import "./extensions/map-ext";
4
+ export * from "./env";
5
+ export type { ArrayDiffsResult, ArrayDiffs2Result, TreeArray } from "./extensions/arr-ext";
6
+ export * from "./errors/sd-error";
7
+ export * from "./errors/argument-error";
8
+ export * from "./errors/not-implemented-error";
9
+ export * from "./errors/timeout-error";
10
+ export * from "./types/uuid";
11
+ export * from "./types/lazy-gc-map";
12
+ export * from "./types/date-time";
13
+ export * from "./types/date-only";
14
+ export * from "./types/time";
15
+ export * from "./features/debounce-queue";
16
+ export * from "./features/serial-queue";
17
+ export * from "./features/event-emitter";
18
+ export * from "./utils/date-format";
19
+ export * from "./utils/bytes";
20
+ export * from "./utils/json";
21
+ export * from "./utils/num";
22
+ export * from "./utils/obj";
23
+ export * from "./utils/primitive";
24
+ export * from "./utils/str";
25
+ export * from "./utils/template-strings";
26
+ export * from "./utils/transferable";
27
+ export * from "./utils/wait";
28
+ export * from "./utils/xml";
29
+ export * from "./utils/path";
30
+ export * from "./zip/sd-zip";
31
+ export * from "./common.types";
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,sBAAsB,CAAC;AAC9B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,sBAAsB,CAAC;AAE9B,cAAc,OAAO,CAAC;AAGtB,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG3F,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AAIvC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAI7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAIzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAI7B,cAAc,cAAc,CAAC;AAI7B,cAAc,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ import "./extensions/arr-ext";
2
+ import "./extensions/set-ext";
3
+ import "./extensions/map-ext";
4
+ export * from "./env";
5
+ export * from "./errors/sd-error";
6
+ export * from "./errors/argument-error";
7
+ export * from "./errors/not-implemented-error";
8
+ export * from "./errors/timeout-error";
9
+ export * from "./types/uuid";
10
+ export * from "./types/lazy-gc-map";
11
+ export * from "./types/date-time";
12
+ export * from "./types/date-only";
13
+ export * from "./types/time";
14
+ export * from "./features/debounce-queue";
15
+ export * from "./features/serial-queue";
16
+ export * from "./features/event-emitter";
17
+ export * from "./utils/date-format";
18
+ export * from "./utils/bytes";
19
+ export * from "./utils/json";
20
+ export * from "./utils/num";
21
+ export * from "./utils/obj";
22
+ export * from "./utils/primitive";
23
+ export * from "./utils/str";
24
+ export * from "./utils/template-strings";
25
+ export * from "./utils/transferable";
26
+ export * from "./utils/wait";
27
+ export * from "./utils/xml";
28
+ export * from "./utils/path";
29
+ export * from "./zip/sd-zip";
30
+ export * from "./common.types";
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["// @simplysm/core-common\n// \uACF5\uD1B5 \uC720\uD2F8\uB9AC\uD2F0 \uD328\uD0A4\uC9C0\n\nimport \"./extensions/arr-ext\";\nimport \"./extensions/set-ext\";\nimport \"./extensions/map-ext\";\n\nexport * from \"./env\";\n\n// arr-extension\uC5D0\uC11C \uD0C0\uC785\uB9CC re-export\nexport type { ArrayDiffsResult, ArrayDiffs2Result, TreeArray } from \"./extensions/arr-ext\";\n\n//#region errors\nexport * from \"./errors/sd-error\";\nexport * from \"./errors/argument-error\";\nexport * from \"./errors/not-implemented-error\";\nexport * from \"./errors/timeout-error\";\n//#endregion\n\n//#region types\nexport * from \"./types/uuid\";\nexport * from \"./types/lazy-gc-map\";\nexport * from \"./types/date-time\";\nexport * from \"./types/date-only\";\nexport * from \"./types/time\";\n//#endregion\n\n//#region features\nexport * from \"./features/debounce-queue\";\nexport * from \"./features/serial-queue\";\nexport * from \"./features/event-emitter\";\n//#endregion\n\n//#region utils\nexport * from \"./utils/date-format\";\nexport * from \"./utils/bytes\";\nexport * from \"./utils/json\";\nexport * from \"./utils/num\";\nexport * from \"./utils/obj\";\nexport * from \"./utils/primitive\";\nexport * from \"./utils/str\";\nexport * from \"./utils/template-strings\";\nexport * from \"./utils/transferable\";\nexport * from \"./utils/wait\";\nexport * from \"./utils/xml\";\nexport * from \"./utils/path\";\n//#endregion\n\n//#region zip\nexport * from \"./zip/sd-zip\";\n//#endregion\n\n//#region type utilities\nexport * from \"./common.types\";\n//#endregion\n"],
5
+ "mappings": "AAGA,OAAO;AACP,OAAO;AACP,OAAO;AAEP,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAId,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAId,cAAc;AACd,cAAc;AACd,cAAc;AAId,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAId,cAAc;AAId,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * 날짜 클래스 (시간제외: yyyy-MM-dd, 불변)
3
+ *
4
+ * 시간 정보 없이 날짜만 저장하는 불변 클래스이다.
5
+ * 로컬 타임존을 기준으로 동작한다.
6
+ *
7
+ * @example
8
+ * const today = new DateOnly();
9
+ * const specific = new DateOnly(2025, 1, 15);
10
+ * const parsed = DateOnly.parse("2025-01-15");
11
+ */
12
+ export declare class DateOnly {
13
+ private static readonly MS_PER_DAY;
14
+ readonly date: Date;
15
+ /** 현재시간 */
16
+ constructor();
17
+ /** 연월일로 초기화 */
18
+ constructor(year: number, month: number, day: number);
19
+ /** tick (millisecond)으로 생성 */
20
+ constructor(tick: number);
21
+ /** Date 타입으로 생성 */
22
+ constructor(date: Date);
23
+ /**
24
+ * 문자열을 DateOnly로 파싱
25
+ * @param str 날짜 문자열
26
+ * @returns DateOnly 인스턴스
27
+ *
28
+ * 지원 형식:
29
+ * - `yyyy-MM-dd` (예: '2024-01-15') - 문자열에서 직접 추출, 타임존 영향 없음
30
+ * - `yyyyMMdd` (예: '20240115') - 문자열에서 직접 추출, 타임존 영향 없음
31
+ * - ISO 8601 (예: '2024-01-15T00:00:00Z') - UTC로 해석 후 로컬 타임존 변환
32
+ *
33
+ * @note 서버/클라이언트 타임존이 다른 경우 `yyyy-MM-dd` 형식 사용 권장
34
+ * @note DST(일광절약시간) 지역에서 ISO 8601 형식 파싱 시, 파싱 대상 날짜의 오프셋을 사용합니다.
35
+ */
36
+ static parse(str: string): DateOnly;
37
+ /**
38
+ * 기준 연도와 월을 주차 정보를 기반으로 반환
39
+ * @param weekStartDay 주의 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
40
+ * @param minDaysInFirstWeek 첫 주로 간주할 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
41
+ * @returns 해당 날짜가 속한 주차의 기준 연도와 월
42
+ *
43
+ * @example
44
+ * // ISO 8601 표준 (월요일 시작, 첫 주 최소 4일)
45
+ * new DateOnly(2024, 1, 1).getBaseYearMonthSeqForWeekSeq(1, 4)
46
+ * // 미국식 (일요일 시작, 첫 주 최소 1일)
47
+ * new DateOnly(2024, 1, 1).getBaseYearMonthSeqForWeekSeq(0, 1)
48
+ */
49
+ getBaseYearMonthSeqForWeekSeq(weekStartDay?: number, minDaysInFirstWeek?: number): {
50
+ year: number;
51
+ monthSeq: number;
52
+ };
53
+ /**
54
+ * 주차 정보를 기반으로 해당 주의 시작 날짜 계산
55
+ * @param weekStartDay 주의 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
56
+ * @param minDaysInFirstWeek 첫 주로 간주할 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
57
+ * @returns 해당 날짜가 속한 주의 시작 날짜
58
+ */
59
+ getWeekSeqStartDate(weekStartDay?: number, minDaysInFirstWeek?: number): DateOnly;
60
+ /**
61
+ * 연도 및 주차 순서 정보를 반환
62
+ * @param weekStartDay 주의 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
63
+ * @param minDaysInFirstWeek 첫 주로 간주할 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
64
+ * @returns 연도와 해당 연도 기준 주차 번호
65
+ *
66
+ * @example
67
+ * // ISO 8601 표준 (월요일 시작, 첫 주 4일 이상)
68
+ * new DateOnly(2025, 1, 6).getWeekSeqOfYear(); // { year: 2025, weekSeq: 2 }
69
+ *
70
+ * // 미국식 (일요일 시작, 첫 주 1일 이상)
71
+ * new DateOnly(2025, 1, 1).getWeekSeqOfYear(0, 1); // { year: 2025, weekSeq: 1 }
72
+ */
73
+ getWeekSeqOfYear(weekStartDay?: number, minDaysInFirstWeek?: number): {
74
+ year: number;
75
+ weekSeq: number;
76
+ };
77
+ /**
78
+ * 해당 날짜의 연도, 월 및 주차(weekSeq) 정보를 반환
79
+ * @param weekStartDay 주의 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
80
+ * @param minDaysInFirstWeek 첫 주로 간주할 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
81
+ * @returns 연도, 월 및 해당 월 기준 주차 번호
82
+ *
83
+ * @example
84
+ * // ISO 8601 표준 (월요일 시작, 첫 주 4일 이상)
85
+ * new DateOnly(2025, 1, 15).getWeekSeqOfMonth(); // { year: 2025, monthSeq: 1, weekSeq: 3 }
86
+ *
87
+ * // 미국식 (일요일 시작, 첫 주 1일 이상)
88
+ * new DateOnly(2025, 1, 15).getWeekSeqOfMonth(0, 1); // { year: 2025, monthSeq: 1, weekSeq: 3 }
89
+ */
90
+ getWeekSeqOfMonth(weekStartDay?: number, minDaysInFirstWeek?: number): {
91
+ year: number;
92
+ monthSeq: number;
93
+ weekSeq: number;
94
+ };
95
+ /**
96
+ * 주차 정보를 기반으로 해당 주의 시작 날짜 가져오기
97
+ * @param arg 연도, 선택적 월, 주차 번호
98
+ * @param weekStartDay 주의 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
99
+ * @param minDaysInFirstWeek 첫 주로 간주할 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
100
+ * @returns 해당 주차의 시작 날짜
101
+ *
102
+ * @example
103
+ * // 2025년 2주차의 시작일 (ISO 8601 표준)
104
+ * DateOnly.getDateByYearWeekSeq({ year: 2025, weekSeq: 2 }); // 2025-01-06 (월요일)
105
+ *
106
+ * // 2025년 1월 3주차의 시작일
107
+ * DateOnly.getDateByYearWeekSeq({ year: 2025, month: 1, weekSeq: 3 }); // 2025-01-13 (월요일)
108
+ */
109
+ static getDateByYearWeekSeq(arg: {
110
+ year: number;
111
+ month?: number;
112
+ weekSeq: number;
113
+ }, weekStartDay?: number, minDaysInFirstWeek?: number): DateOnly;
114
+ /** 날짜 세팅이 제대로 되었는지 여부 */
115
+ get isValid(): boolean;
116
+ get year(): number;
117
+ get month(): number;
118
+ get day(): number;
119
+ get tick(): number;
120
+ /** 요일 (일~토: 0~6) */
121
+ get dayOfWeek(): number;
122
+ /** 지정된 연도로 새 인스턴스 반환 */
123
+ setYear(year: number): DateOnly;
124
+ /**
125
+ * 지정된 월로 새 DateOnly 인스턴스를 반환
126
+ * @param month 설정할 월 (1-12, 범위 외 값은 연도 조정)
127
+ * @note 대상 월의 일수보다 현재 일자가 크면 해당 월의 마지막 날로 조정됨
128
+ * (예: 1월 31일에서 setMonth(2) → 2월 28일 또는 29일)
129
+ */
130
+ setMonth(month: number): DateOnly;
131
+ /**
132
+ * 지정된 일자로 새 DateOnly 인스턴스를 반환
133
+ * @param day 설정할 일자
134
+ * @note 해당 월의 유효 범위를 벗어나는 일자는 JavaScript Date 기본 동작에 따라
135
+ * 자동으로 다음/이전 달로 조정됨 (예: 1월에 day=32 → 2월 1일)
136
+ */
137
+ setDay(day: number): DateOnly;
138
+ /** 지정된 연수를 더한 새 인스턴스 반환 */
139
+ addYears(years: number): DateOnly;
140
+ /** 지정된 월수를 더한 새 인스턴스 반환 */
141
+ addMonths(months: number): DateOnly;
142
+ /** 지정된 일수를 더한 새 인스턴스 반환 */
143
+ addDays(days: number): DateOnly;
144
+ /**
145
+ * 지정된 포맷으로 문자열 변환
146
+ * @param format 포맷 문자열
147
+ * @see dtFormat 지원 포맷 문자열 참조
148
+ */
149
+ toFormatString(formatStr: string): string;
150
+ toString(): string;
151
+ }
152
+ //# sourceMappingURL=date-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-only.d.ts","sourceRoot":"","sources":["../../src/types/date-only.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAEzD,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAEpB,WAAW;;IAEX,eAAe;gBACH,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IACpD,8BAA8B;gBAClB,IAAI,EAAE,MAAM;IACxB,mBAAmB;gBACP,IAAI,EAAE,IAAI;IAiBtB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;IAiCnC;;;;;;;;;;;OAWG;IACH,6BAA6B,CAAC,YAAY,GAAE,MAAU,EAAE,kBAAkB,GAAE,MAAU;;;;IA2BtF;;;;;OAKG;IACH,mBAAmB,CAAC,YAAY,GAAE,MAAU,EAAE,kBAAkB,GAAE,MAAU;IAW5E;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,YAAY,GAAE,MAAU,EAAE,kBAAkB,GAAE,MAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAY7G;;;;;;;;;;;;OAYG;IACH,iBAAiB,CACf,YAAY,GAAE,MAAU,EACxB,kBAAkB,GAAE,MAAU,GAC7B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAgBtD;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,oBAAoB,CACzB,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EACtD,YAAY,GAAE,MAAU,EACxB,kBAAkB,GAAE,MAAU;IAYhC,yBAAyB;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,oBAAoB;IACpB,IAAI,SAAS,IAAI,MAAM,CAEtB;IAMD,wBAAwB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAI/B;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ;IAKjC;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;IAQ7B,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ;IAIjC,2BAA2B;IAC3B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ;IAInC,2BAA2B;IAC3B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAQ/B;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQzC,QAAQ,IAAI,MAAM;CAKnB"}