@simplysm/core-common 13.0.0-beta.4 → 13.0.0-beta.41

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 (98) hide show
  1. package/README.md +191 -815
  2. package/dist/common.types.js +4 -4
  3. package/dist/env.js +2 -2
  4. package/dist/env.js.map +2 -2
  5. package/dist/errors/argument-error.js +1 -1
  6. package/dist/errors/not-implemented-error.js +1 -1
  7. package/dist/errors/timeout-error.js +1 -1
  8. package/dist/extensions/arr-ext.helpers.js +4 -4
  9. package/dist/extensions/arr-ext.js +9 -9
  10. package/dist/features/debounce-queue.d.ts.map +1 -1
  11. package/dist/features/debounce-queue.js +4 -4
  12. package/dist/features/debounce-queue.js.map +2 -2
  13. package/dist/features/serial-queue.d.ts.map +1 -1
  14. package/dist/features/serial-queue.js +5 -5
  15. package/dist/features/serial-queue.js.map +2 -2
  16. package/dist/index.js +30 -30
  17. package/dist/types/date-only.js +2 -2
  18. package/dist/types/date-time.js +2 -2
  19. package/dist/types/lazy-gc-map.d.ts.map +1 -1
  20. package/dist/types/lazy-gc-map.js +2 -2
  21. package/dist/types/lazy-gc-map.js.map +2 -2
  22. package/dist/types/time.js +2 -2
  23. package/dist/types/uuid.js +1 -1
  24. package/dist/utils/bytes.js +1 -1
  25. package/dist/utils/json.js +8 -8
  26. package/dist/utils/obj.js +5 -5
  27. package/dist/utils/primitive.js +5 -5
  28. package/dist/utils/transferable.js +4 -4
  29. package/dist/utils/wait.js +1 -1
  30. package/docs/extensions.md +381 -0
  31. package/docs/features.md +94 -0
  32. package/docs/types.md +338 -0
  33. package/docs/utils.md +631 -0
  34. package/package.json +8 -4
  35. package/.cache/typecheck-browser.tsbuildinfo +0 -1
  36. package/.cache/typecheck-node.tsbuildinfo +0 -1
  37. package/.cache/typecheck-tests-browser.tsbuildinfo +0 -1
  38. package/.cache/typecheck-tests-node.tsbuildinfo +0 -1
  39. package/src/common.types.ts +0 -91
  40. package/src/env.ts +0 -11
  41. package/src/errors/argument-error.ts +0 -40
  42. package/src/errors/not-implemented-error.ts +0 -32
  43. package/src/errors/sd-error.ts +0 -53
  44. package/src/errors/timeout-error.ts +0 -36
  45. package/src/extensions/arr-ext.helpers.ts +0 -53
  46. package/src/extensions/arr-ext.ts +0 -777
  47. package/src/extensions/arr-ext.types.ts +0 -258
  48. package/src/extensions/map-ext.ts +0 -86
  49. package/src/extensions/set-ext.ts +0 -68
  50. package/src/features/debounce-queue.ts +0 -116
  51. package/src/features/event-emitter.ts +0 -112
  52. package/src/features/serial-queue.ts +0 -94
  53. package/src/globals.ts +0 -12
  54. package/src/index.ts +0 -55
  55. package/src/types/date-only.ts +0 -329
  56. package/src/types/date-time.ts +0 -294
  57. package/src/types/lazy-gc-map.ts +0 -244
  58. package/src/types/time.ts +0 -210
  59. package/src/types/uuid.ts +0 -113
  60. package/src/utils/bytes.ts +0 -160
  61. package/src/utils/date-format.ts +0 -239
  62. package/src/utils/json.ts +0 -230
  63. package/src/utils/num.ts +0 -97
  64. package/src/utils/obj.ts +0 -956
  65. package/src/utils/path.ts +0 -40
  66. package/src/utils/primitive.ts +0 -33
  67. package/src/utils/str.ts +0 -252
  68. package/src/utils/template-strings.ts +0 -132
  69. package/src/utils/transferable.ts +0 -269
  70. package/src/utils/wait.ts +0 -40
  71. package/src/utils/xml.ts +0 -105
  72. package/src/zip/sd-zip.ts +0 -218
  73. package/tests/errors/errors.spec.ts +0 -196
  74. package/tests/extensions/array-extension.spec.ts +0 -790
  75. package/tests/extensions/map-extension.spec.ts +0 -147
  76. package/tests/extensions/set-extension.spec.ts +0 -74
  77. package/tests/types/date-only.spec.ts +0 -636
  78. package/tests/types/date-time.spec.ts +0 -391
  79. package/tests/types/lazy-gc-map.spec.ts +0 -692
  80. package/tests/types/time.spec.ts +0 -559
  81. package/tests/types/types.spec.ts +0 -55
  82. package/tests/types/uuid.spec.ts +0 -91
  83. package/tests/utils/bytes-utils.spec.ts +0 -230
  84. package/tests/utils/date-format.spec.ts +0 -371
  85. package/tests/utils/debounce-queue.spec.ts +0 -272
  86. package/tests/utils/json.spec.ts +0 -475
  87. package/tests/utils/number.spec.ts +0 -184
  88. package/tests/utils/object.spec.ts +0 -827
  89. package/tests/utils/path.spec.ts +0 -78
  90. package/tests/utils/primitive.spec.ts +0 -55
  91. package/tests/utils/sd-event-emitter.spec.ts +0 -216
  92. package/tests/utils/serial-queue.spec.ts +0 -365
  93. package/tests/utils/string.spec.ts +0 -294
  94. package/tests/utils/template-strings.spec.ts +0 -96
  95. package/tests/utils/transferable.spec.ts +0 -698
  96. package/tests/utils/wait.spec.ts +0 -145
  97. package/tests/utils/xml.spec.ts +0 -146
  98. package/tests/zip/sd-zip.spec.ts +0 -234
@@ -1,5 +1,5 @@
1
- import { DateTime } from "./types/date-time";
2
- import { DateOnly } from "./types/date-only";
3
- import { Time } from "./types/time";
4
- import { Uuid } from "./types/uuid";
1
+ import { DateTime } from "./types/date-time.js";
2
+ import { DateOnly } from "./types/date-only.js";
3
+ import { Time } from "./types/time.js";
4
+ import { Uuid } from "./types/uuid.js";
5
5
  //# sourceMappingURL=common.types.js.map
package/dist/env.js CHANGED
@@ -1,7 +1,7 @@
1
1
  const env = {
2
+ ...process.env,
2
3
  DEV: JSON.parse(process.env.DEV != null && process.env.DEV !== "" ? process.env.DEV : "false"),
3
- VER: process.env.VER,
4
- ...process.env
4
+ VER: process.env.VER
5
5
  };
6
6
  export {
7
7
  env
package/dist/env.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/env.ts"],
4
- "sourcesContent": ["declare const process: { env: { DEV?: string; VER?: string; [key: string]: string | undefined } };\n\nexport const env: {\n DEV: boolean;\n VER?: string;\n [key: string]: unknown;\n} = {\n DEV: JSON.parse(process.env.DEV != null && process.env.DEV !== \"\" ? process.env.DEV : \"false\"),\n VER: process.env.VER,\n ...process.env,\n};\n"],
5
- "mappings": "AAEO,MAAM,MAIT;AAAA,EACF,KAAK,KAAK,MAAM,QAAQ,IAAI,OAAO,QAAQ,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,OAAO;AAAA,EAC7F,KAAK,QAAQ,IAAI;AAAA,EACjB,GAAG,QAAQ;AACb;",
4
+ "sourcesContent": ["declare const process: { env: { DEV?: string; VER?: string; [key: string]: string | undefined } };\n\nexport const env: {\n DEV: boolean;\n VER?: string;\n [key: string]: unknown;\n} = {\n ...process.env,\n DEV: JSON.parse(process.env.DEV != null && process.env.DEV !== \"\" ? process.env.DEV : \"false\"),\n VER: process.env.VER,\n};\n"],
5
+ "mappings": "AAEO,MAAM,MAIT;AAAA,EACF,GAAG,QAAQ;AAAA,EACX,KAAK,KAAK,MAAM,QAAQ,IAAI,OAAO,QAAQ,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,MAAM,OAAO;AAAA,EAC7F,KAAK,QAAQ,IAAI;AACnB;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import YAML from "yaml";
2
- import { SdError } from "./sd-error";
2
+ import { SdError } from "./sd-error.js";
3
3
  class ArgumentError extends SdError {
4
4
  constructor(arg1, arg2) {
5
5
  const message = typeof arg1 === "string" ? arg1 : void 0;
@@ -1,4 +1,4 @@
1
- import { SdError } from "./sd-error";
1
+ import { SdError } from "./sd-error.js";
2
2
  class NotImplementedError extends SdError {
3
3
  /**
4
4
  * @param message 추가 설명 메시지
@@ -1,4 +1,4 @@
1
- import { SdError } from "./sd-error";
1
+ import { SdError } from "./sd-error.js";
2
2
  class TimeoutError extends SdError {
3
3
  /**
4
4
  * @param count 시도 횟수
@@ -1,7 +1,7 @@
1
- import { DateTime } from "../types/date-time";
2
- import { DateOnly } from "../types/date-only";
3
- import { Time } from "../types/time";
4
- import { ArgumentError } from "../errors/argument-error";
1
+ import { DateTime } from "../types/date-time.js";
2
+ import { DateOnly } from "../types/date-only.js";
3
+ import { Time } from "../types/time.js";
4
+ import { ArgumentError } from "../errors/argument-error.js";
5
5
  function toComparable(value) {
6
6
  if (value instanceof DateOnly || value instanceof DateTime || value instanceof Time) {
7
7
  return value.tick;
@@ -1,12 +1,12 @@
1
- import "./map-ext";
2
- import { objClone, objEqual, objMerge } from "../utils/obj";
3
- import { DateTime } from "../types/date-time";
4
- import { DateOnly } from "../types/date-only";
5
- import { Time } from "../types/time";
6
- import { Uuid } from "../types/uuid";
7
- import { ArgumentError } from "../errors/argument-error";
8
- import { SdError } from "../errors/sd-error";
9
- import { compareForOrder } from "./arr-ext.helpers";
1
+ import "./map-ext.js";
2
+ import { objClone, objEqual, objMerge } from "../utils/obj.js";
3
+ import { DateTime } from "../types/date-time.js";
4
+ import { DateOnly } from "../types/date-only.js";
5
+ import { Time } from "../types/time.js";
6
+ import { Uuid } from "../types/uuid.js";
7
+ import { ArgumentError } from "../errors/argument-error.js";
8
+ import { SdError } from "../errors/sd-error.js";
9
+ import { compareForOrder } from "./arr-ext.helpers.js";
10
10
  const arrayReadonlyExtensions = {
11
11
  single(predicate) {
12
12
  const arr = predicate !== void 0 ? this.filter(predicate) : this;
@@ -1 +1 @@
1
- {"version":3,"file":"debounce-queue.d.ts","sourceRoot":"","sources":["../../src/features/debounce-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,UAAU,mBAAmB;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IAWtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAVpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAA4C;IAE3E,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAA4C;IAE1D;;OAEG;gBAC0B,MAAM,CAAC,EAAE,MAAM,YAAA;IAI5C;;OAEG;IACM,OAAO,IAAI,IAAI;IAUxB;;OAEG;IACM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIjC;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;YAiB3B,YAAY;CA+B3B"}
1
+ {"version":3,"file":"debounce-queue.d.ts","sourceRoot":"","sources":["../../src/features/debounce-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,UAAU,mBAAmB;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IAWtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAVpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAEnE,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAA4C;IAE1D;;OAEG;gBAC0B,MAAM,CAAC,EAAE,MAAM,YAAA;IAI5C;;OAEG;IACM,OAAO,IAAI,IAAI;IAUxB;;OAEG;IACM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIjC;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;YAiB3B,YAAY;CA+B3B"}
@@ -1,6 +1,6 @@
1
- import { SdError } from "../errors/sd-error";
2
- import { EventEmitter } from "./event-emitter";
3
- import { createConsola } from "consola";
1
+ import { SdError } from "../errors/sd-error.js";
2
+ import { EventEmitter } from "./event-emitter.js";
3
+ import consola from "consola";
4
4
  class DebounceQueue extends EventEmitter {
5
5
  /**
6
6
  * @param _delay 디바운스 지연 시간 (밀리초). 생략 시 즉시 실행 (다음 이벤트 루프)
@@ -9,7 +9,7 @@ class DebounceQueue extends EventEmitter {
9
9
  super();
10
10
  this._delay = _delay;
11
11
  }
12
- static _logger = createConsola().withTag("DebounceQueue");
12
+ static _logger = consola.withTag("DebounceQueue");
13
13
  _pendingFn;
14
14
  _isRunning = false;
15
15
  _isDisposed = false;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/features/debounce-queue.ts"],
4
- "sourcesContent": ["/**\n * \uBE44\uB3D9\uAE30 \uD568\uC218 \uB514\uBC14\uC6B4\uC2A4 \uD050\n *\n * \uC9E7\uC740 \uC2DC\uAC04 \uB0B4\uC5D0 \uC5EC\uB7EC \uBC88 \uD638\uCD9C\uB418\uBA74 \uB9C8\uC9C0\uB9C9 \uC694\uCCAD\uB9CC \uC2E4\uD589\uD558\uACE0 \uC774\uC804 \uC694\uCCAD\uC740 \uBB34\uC2DC\uD569\uB2C8\uB2E4.\n * \uC785\uB825 \uD544\uB4DC \uC790\uB3D9\uC644\uC131, \uC5F0\uC18D\uC801\uC778 \uC0C1\uD0DC \uBCC0\uACBD \uBC30\uCE58 \uCC98\uB9AC \uB4F1\uC5D0 \uC720\uC6A9\uD569\uB2C8\uB2E4.\n *\n * @remarks\n * \uC2E4\uD589 \uC911\uC5D0 \uCD94\uAC00\uB41C \uC694\uCCAD\uC740 \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC5C6\uC774 \uD604\uC7AC \uC2E4\uD589\uC774 \uC644\uB8CC\uB41C \uC9C1\uD6C4 \uCC98\uB9AC\uB429\uB2C8\uB2E4.\n * \uC774\uB294 \uC2E4\uD589 \uC644\uB8CC \uC804\uC5D0 \uB4E4\uC5B4\uC628 \uC694\uCCAD\uC774 \uB204\uB77D\uB418\uC9C0 \uC54A\uB3C4\uB85D \uD558\uAE30 \uC704\uD55C \uC758\uB3C4\uC801 \uC124\uACC4\uC785\uB2C8\uB2E4.\n *\n * @example\n * const queue = new DebounceQueue(300); // 300ms \uB51C\uB808\uC774\n * queue.run(() => console.log(\"1\")); // \uBB34\uC2DC\uB428\n * queue.run(() => console.log(\"2\")); // \uBB34\uC2DC\uB428\n * queue.run(() => console.log(\"3\")); // 300ms \uD6C4 \uC2E4\uD589\uB428\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\";\n\ninterface DebounceQueueEvents {\n error: SdError;\n}\n\nexport class DebounceQueue extends EventEmitter<DebounceQueueEvents> {\n private static readonly _logger = createConsola().withTag(\"DebounceQueue\");\n\n private _pendingFn: (() => void | Promise<void>) | undefined;\n private _isRunning = false;\n private _isDisposed = false;\n private _timer: ReturnType<typeof setTimeout> | undefined;\n\n /**\n * @param _delay \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC2DC\uAC04 (\uBC00\uB9AC\uCD08). \uC0DD\uB7B5 \uC2DC \uC989\uC2DC \uC2E4\uD589 (\uB2E4\uC74C \uC774\uBCA4\uD2B8 \uB8E8\uD504)\n */\n constructor(private readonly _delay?: number) {\n super();\n }\n\n /**\n * \uB300\uAE30 \uC911\uC778 \uC791\uC5C5\uACFC \uD0C0\uC774\uBA38 \uC815\uB9AC\n */\n override dispose(): void {\n this._isDisposed = true;\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n this._pendingFn = undefined;\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\n * \uC774\uC804\uC5D0 \uCD94\uAC00\uB41C \uD568\uC218\uAC00 \uC788\uC73C\uBA74 \uB300\uCCB4\uB428\n */\n run(fn: () => void | Promise<void>): void {\n if (this._isDisposed) return;\n\n this._pendingFn = fn;\n\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n\n if (!this._isRunning) {\n this._timer = setTimeout(() => {\n void this._processLast();\n }, this._delay);\n }\n }\n\n private async _processLast(): Promise<void> {\n if (this._isDisposed || this._isRunning || !this._pendingFn) return;\n\n this._isRunning = true;\n this._timer = undefined;\n\n try {\n // \uC2E4\uD589 \uC911\uC5D0 \uC0C8 \uC694\uCCAD\uC774 \uB4E4\uC5B4\uC624\uBA74 \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC5C6\uC774 \uC989\uC2DC \uCC98\uB9AC\n // \uC774\uB294 \"\uC2E4\uD589 \uC644\uB8CC \uC804\uC5D0 \uB4E4\uC5B4\uC628 \uC694\uCCAD\uC740 \uC2E4\uD589 \uC9C1\uD6C4 \uBC14\uB85C \uCC98\uB9AC\"\uD558\uB294 \uC758\uB3C4\uC801 \uC124\uACC4\n while (this._pendingFn) {\n const currentFn = this._pendingFn;\n this._pendingFn = undefined;\n\n try {\n await currentFn();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const sdError = new SdError(error, \"\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 DebounceQueue._logger.error(sdError);\n }\n }\n }\n } finally {\n this._isRunning = false;\n }\n }\n}\n"],
5
- "mappings": "AAoBA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAMvB,MAAM,sBAAsB,aAAkC;AAAA;AAAA;AAAA;AAAA,EAWnE,YAA6B,QAAiB;AAC5C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAZA,OAAwB,UAAU,cAAc,EAAE,QAAQ,eAAe;AAAA,EAEjE;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAYC,UAAgB;AACvB,SAAK,cAAc;AACnB,QAAI,KAAK,QAAQ;AACf,mBAAa,KAAK,MAAM;AACxB,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,aAAa;AAClB,UAAM,QAAQ;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,CAAU,OAAO,OAAO,IAAU;AAChC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAsC;AACxC,QAAI,KAAK,YAAa;AAEtB,SAAK,aAAa;AAElB,QAAI,KAAK,QAAQ;AACf,mBAAa,KAAK,MAAM;AACxB,WAAK,SAAS;AAAA,IAChB;AAEA,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,SAAS,WAAW,MAAM;AAC7B,aAAK,KAAK,aAAa;AAAA,MACzB,GAAG,KAAK,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI,KAAK,eAAe,KAAK,cAAc,CAAC,KAAK,WAAY;AAE7D,SAAK,aAAa;AAClB,SAAK,SAAS;AAEd,QAAI;AAGF,aAAO,KAAK,YAAY;AACtB,cAAM,YAAY,KAAK;AACvB,aAAK,aAAa;AAElB,YAAI;AACF,gBAAM,UAAU;AAAA,QAClB,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAM,UAAU,IAAI,QAAQ,OAAO,4DAAe;AAGlD,cAAI,KAAK,cAAc,OAAO,IAAI,GAAG;AACnC,iBAAK,KAAK,SAAS,OAAO;AAAA,UAC5B,OAAO;AACL,0BAAc,QAAQ,MAAM,OAAO;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["/**\n * \uBE44\uB3D9\uAE30 \uD568\uC218 \uB514\uBC14\uC6B4\uC2A4 \uD050\n *\n * \uC9E7\uC740 \uC2DC\uAC04 \uB0B4\uC5D0 \uC5EC\uB7EC \uBC88 \uD638\uCD9C\uB418\uBA74 \uB9C8\uC9C0\uB9C9 \uC694\uCCAD\uB9CC \uC2E4\uD589\uD558\uACE0 \uC774\uC804 \uC694\uCCAD\uC740 \uBB34\uC2DC\uD569\uB2C8\uB2E4.\n * \uC785\uB825 \uD544\uB4DC \uC790\uB3D9\uC644\uC131, \uC5F0\uC18D\uC801\uC778 \uC0C1\uD0DC \uBCC0\uACBD \uBC30\uCE58 \uCC98\uB9AC \uB4F1\uC5D0 \uC720\uC6A9\uD569\uB2C8\uB2E4.\n *\n * @remarks\n * \uC2E4\uD589 \uC911\uC5D0 \uCD94\uAC00\uB41C \uC694\uCCAD\uC740 \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC5C6\uC774 \uD604\uC7AC \uC2E4\uD589\uC774 \uC644\uB8CC\uB41C \uC9C1\uD6C4 \uCC98\uB9AC\uB429\uB2C8\uB2E4.\n * \uC774\uB294 \uC2E4\uD589 \uC644\uB8CC \uC804\uC5D0 \uB4E4\uC5B4\uC628 \uC694\uCCAD\uC774 \uB204\uB77D\uB418\uC9C0 \uC54A\uB3C4\uB85D \uD558\uAE30 \uC704\uD55C \uC758\uB3C4\uC801 \uC124\uACC4\uC785\uB2C8\uB2E4.\n *\n * @example\n * const queue = new DebounceQueue(300); // 300ms \uB51C\uB808\uC774\n * queue.run(() => console.log(\"1\")); // \uBB34\uC2DC\uB428\n * queue.run(() => console.log(\"2\")); // \uBB34\uC2DC\uB428\n * queue.run(() => console.log(\"3\")); // 300ms \uD6C4 \uC2E4\uD589\uB428\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 consola from \"consola\";\n\ninterface DebounceQueueEvents {\n error: SdError;\n}\n\nexport class DebounceQueue extends EventEmitter<DebounceQueueEvents> {\n private static readonly _logger = consola.withTag(\"DebounceQueue\");\n\n private _pendingFn: (() => void | Promise<void>) | undefined;\n private _isRunning = false;\n private _isDisposed = false;\n private _timer: ReturnType<typeof setTimeout> | undefined;\n\n /**\n * @param _delay \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC2DC\uAC04 (\uBC00\uB9AC\uCD08). \uC0DD\uB7B5 \uC2DC \uC989\uC2DC \uC2E4\uD589 (\uB2E4\uC74C \uC774\uBCA4\uD2B8 \uB8E8\uD504)\n */\n constructor(private readonly _delay?: number) {\n super();\n }\n\n /**\n * \uB300\uAE30 \uC911\uC778 \uC791\uC5C5\uACFC \uD0C0\uC774\uBA38 \uC815\uB9AC\n */\n override dispose(): void {\n this._isDisposed = true;\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n this._pendingFn = undefined;\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\n * \uC774\uC804\uC5D0 \uCD94\uAC00\uB41C \uD568\uC218\uAC00 \uC788\uC73C\uBA74 \uB300\uCCB4\uB428\n */\n run(fn: () => void | Promise<void>): void {\n if (this._isDisposed) return;\n\n this._pendingFn = fn;\n\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = undefined;\n }\n\n if (!this._isRunning) {\n this._timer = setTimeout(() => {\n void this._processLast();\n }, this._delay);\n }\n }\n\n private async _processLast(): Promise<void> {\n if (this._isDisposed || this._isRunning || !this._pendingFn) return;\n\n this._isRunning = true;\n this._timer = undefined;\n\n try {\n // \uC2E4\uD589 \uC911\uC5D0 \uC0C8 \uC694\uCCAD\uC774 \uB4E4\uC5B4\uC624\uBA74 \uB514\uBC14\uC6B4\uC2A4 \uC9C0\uC5F0 \uC5C6\uC774 \uC989\uC2DC \uCC98\uB9AC\n // \uC774\uB294 \"\uC2E4\uD589 \uC644\uB8CC \uC804\uC5D0 \uB4E4\uC5B4\uC628 \uC694\uCCAD\uC740 \uC2E4\uD589 \uC9C1\uD6C4 \uBC14\uB85C \uCC98\uB9AC\"\uD558\uB294 \uC758\uB3C4\uC801 \uC124\uACC4\n while (this._pendingFn) {\n const currentFn = this._pendingFn;\n this._pendingFn = undefined;\n\n try {\n await currentFn();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const sdError = new SdError(error, \"\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 DebounceQueue._logger.error(sdError);\n }\n }\n }\n } finally {\n this._isRunning = false;\n }\n }\n}\n"],
5
+ "mappings": "AAoBA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,OAAO,aAAa;AAMb,MAAM,sBAAsB,aAAkC;AAAA;AAAA;AAAA;AAAA,EAWnE,YAA6B,QAAiB;AAC5C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAZA,OAAwB,UAAU,QAAQ,QAAQ,eAAe;AAAA,EAEzD;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAYC,UAAgB;AACvB,SAAK,cAAc;AACnB,QAAI,KAAK,QAAQ;AACf,mBAAa,KAAK,MAAM;AACxB,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,aAAa;AAClB,UAAM,QAAQ;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,CAAU,OAAO,OAAO,IAAU;AAChC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAsC;AACxC,QAAI,KAAK,YAAa;AAEtB,SAAK,aAAa;AAElB,QAAI,KAAK,QAAQ;AACf,mBAAa,KAAK,MAAM;AACxB,WAAK,SAAS;AAAA,IAChB;AAEA,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,SAAS,WAAW,MAAM;AAC7B,aAAK,KAAK,aAAa;AAAA,MACzB,GAAG,KAAK,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI,KAAK,eAAe,KAAK,cAAc,CAAC,KAAK,WAAY;AAE7D,SAAK,aAAa;AAClB,SAAK,SAAS;AAEd,QAAI;AAGF,aAAO,KAAK,YAAY;AACtB,cAAM,YAAY,KAAK;AACvB,aAAK,aAAa;AAElB,YAAI;AACF,gBAAM,UAAU;AAAA,QAClB,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAM,UAAU,IAAI,QAAQ,OAAO,4DAAe;AAGlD,cAAI,KAAK,cAAc,OAAO,IAAI,GAAG;AACnC,iBAAK,KAAK,SAAS,OAAO;AAAA,UAC5B,OAAO;AACL,0BAAc,QAAQ,MAAM,OAAO;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1 +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"}
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,CAAkC;IAEjE,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"}
@@ -1,7 +1,7 @@
1
- import { SdError } from "../errors/sd-error";
2
- import { EventEmitter } from "./event-emitter";
3
- import { createConsola } from "consola";
4
- import { waitTime } from "../utils/wait";
1
+ import { SdError } from "../errors/sd-error.js";
2
+ import { EventEmitter } from "./event-emitter.js";
3
+ import consola from "consola";
4
+ import { waitTime } from "../utils/wait.js";
5
5
  class SerialQueue extends EventEmitter {
6
6
  /**
7
7
  * @param _gap 각 작업 사이의 간격 (ms)
@@ -10,7 +10,7 @@ class SerialQueue extends EventEmitter {
10
10
  super();
11
11
  this._gap = _gap;
12
12
  }
13
- static _logger = createConsola().withTag("SerialQueue");
13
+ static _logger = consola.withTag("SerialQueue");
14
14
  _queue = [];
15
15
  _isQueueRunning = false;
16
16
  /**
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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 consola 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 = consola.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,OAAO,aAAa;AACpB,SAAS,gBAAgB;AAMlB,MAAM,oBAAoB,aAAgC;AAAA;AAAA;AAAA;AAAA,EAS/D,YAA6B,OAAe,GAAG;AAC7C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAVA,OAAwB,UAAU,QAAQ,QAAQ,aAAa;AAAA,EAE9C,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
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -1,31 +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";
1
+ import "./extensions/arr-ext.js";
2
+ import "./extensions/set-ext.js";
3
+ import "./extensions/map-ext.js";
4
+ export * from "./env.js";
5
+ export * from "./errors/sd-error.js";
6
+ export * from "./errors/argument-error.js";
7
+ export * from "./errors/not-implemented-error.js";
8
+ export * from "./errors/timeout-error.js";
9
+ export * from "./types/uuid.js";
10
+ export * from "./types/lazy-gc-map.js";
11
+ export * from "./types/date-time.js";
12
+ export * from "./types/date-only.js";
13
+ export * from "./types/time.js";
14
+ export * from "./features/debounce-queue.js";
15
+ export * from "./features/serial-queue.js";
16
+ export * from "./features/event-emitter.js";
17
+ export * from "./utils/date-format.js";
18
+ export * from "./utils/bytes.js";
19
+ export * from "./utils/json.js";
20
+ export * from "./utils/num.js";
21
+ export * from "./utils/obj.js";
22
+ export * from "./utils/primitive.js";
23
+ export * from "./utils/str.js";
24
+ export * from "./utils/template-strings.js";
25
+ export * from "./utils/transferable.js";
26
+ export * from "./utils/wait.js";
27
+ export * from "./utils/xml.js";
28
+ export * from "./utils/path.js";
29
+ export * from "./zip/sd-zip.js";
30
+ export * from "./common.types.js";
31
31
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
- import { ArgumentError } from "../errors/argument-error";
2
- import { formatDate, normalizeMonth } from "../utils/date-format";
1
+ import { ArgumentError } from "../errors/argument-error.js";
2
+ import { formatDate, normalizeMonth } from "../utils/date-format.js";
3
3
  class DateOnly {
4
4
  static MS_PER_DAY = 24 * 60 * 60 * 1e3;
5
5
  date;
@@ -1,5 +1,5 @@
1
- import { ArgumentError } from "../errors/argument-error";
2
- import { convert12To24, formatDate, normalizeMonth } from "../utils/date-format";
1
+ import { ArgumentError } from "../errors/argument-error.js";
2
+ import { convert12To24, formatDate, normalizeMonth } from "../utils/date-format.js";
3
3
  class DateTime {
4
4
  date;
5
5
  constructor(arg1, arg2, arg3, arg4, arg5, arg6, arg7) {
@@ -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,CAAC,EAAE,CAAC;IAkCvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAjC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEvE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAKjB;IAGhB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkD;IAGvE,OAAO,CAAC,QAAQ,CAAC,CAAiC;IAElD,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IAEnE;;;;;OAKG;gBAEgB,QAAQ,EAAE;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACvD;IAKH,eAAe;IACf,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+BAA+B;IAC/B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAKpB,uBAAuB;IACvB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAU1B,kCAAkC;IAClC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAO3B,6BAA6B;IAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAUvB,mCAAmC;IACnC,OAAO,IAAI,IAAI;IASf,iBAAiB;IACjB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;IAexC,wBAAwB;IACvB,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAO9B,wBAAwB;IACvB,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAK5B,wBAAwB;IACvB,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IASpC,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,CAAC,EAAE,CAAC;IAkCvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAjC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAE/D;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAKjB;IAGhB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkD;IAGvE,OAAO,CAAC,QAAQ,CAAC,CAAiC;IAElD,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IAEnE;;;;;OAKG;gBAEgB,QAAQ,EAAE;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACvD;IAKH,eAAe;IACf,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+BAA+B;IAC/B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAKpB,uBAAuB;IACvB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAU1B,kCAAkC;IAClC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAO3B,6BAA6B;IAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAUvB,mCAAmC;IACnC,OAAO,IAAI,IAAI;IASf,iBAAiB;IACjB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;IAexC,wBAAwB;IACvB,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAO9B,wBAAwB;IACvB,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAK5B,wBAAwB;IACvB,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IASpC,OAAO,CAAC,QAAQ;YAUF,MAAM;IAmDpB,OAAO,CAAC,OAAO;CAQhB"}
@@ -1,4 +1,4 @@
1
- import { createConsola } from "consola";
1
+ import consola from "consola";
2
2
  class LazyGcMap {
3
3
  /**
4
4
  * @param _options 설정 옵션
@@ -11,7 +11,7 @@ class LazyGcMap {
11
11
  var _a;
12
12
  (_a = LazyGcMap._registry) == null ? void 0 : _a.register(this, this._instanceId);
13
13
  }
14
- static _logger = createConsola().withTag("LazyGcMap");
14
+ static _logger = consola.withTag("LazyGcMap");
15
15
  /**
16
16
  * dispose() 미호출 감지용 registry
17
17
  * @note FinalizationRegistry는 Chrome 84+, Node 14.6+ 지원
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/lazy-gc-map.ts"],
4
- "sourcesContent": ["import { createConsola } from \"consola\";\n\n/**\n * \uC790\uB3D9 \uB9CC\uB8CC \uAE30\uB2A5\uC774 \uC788\uB294 Map\n * LRU \uBC29\uC2DD\uC73C\uB85C \uC811\uADFC \uC2DC\uAC04 \uAC31\uC2E0, \uC77C\uC815 \uC2DC\uAC04 \uBBF8\uC811\uADFC \uC2DC \uC790\uB3D9 \uC0AD\uC81C\n *\n * @note \uC778\uC2A4\uD134\uC2A4 \uC0AC\uC6A9 \uD6C4 \uBC18\uB4DC\uC2DC dispose()\uB97C \uD638\uCD9C\uD558\uAC70\uB098 using \uBB38\uC744 \uC0AC\uC6A9\uD574\uC57C \uD568.\n * \uADF8\uB807\uC9C0 \uC54A\uC73C\uBA74 GC \uD0C0\uC774\uBA38\uAC00 \uACC4\uC18D \uB3D9\uC791\uD558\uC5EC \uBA54\uBAA8\uB9AC \uB204\uC218 \uBC1C\uC0DD.\n *\n * @example\n * // using \uBB38 \uC0AC\uC6A9 (\uAD8C\uC7A5)\n * using map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });\n *\n * // \uB610\uB294 \uBA85\uC2DC\uC801 dispose() \uD638\uCD9C\n * const map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });\n * try {\n * // ... \uC0AC\uC6A9\n * } finally {\n * map.dispose();\n * }\n */\nexport class LazyGcMap<K, V> {\n private static readonly _logger = createConsola().withTag(\"LazyGcMap\");\n\n /**\n * dispose() \uBBF8\uD638\uCD9C \uAC10\uC9C0\uC6A9 registry\n * @note FinalizationRegistry\uB294 Chrome 84+, Node 14.6+ \uC9C0\uC6D0\n * \uBBF8\uC9C0\uC6D0 \uD658\uACBD\uC5D0\uC11C\uB294 \uACBD\uACE0 \uC5C6\uC774 \uB3D9\uC791\uD558\uC9C0\uB9CC, dispose() \uBBF8\uD638\uCD9C \uC2DC \uBA54\uBAA8\uB9AC \uB204\uC218 \uAC00\uB2A5\n */\n private static readonly _registry =\n typeof FinalizationRegistry !== \"undefined\"\n ? new FinalizationRegistry<string>((id) => {\n LazyGcMap._logger.warn(`LazyGcMap(${id})\uC774 dispose() \uC5C6\uC774 \uAC00\uBE44\uC9C0 \uC218\uC9D1\uB428. \uBA54\uBAA8\uB9AC \uB204\uC218 \uAC00\uB2A5\uC131 \uC788\uC74C.`);\n })\n : undefined;\n\n // \uC2E4\uC81C \uB370\uC774\uD130\uC640 \uB9C8\uC9C0\uB9C9 \uC811\uADFC \uC2DC\uAC04\uC744 \uD568\uAED8 \uC800\uC7A5\n private readonly _map = new Map<K, { value: V; lastAccess: number }>();\n\n // GC \uD0C0\uC774\uBA38\n private _gcTimer?: ReturnType<typeof setInterval>;\n // GC \uC2E4\uD589 \uC911 \uD50C\uB798\uADF8 (\uC911\uBCF5 \uC2E4\uD589 \uBC29\uC9C0)\n private _isGcRunning = false;\n // destroy \uD638\uCD9C \uC5EC\uBD80\n private _isDestroyed = false;\n // \uC778\uC2A4\uD134\uC2A4 \uC2DD\uBCC4\uC790 (\uACBD\uACE0 \uBA54\uC2DC\uC9C0\uC6A9)\n private readonly _instanceId = Math.random().toString(36).slice(2);\n\n /**\n * @param _options \uC124\uC815 \uC635\uC158\n * @param _options.gcInterval GC \uC8FC\uAE30 (\uBC00\uB9AC\uCD08). \uAE30\uBCF8\uAC12: expireTime\uC758 1/10 (\uCD5C\uC18C 1000ms)\n * @param _options.expireTime \uB9CC\uB8CC \uC2DC\uAC04 (\uBC00\uB9AC\uCD08). \uB9C8\uC9C0\uB9C9 \uC811\uADFC \uD6C4 \uC774 \uC2DC\uAC04\uC774 \uC9C0\uB098\uBA74 \uC0AD\uC81C\uB428. \uC608: 60000 (60\uCD08)\n * @param _options.onExpire \uB9CC\uB8CC \uC2DC \uD638\uCD9C\uB418\uB294 \uCF5C\uBC31. \uBE44\uB3D9\uAE30 \uD568\uC218\uB3C4 \uAC00\uB2A5\uD558\uBA70, \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC \uB85C\uAE45 \uD6C4 \uACC4\uC18D \uC9C4\uD589\uB428\n */\n constructor(\n private readonly _options: {\n gcInterval?: number;\n expireTime: number;\n onExpire?: (key: K, value: V) => void | Promise<void>;\n },\n ) {\n LazyGcMap._registry?.register(this, this._instanceId);\n }\n\n /** \uC800\uC7A5\uB41C \uD56D\uBAA9 \uC218 */\n get size(): number {\n return this._map.size;\n }\n\n /** \uD0A4 \uC874\uC7AC \uC5EC\uBD80 \uD655\uC778 (\uC811\uADFC \uC2DC\uAC04 \uAC31\uC2E0 \uC548\uD568) */\n has(key: K): boolean {\n if (this._isDestroyed) return false;\n return this._map.has(key);\n }\n\n /** \uAC12 \uC870\uD68C (\uC811\uADFC \uC2DC\uAC04 \uAC31\uC2E0\uB428) */\n get(key: K): V | undefined {\n if (this._isDestroyed) return undefined;\n const item = this._map.get(key);\n if (item == null) return undefined;\n\n // \uC811\uADFC \uC2DC \uC2DC\uAC04 \uAC31\uC2E0 (LRU)\n item.lastAccess = Date.now();\n return item.value;\n }\n\n /** \uAC12 \uC800\uC7A5 (\uC811\uADFC \uC2DC\uAC04 \uC124\uC815 \uBC0F GC \uD0C0\uC774\uBA38 \uC2DC\uC791) */\n set(key: K, value: V): void {\n if (this._isDestroyed) return;\n this._map.set(key, { value, lastAccess: Date.now() });\n // \uB370\uC774\uD130\uAC00 \uB4E4\uC5B4\uC654\uC73C\uBBC0\uB85C GC \uD0C0\uC774\uBA38 \uAC00\uB3D9\n this._startGc();\n }\n\n /** \uD56D\uBAA9 \uC0AD\uC81C (\uBE44\uC5C8\uC73C\uBA74 GC \uD0C0\uC774\uBA38 \uC911\uC9C0) */\n delete(key: K): boolean {\n if (this._isDestroyed) return false;\n const result = this._map.delete(key);\n // \uBE44\uC5C8\uC73C\uBA74 \uD0C0\uC774\uBA38 \uC911\uC9C0\n if (this._map.size === 0) {\n this._stopGc();\n }\n return result;\n }\n\n /** \uC778\uC2A4\uD134\uC2A4 \uC815\uB9AC (GC \uD0C0\uC774\uBA38 \uC911\uC9C0 \uBC0F \uB370\uC774\uD130 \uC0AD\uC81C) */\n dispose(): void {\n if (this._isDestroyed) return;\n this._isDestroyed = true;\n LazyGcMap._registry?.unregister(this);\n\n this._map.clear();\n this._stopGc();\n }\n\n /** using \uBB38 \uC9C0\uC6D0 */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n /**\n * \uBAA8\uB4E0 \uD56D\uBAA9 \uC0AD\uC81C (\uC778\uC2A4\uD134\uC2A4\uB294 \uACC4\uC18D \uC0AC\uC6A9 \uAC00\uB2A5)\n */\n clear(): void {\n if (this._isDestroyed) return;\n this._map.clear();\n this._stopGc();\n }\n\n /**\n * \uD0A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uAC12\uC744 \uBC18\uD658\uD558\uACE0, \uC5C6\uC73C\uBA74 factory\uB85C \uC0DD\uC131 \uD6C4 \uC800\uC7A5\uD558\uC5EC \uBC18\uD658\n * @param key \uC870\uD68C\uD560 \uD0A4\n * @param factory \uD0A4\uAC00 \uC5C6\uC744 \uB54C \uAC12\uC744 \uC0DD\uC131\uD558\uB294 \uD568\uC218\n * @returns \uAE30\uC874 \uAC12 \uB610\uB294 \uC0C8\uB85C \uC0DD\uC131\uB41C \uAC12\n */\n getOrCreate(key: K, factory: () => V): V {\n if (this._isDestroyed) {\n throw new Error(\"LazyGcMap\uC774 \uC774\uBBF8 dispose\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\");\n }\n const item = this._map.get(key);\n if (item == null) {\n const value = factory();\n this.set(key, value);\n return value;\n }\n\n item.lastAccess = Date.now();\n return item.value;\n }\n\n /** \uAC12\uB4E4\uB9CC \uC21C\uD68C (Iterator) */\n *values(): IterableIterator<V> {\n if (this._isDestroyed) return;\n for (const item of this._map.values()) {\n yield item.value;\n }\n }\n\n /** \uD0A4\uB4E4\uB9CC \uC21C\uD68C (Iterator) */\n *keys(): IterableIterator<K> {\n if (this._isDestroyed) return;\n yield* this._map.keys();\n }\n\n /** \uC5D4\uD2B8\uB9AC \uC21C\uD68C (Iterator) */\n *entries(): IterableIterator<[K, V]> {\n if (this._isDestroyed) return;\n for (const [key, item] of this._map.entries()) {\n yield [key, item.value];\n }\n }\n\n //#region GC \uB85C\uC9C1\n\n private _startGc(): void {\n if (this._isDestroyed) return;\n if (this._gcTimer != null) return;\n\n const interval = this._options.gcInterval ?? Math.max(this._options.expireTime / 10, 1000);\n this._gcTimer = setInterval(() => {\n void this._runGc();\n }, interval);\n }\n\n private async _runGc(): Promise<void> {\n // \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBA74 \uC2A4\uD0B5 (onExpire \uCF5C\uBC31\uC774 \uC624\uB798 \uAC78\uB9AC\uB294 \uACBD\uC6B0 \uC911\uBCF5 \uC2E4\uD589 \uBC29\uC9C0)\n if (this._isGcRunning) return;\n this._isGcRunning = true;\n\n try {\n const now = Date.now();\n\n // 1. \uB9CC\uB8CC\uB41C \uD56D\uBAA9 \uC218\uC9D1 (\uC0AD\uC81C \uC804)\n const expiredEntries: { key: K; item: { value: V; lastAccess: number } }[] = [];\n for (const [key, item] of this._map) {\n if (now - item.lastAccess > this._options.expireTime) {\n expiredEntries.push({ key, item });\n }\n }\n\n // 2. \uAC01 \uD56D\uBAA9\uC5D0 \uB300\uD574 \uCF5C\uBC31 \uC2E4\uD589 \uD6C4 \uC0AD\uC81C\n for (const { key, item } of expiredEntries) {\n // \uCF5C\uBC31 \uC2E4\uD589 \uC804 \uD604\uC7AC \uC0C1\uD0DC \uD655\uC778 (\uC774\uBBF8 \uB2E4\uB978 \uAC12\uC73C\uB85C \uAD50\uCCB4\uB418\uC5C8\uAC70\uB098 \uC0AD\uC81C\uB418\uC5C8\uC73C\uBA74 \uC2A4\uD0B5)\n const currentItem = this._map.get(key);\n if (currentItem !== item) {\n continue;\n }\n\n // \uB9CC\uB8CC \uCF5C\uBC31 \uC2E4\uD589\n if (this._options.onExpire != null) {\n try {\n await this._options.onExpire(key, item.value);\n } catch (err) {\n LazyGcMap._logger.error(\"onExpire \uCF5C\uBC31 \uC5D0\uB7EC\", err);\n }\n }\n\n // \uCF5C\uBC31 \uD6C4 \uC7AC\uB4F1\uB85D \uC5EC\uBD80 \uD655\uC778\n // \uC2DC\uB098\uB9AC\uC624: onExpire \uCF5C\uBC31\uC5D0\uC11C \uB3D9\uC77C \uD0A4\uB85C \uC0C8 \uAC12\uC744 set()\uD55C \uACBD\uC6B0,\n // \uC0C8\uB85C \uB4F1\uB85D\uB41C \uD56D\uBAA9\uC744 \uC0AD\uC81C\uD558\uBA74 \uC548 \uB428. item \uCC38\uC870\uAC00 \uAC19\uC73C\uBA74 \uC7AC\uB4F1\uB85D\uB418\uC9C0 \uC54A\uC740 \uAC83\uC774\uBBC0\uB85C \uC0AD\uC81C \uC9C4\uD589.\n const afterItem = this._map.get(key);\n if (afterItem === item) {\n this._map.delete(key);\n }\n }\n\n // GC \uD6C4 \uBE44\uC5C8\uC73C\uBA74 \uB044\uAE30\n if (this._map.size === 0) {\n this._stopGc();\n }\n } finally {\n this._isGcRunning = false;\n }\n }\n\n private _stopGc(): void {\n if (this._gcTimer != null) {\n clearInterval(this._gcTimer);\n this._gcTimer = undefined;\n }\n }\n\n //#endregion\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import consola from \"consola\";\n\n/**\n * \uC790\uB3D9 \uB9CC\uB8CC \uAE30\uB2A5\uC774 \uC788\uB294 Map\n * LRU \uBC29\uC2DD\uC73C\uB85C \uC811\uADFC \uC2DC\uAC04 \uAC31\uC2E0, \uC77C\uC815 \uC2DC\uAC04 \uBBF8\uC811\uADFC \uC2DC \uC790\uB3D9 \uC0AD\uC81C\n *\n * @note \uC778\uC2A4\uD134\uC2A4 \uC0AC\uC6A9 \uD6C4 \uBC18\uB4DC\uC2DC dispose()\uB97C \uD638\uCD9C\uD558\uAC70\uB098 using \uBB38\uC744 \uC0AC\uC6A9\uD574\uC57C \uD568.\n * \uADF8\uB807\uC9C0 \uC54A\uC73C\uBA74 GC \uD0C0\uC774\uBA38\uAC00 \uACC4\uC18D \uB3D9\uC791\uD558\uC5EC \uBA54\uBAA8\uB9AC \uB204\uC218 \uBC1C\uC0DD.\n *\n * @example\n * // using \uBB38 \uC0AC\uC6A9 (\uAD8C\uC7A5)\n * using map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });\n *\n * // \uB610\uB294 \uBA85\uC2DC\uC801 dispose() \uD638\uCD9C\n * const map = new LazyGcMap({ gcInterval: 10000, expireTime: 60000 });\n * try {\n * // ... \uC0AC\uC6A9\n * } finally {\n * map.dispose();\n * }\n */\nexport class LazyGcMap<K, V> {\n private static readonly _logger = consola.withTag(\"LazyGcMap\");\n\n /**\n * dispose() \uBBF8\uD638\uCD9C \uAC10\uC9C0\uC6A9 registry\n * @note FinalizationRegistry\uB294 Chrome 84+, Node 14.6+ \uC9C0\uC6D0\n * \uBBF8\uC9C0\uC6D0 \uD658\uACBD\uC5D0\uC11C\uB294 \uACBD\uACE0 \uC5C6\uC774 \uB3D9\uC791\uD558\uC9C0\uB9CC, dispose() \uBBF8\uD638\uCD9C \uC2DC \uBA54\uBAA8\uB9AC \uB204\uC218 \uAC00\uB2A5\n */\n private static readonly _registry =\n typeof FinalizationRegistry !== \"undefined\"\n ? new FinalizationRegistry<string>((id) => {\n LazyGcMap._logger.warn(`LazyGcMap(${id})\uC774 dispose() \uC5C6\uC774 \uAC00\uBE44\uC9C0 \uC218\uC9D1\uB428. \uBA54\uBAA8\uB9AC \uB204\uC218 \uAC00\uB2A5\uC131 \uC788\uC74C.`);\n })\n : undefined;\n\n // \uC2E4\uC81C \uB370\uC774\uD130\uC640 \uB9C8\uC9C0\uB9C9 \uC811\uADFC \uC2DC\uAC04\uC744 \uD568\uAED8 \uC800\uC7A5\n private readonly _map = new Map<K, { value: V; lastAccess: number }>();\n\n // GC \uD0C0\uC774\uBA38\n private _gcTimer?: ReturnType<typeof setInterval>;\n // GC \uC2E4\uD589 \uC911 \uD50C\uB798\uADF8 (\uC911\uBCF5 \uC2E4\uD589 \uBC29\uC9C0)\n private _isGcRunning = false;\n // destroy \uD638\uCD9C \uC5EC\uBD80\n private _isDestroyed = false;\n // \uC778\uC2A4\uD134\uC2A4 \uC2DD\uBCC4\uC790 (\uACBD\uACE0 \uBA54\uC2DC\uC9C0\uC6A9)\n private readonly _instanceId = Math.random().toString(36).slice(2);\n\n /**\n * @param _options \uC124\uC815 \uC635\uC158\n * @param _options.gcInterval GC \uC8FC\uAE30 (\uBC00\uB9AC\uCD08). \uAE30\uBCF8\uAC12: expireTime\uC758 1/10 (\uCD5C\uC18C 1000ms)\n * @param _options.expireTime \uB9CC\uB8CC \uC2DC\uAC04 (\uBC00\uB9AC\uCD08). \uB9C8\uC9C0\uB9C9 \uC811\uADFC \uD6C4 \uC774 \uC2DC\uAC04\uC774 \uC9C0\uB098\uBA74 \uC0AD\uC81C\uB428. \uC608: 60000 (60\uCD08)\n * @param _options.onExpire \uB9CC\uB8CC \uC2DC \uD638\uCD9C\uB418\uB294 \uCF5C\uBC31. \uBE44\uB3D9\uAE30 \uD568\uC218\uB3C4 \uAC00\uB2A5\uD558\uBA70, \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC \uB85C\uAE45 \uD6C4 \uACC4\uC18D \uC9C4\uD589\uB428\n */\n constructor(\n private readonly _options: {\n gcInterval?: number;\n expireTime: number;\n onExpire?: (key: K, value: V) => void | Promise<void>;\n },\n ) {\n LazyGcMap._registry?.register(this, this._instanceId);\n }\n\n /** \uC800\uC7A5\uB41C \uD56D\uBAA9 \uC218 */\n get size(): number {\n return this._map.size;\n }\n\n /** \uD0A4 \uC874\uC7AC \uC5EC\uBD80 \uD655\uC778 (\uC811\uADFC \uC2DC\uAC04 \uAC31\uC2E0 \uC548\uD568) */\n has(key: K): boolean {\n if (this._isDestroyed) return false;\n return this._map.has(key);\n }\n\n /** \uAC12 \uC870\uD68C (\uC811\uADFC \uC2DC\uAC04 \uAC31\uC2E0\uB428) */\n get(key: K): V | undefined {\n if (this._isDestroyed) return undefined;\n const item = this._map.get(key);\n if (item == null) return undefined;\n\n // \uC811\uADFC \uC2DC \uC2DC\uAC04 \uAC31\uC2E0 (LRU)\n item.lastAccess = Date.now();\n return item.value;\n }\n\n /** \uAC12 \uC800\uC7A5 (\uC811\uADFC \uC2DC\uAC04 \uC124\uC815 \uBC0F GC \uD0C0\uC774\uBA38 \uC2DC\uC791) */\n set(key: K, value: V): void {\n if (this._isDestroyed) return;\n this._map.set(key, { value, lastAccess: Date.now() });\n // \uB370\uC774\uD130\uAC00 \uB4E4\uC5B4\uC654\uC73C\uBBC0\uB85C GC \uD0C0\uC774\uBA38 \uAC00\uB3D9\n this._startGc();\n }\n\n /** \uD56D\uBAA9 \uC0AD\uC81C (\uBE44\uC5C8\uC73C\uBA74 GC \uD0C0\uC774\uBA38 \uC911\uC9C0) */\n delete(key: K): boolean {\n if (this._isDestroyed) return false;\n const result = this._map.delete(key);\n // \uBE44\uC5C8\uC73C\uBA74 \uD0C0\uC774\uBA38 \uC911\uC9C0\n if (this._map.size === 0) {\n this._stopGc();\n }\n return result;\n }\n\n /** \uC778\uC2A4\uD134\uC2A4 \uC815\uB9AC (GC \uD0C0\uC774\uBA38 \uC911\uC9C0 \uBC0F \uB370\uC774\uD130 \uC0AD\uC81C) */\n dispose(): void {\n if (this._isDestroyed) return;\n this._isDestroyed = true;\n LazyGcMap._registry?.unregister(this);\n\n this._map.clear();\n this._stopGc();\n }\n\n /** using \uBB38 \uC9C0\uC6D0 */\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n /**\n * \uBAA8\uB4E0 \uD56D\uBAA9 \uC0AD\uC81C (\uC778\uC2A4\uD134\uC2A4\uB294 \uACC4\uC18D \uC0AC\uC6A9 \uAC00\uB2A5)\n */\n clear(): void {\n if (this._isDestroyed) return;\n this._map.clear();\n this._stopGc();\n }\n\n /**\n * \uD0A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uAC12\uC744 \uBC18\uD658\uD558\uACE0, \uC5C6\uC73C\uBA74 factory\uB85C \uC0DD\uC131 \uD6C4 \uC800\uC7A5\uD558\uC5EC \uBC18\uD658\n * @param key \uC870\uD68C\uD560 \uD0A4\n * @param factory \uD0A4\uAC00 \uC5C6\uC744 \uB54C \uAC12\uC744 \uC0DD\uC131\uD558\uB294 \uD568\uC218\n * @returns \uAE30\uC874 \uAC12 \uB610\uB294 \uC0C8\uB85C \uC0DD\uC131\uB41C \uAC12\n */\n getOrCreate(key: K, factory: () => V): V {\n if (this._isDestroyed) {\n throw new Error(\"LazyGcMap\uC774 \uC774\uBBF8 dispose\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\");\n }\n const item = this._map.get(key);\n if (item == null) {\n const value = factory();\n this.set(key, value);\n return value;\n }\n\n item.lastAccess = Date.now();\n return item.value;\n }\n\n /** \uAC12\uB4E4\uB9CC \uC21C\uD68C (Iterator) */\n *values(): IterableIterator<V> {\n if (this._isDestroyed) return;\n for (const item of this._map.values()) {\n yield item.value;\n }\n }\n\n /** \uD0A4\uB4E4\uB9CC \uC21C\uD68C (Iterator) */\n *keys(): IterableIterator<K> {\n if (this._isDestroyed) return;\n yield* this._map.keys();\n }\n\n /** \uC5D4\uD2B8\uB9AC \uC21C\uD68C (Iterator) */\n *entries(): IterableIterator<[K, V]> {\n if (this._isDestroyed) return;\n for (const [key, item] of this._map.entries()) {\n yield [key, item.value];\n }\n }\n\n //#region GC \uB85C\uC9C1\n\n private _startGc(): void {\n if (this._isDestroyed) return;\n if (this._gcTimer != null) return;\n\n const interval = this._options.gcInterval ?? Math.max(this._options.expireTime / 10, 1000);\n this._gcTimer = setInterval(() => {\n void this._runGc();\n }, interval);\n }\n\n private async _runGc(): Promise<void> {\n // \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBA74 \uC2A4\uD0B5 (onExpire \uCF5C\uBC31\uC774 \uC624\uB798 \uAC78\uB9AC\uB294 \uACBD\uC6B0 \uC911\uBCF5 \uC2E4\uD589 \uBC29\uC9C0)\n if (this._isGcRunning) return;\n this._isGcRunning = true;\n\n try {\n const now = Date.now();\n\n // 1. \uB9CC\uB8CC\uB41C \uD56D\uBAA9 \uC218\uC9D1 (\uC0AD\uC81C \uC804)\n const expiredEntries: { key: K; item: { value: V; lastAccess: number } }[] = [];\n for (const [key, item] of this._map) {\n if (now - item.lastAccess > this._options.expireTime) {\n expiredEntries.push({ key, item });\n }\n }\n\n // 2. \uAC01 \uD56D\uBAA9\uC5D0 \uB300\uD574 \uCF5C\uBC31 \uC2E4\uD589 \uD6C4 \uC0AD\uC81C\n for (const { key, item } of expiredEntries) {\n // \uCF5C\uBC31 \uC2E4\uD589 \uC804 \uD604\uC7AC \uC0C1\uD0DC \uD655\uC778 (\uC774\uBBF8 \uB2E4\uB978 \uAC12\uC73C\uB85C \uAD50\uCCB4\uB418\uC5C8\uAC70\uB098 \uC0AD\uC81C\uB418\uC5C8\uC73C\uBA74 \uC2A4\uD0B5)\n const currentItem = this._map.get(key);\n if (currentItem !== item) {\n continue;\n }\n\n // \uB9CC\uB8CC \uCF5C\uBC31 \uC2E4\uD589\n if (this._options.onExpire != null) {\n try {\n await this._options.onExpire(key, item.value);\n } catch (err) {\n LazyGcMap._logger.error(\"onExpire \uCF5C\uBC31 \uC5D0\uB7EC\", err);\n }\n }\n\n // \uCF5C\uBC31 \uD6C4 \uC7AC\uB4F1\uB85D \uC5EC\uBD80 \uD655\uC778\n // \uC2DC\uB098\uB9AC\uC624: onExpire \uCF5C\uBC31\uC5D0\uC11C \uB3D9\uC77C \uD0A4\uB85C \uC0C8 \uAC12\uC744 set()\uD55C \uACBD\uC6B0,\n // \uC0C8\uB85C \uB4F1\uB85D\uB41C \uD56D\uBAA9\uC744 \uC0AD\uC81C\uD558\uBA74 \uC548 \uB428. item \uCC38\uC870\uAC00 \uAC19\uC73C\uBA74 \uC7AC\uB4F1\uB85D\uB418\uC9C0 \uC54A\uC740 \uAC83\uC774\uBBC0\uB85C \uC0AD\uC81C \uC9C4\uD589.\n const afterItem = this._map.get(key);\n if (afterItem === item) {\n this._map.delete(key);\n }\n }\n\n // GC \uD6C4 \uBE44\uC5C8\uC73C\uBA74 \uB044\uAE30\n if (this._map.size === 0) {\n this._stopGc();\n }\n } finally {\n this._isGcRunning = false;\n }\n }\n\n private _stopGc(): void {\n if (this._gcTimer != null) {\n clearInterval(this._gcTimer);\n this._gcTimer = undefined;\n }\n }\n\n //#endregion\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
- import { ArgumentError } from "../errors/argument-error";
2
- import { convert12To24, formatDate } from "../utils/date-format";
1
+ import { ArgumentError } from "../errors/argument-error.js";
2
+ import { convert12To24, formatDate } from "../utils/date-format.js";
3
3
  class Time {
4
4
  static MS_PER_DAY = 24 * 60 * 60 * 1e3;
5
5
  _tick;
@@ -1,4 +1,4 @@
1
- import { ArgumentError } from "../errors/argument-error";
1
+ import { ArgumentError } from "../errors/argument-error.js";
2
2
  class Uuid {
3
3
  // 0x00 ~ 0xFF에 대한 hex 문자열 미리 계산 (256개)
4
4
  static _hexTable = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0"));
@@ -1,4 +1,4 @@
1
- import { ArgumentError } from "../errors/argument-error";
1
+ import { ArgumentError } from "../errors/argument-error.js";
2
2
  const hexTable = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0"));
3
3
  const BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
4
4
  const BASE64_LOOKUP = Array.from({ length: 256 }, (_, i) => {
@@ -1,11 +1,11 @@
1
- import { DateTime } from "../types/date-time";
2
- import { DateOnly } from "../types/date-only";
3
- import { Time } from "../types/time";
4
- import { Uuid } from "../types/uuid";
5
- import { objNullToUndefined } from "./obj";
6
- import { SdError } from "../errors/sd-error";
7
- import { bytesToHex, bytesFromHex } from "./bytes";
8
- import { env } from "../env";
1
+ import { DateTime } from "../types/date-time.js";
2
+ import { DateOnly } from "../types/date-only.js";
3
+ import { Time } from "../types/time.js";
4
+ import { Uuid } from "../types/uuid.js";
5
+ import { objNullToUndefined } from "./obj.js";
6
+ import { SdError } from "../errors/sd-error.js";
7
+ import { bytesToHex, bytesFromHex } from "./bytes.js";
8
+ import { env } from "../env.js";
9
9
  function jsonStringify(obj, options) {
10
10
  const seen = /* @__PURE__ */ new WeakSet();
11
11
  const convertSpecialTypes = (key, value) => {
package/dist/utils/obj.js CHANGED
@@ -1,8 +1,8 @@
1
- import { DateTime } from "../types/date-time";
2
- import { DateOnly } from "../types/date-only";
3
- import { Time } from "../types/time";
4
- import { Uuid } from "../types/uuid";
5
- import { ArgumentError } from "../errors/argument-error";
1
+ import { DateTime } from "../types/date-time.js";
2
+ import { DateOnly } from "../types/date-only.js";
3
+ import { Time } from "../types/time.js";
4
+ import { Uuid } from "../types/uuid.js";
5
+ import { ArgumentError } from "../errors/argument-error.js";
6
6
  function objClone(source) {
7
7
  return objCloneImpl(source);
8
8
  }
@@ -1,8 +1,8 @@
1
- import { DateTime } from "../types/date-time";
2
- import { DateOnly } from "../types/date-only";
3
- import { Time } from "../types/time";
4
- import { Uuid } from "../types/uuid";
5
- import { ArgumentError } from "../errors/argument-error";
1
+ import { DateTime } from "../types/date-time.js";
2
+ import { DateOnly } from "../types/date-only.js";
3
+ import { Time } from "../types/time.js";
4
+ import { Uuid } from "../types/uuid.js";
5
+ import { ArgumentError } from "../errors/argument-error.js";
6
6
  function getPrimitiveTypeStr(value) {
7
7
  if (typeof value === "string") return "string";
8
8
  if (typeof value === "number") return "number";
@@ -1,7 +1,7 @@
1
- import { DateTime } from "../types/date-time";
2
- import { DateOnly } from "../types/date-only";
3
- import { Time } from "../types/time";
4
- import { Uuid } from "../types/uuid";
1
+ import { DateTime } from "../types/date-time.js";
2
+ import { DateOnly } from "../types/date-only.js";
3
+ import { Time } from "../types/time.js";
4
+ import { Uuid } from "../types/uuid.js";
5
5
  function transferableEncode(obj) {
6
6
  const transferList = [];
7
7
  const ancestors = /* @__PURE__ */ new Set();
@@ -1,4 +1,4 @@
1
- import { TimeoutError } from "../errors/timeout-error";
1
+ import { TimeoutError } from "../errors/timeout-error.js";
2
2
  async function waitUntil(forwarder, milliseconds, maxCount) {
3
3
  let count = 0;
4
4
  while (!await forwarder()) {