@simplysm/core-common 13.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cache/typecheck-browser.tsbuildinfo +1 -0
- package/.cache/typecheck-node.tsbuildinfo +1 -0
- package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
- package/.cache/typecheck-tests-node.tsbuildinfo +1 -0
- package/README.md +887 -0
- package/dist/common.types.d.ts +74 -0
- package/dist/common.types.d.ts.map +1 -0
- package/dist/common.types.js +5 -0
- package/dist/common.types.js.map +7 -0
- package/dist/env.d.ts +6 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +9 -0
- package/dist/env.js.map +7 -0
- package/dist/errors/argument-error.d.ts +25 -0
- package/dist/errors/argument-error.d.ts.map +1 -0
- package/dist/errors/argument-error.js +18 -0
- package/dist/errors/argument-error.js.map +7 -0
- package/dist/errors/not-implemented-error.d.ts +29 -0
- package/dist/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/errors/not-implemented-error.js +14 -0
- package/dist/errors/not-implemented-error.js.map +7 -0
- package/dist/errors/sd-error.d.ts +27 -0
- package/dist/errors/sd-error.d.ts.map +1 -0
- package/dist/errors/sd-error.js +23 -0
- package/dist/errors/sd-error.js.map +7 -0
- package/dist/errors/timeout-error.d.ts +31 -0
- package/dist/errors/timeout-error.d.ts.map +1 -0
- package/dist/errors/timeout-error.js +17 -0
- package/dist/errors/timeout-error.js.map +7 -0
- package/dist/extensions/arr-ext.d.ts +15 -0
- package/dist/extensions/arr-ext.d.ts.map +1 -0
- package/dist/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/extensions/arr-ext.helpers.js +35 -0
- package/dist/extensions/arr-ext.helpers.js.map +7 -0
- package/dist/extensions/arr-ext.js +546 -0
- package/dist/extensions/arr-ext.js.map +7 -0
- package/dist/extensions/arr-ext.types.d.ts +215 -0
- package/dist/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/extensions/arr-ext.types.js +1 -0
- package/dist/extensions/arr-ext.types.js.map +7 -0
- package/dist/extensions/map-ext.d.ts +57 -0
- package/dist/extensions/map-ext.d.ts.map +1 -0
- package/dist/extensions/map-ext.js +26 -0
- package/dist/extensions/map-ext.js.map +7 -0
- package/dist/extensions/set-ext.d.ts +36 -0
- package/dist/extensions/set-ext.d.ts.map +1 -0
- package/dist/extensions/set-ext.js +29 -0
- package/dist/extensions/set-ext.js.map +7 -0
- package/dist/features/debounce-queue.d.ts +53 -0
- package/dist/features/debounce-queue.d.ts.map +1 -0
- package/dist/features/debounce-queue.js +80 -0
- package/dist/features/debounce-queue.js.map +7 -0
- package/dist/features/event-emitter.d.ts +66 -0
- package/dist/features/event-emitter.d.ts.map +1 -0
- package/dist/features/event-emitter.js +82 -0
- package/dist/features/event-emitter.js.map +7 -0
- package/dist/features/serial-queue.d.ts +47 -0
- package/dist/features/serial-queue.d.ts.map +1 -0
- package/dist/features/serial-queue.js +66 -0
- package/dist/features/serial-queue.js.map +7 -0
- package/dist/globals.d.ts +12 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +1 -0
- package/dist/globals.js.map +7 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +7 -0
- package/dist/types/date-only.d.ts +152 -0
- package/dist/types/date-only.d.ts.map +1 -0
- package/dist/types/date-only.js +251 -0
- package/dist/types/date-only.js.map +7 -0
- package/dist/types/date-time.d.ts +96 -0
- package/dist/types/date-time.d.ts.map +1 -0
- package/dist/types/date-time.js +220 -0
- package/dist/types/date-time.js.map +7 -0
- package/dist/types/lazy-gc-map.d.ts +80 -0
- package/dist/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/types/lazy-gc-map.js +179 -0
- package/dist/types/lazy-gc-map.js.map +7 -0
- package/dist/types/time.d.ts +68 -0
- package/dist/types/time.d.ts.map +1 -0
- package/dist/types/time.js +151 -0
- package/dist/types/time.js.map +7 -0
- package/dist/types/uuid.d.ts +35 -0
- package/dist/types/uuid.d.ts.map +1 -0
- package/dist/types/uuid.js +71 -0
- package/dist/types/uuid.js.map +7 -0
- package/dist/utils/bytes.d.ts +51 -0
- package/dist/utils/bytes.d.ts.map +1 -0
- package/dist/utils/bytes.js +89 -0
- package/dist/utils/bytes.js.map +7 -0
- package/dist/utils/date-format.d.ts +90 -0
- package/dist/utils/date-format.d.ts.map +1 -0
- package/dist/utils/date-format.js +106 -0
- package/dist/utils/date-format.js.map +7 -0
- package/dist/utils/json.d.ts +34 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +152 -0
- package/dist/utils/json.js.map +7 -0
- package/dist/utils/num.d.ts +60 -0
- package/dist/utils/num.d.ts.map +1 -0
- package/dist/utils/num.js +39 -0
- package/dist/utils/num.js.map +7 -0
- package/dist/utils/obj.d.ts +258 -0
- package/dist/utils/obj.d.ts.map +1 -0
- package/dist/utils/obj.js +538 -0
- package/dist/utils/obj.js.map +7 -0
- package/dist/utils/path.d.ts +23 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +21 -0
- package/dist/utils/path.js.map +7 -0
- package/dist/utils/primitive.d.ts +18 -0
- package/dist/utils/primitive.d.ts.map +1 -0
- package/dist/utils/primitive.js +20 -0
- package/dist/utils/primitive.js.map +7 -0
- package/dist/utils/str.d.ts +103 -0
- package/dist/utils/str.d.ts.map +1 -0
- package/dist/utils/str.js +128 -0
- package/dist/utils/str.js.map +7 -0
- package/dist/utils/template-strings.d.ts +84 -0
- package/dist/utils/template-strings.d.ts.map +1 -0
- package/dist/utils/template-strings.js +49 -0
- package/dist/utils/template-strings.js.map +7 -0
- package/dist/utils/transferable.d.ts +47 -0
- package/dist/utils/transferable.d.ts.map +1 -0
- package/dist/utils/transferable.js +153 -0
- package/dist/utils/transferable.js.map +7 -0
- package/dist/utils/wait.d.ts +19 -0
- package/dist/utils/wait.d.ts.map +1 -0
- package/dist/utils/wait.js +19 -0
- package/dist/utils/wait.js.map +7 -0
- package/dist/utils/xml.d.ts +36 -0
- package/dist/utils/xml.d.ts.map +1 -0
- package/dist/utils/xml.js +51 -0
- package/dist/utils/xml.js.map +7 -0
- package/dist/zip/sd-zip.d.ts +80 -0
- package/dist/zip/sd-zip.d.ts.map +1 -0
- package/dist/zip/sd-zip.js +153 -0
- package/dist/zip/sd-zip.js.map +7 -0
- package/package.json +31 -0
- package/src/common.types.ts +91 -0
- package/src/env.ts +11 -0
- package/src/errors/argument-error.ts +40 -0
- package/src/errors/not-implemented-error.ts +32 -0
- package/src/errors/sd-error.ts +53 -0
- package/src/errors/timeout-error.ts +36 -0
- package/src/extensions/arr-ext.helpers.ts +53 -0
- package/src/extensions/arr-ext.ts +777 -0
- package/src/extensions/arr-ext.types.ts +258 -0
- package/src/extensions/map-ext.ts +86 -0
- package/src/extensions/set-ext.ts +68 -0
- package/src/features/debounce-queue.ts +116 -0
- package/src/features/event-emitter.ts +112 -0
- package/src/features/serial-queue.ts +94 -0
- package/src/globals.ts +12 -0
- package/src/index.ts +55 -0
- package/src/types/date-only.ts +329 -0
- package/src/types/date-time.ts +294 -0
- package/src/types/lazy-gc-map.ts +244 -0
- package/src/types/time.ts +210 -0
- package/src/types/uuid.ts +113 -0
- package/src/utils/bytes.ts +160 -0
- package/src/utils/date-format.ts +239 -0
- package/src/utils/json.ts +230 -0
- package/src/utils/num.ts +97 -0
- package/src/utils/obj.ts +956 -0
- package/src/utils/path.ts +40 -0
- package/src/utils/primitive.ts +33 -0
- package/src/utils/str.ts +252 -0
- package/src/utils/template-strings.ts +132 -0
- package/src/utils/transferable.ts +269 -0
- package/src/utils/wait.ts +40 -0
- package/src/utils/xml.ts +105 -0
- package/src/zip/sd-zip.ts +218 -0
- package/tests/errors/errors.spec.ts +196 -0
- package/tests/extensions/array-extension.spec.ts +790 -0
- package/tests/extensions/map-extension.spec.ts +147 -0
- package/tests/extensions/set-extension.spec.ts +74 -0
- package/tests/types/date-only.spec.ts +636 -0
- package/tests/types/date-time.spec.ts +391 -0
- package/tests/types/lazy-gc-map.spec.ts +692 -0
- package/tests/types/time.spec.ts +559 -0
- package/tests/types/types.spec.ts +55 -0
- package/tests/types/uuid.spec.ts +91 -0
- package/tests/utils/bytes-utils.spec.ts +230 -0
- package/tests/utils/date-format.spec.ts +371 -0
- package/tests/utils/debounce-queue.spec.ts +272 -0
- package/tests/utils/json.spec.ts +475 -0
- package/tests/utils/number.spec.ts +184 -0
- package/tests/utils/object.spec.ts +827 -0
- package/tests/utils/path.spec.ts +78 -0
- package/tests/utils/primitive.spec.ts +55 -0
- package/tests/utils/sd-event-emitter.spec.ts +216 -0
- package/tests/utils/serial-queue.spec.ts +365 -0
- package/tests/utils/string.spec.ts +294 -0
- package/tests/utils/template-strings.spec.ts +96 -0
- package/tests/utils/transferable.spec.ts +698 -0
- package/tests/utils/wait.spec.ts +145 -0
- package/tests/utils/xml.spec.ts +146 -0
- package/tests/zip/sd-zip.spec.ts +234 -0
|
@@ -0,0 +1 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/globals.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=globals.js.map
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|