@simplysm/core-common 13.0.100 → 14.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +86 -92
  2. package/dist/common.types.d.ts +14 -14
  3. package/dist/common.types.js +2 -1
  4. package/dist/common.types.js.map +1 -6
  5. package/dist/env.d.ts +8 -1
  6. package/dist/env.d.ts.map +1 -1
  7. package/dist/env.js +13 -9
  8. package/dist/env.js.map +1 -6
  9. package/dist/errors/argument-error.d.ts +10 -10
  10. package/dist/errors/argument-error.d.ts.map +1 -1
  11. package/dist/errors/argument-error.js +31 -14
  12. package/dist/errors/argument-error.js.map +1 -6
  13. package/dist/errors/not-implemented-error.d.ts +8 -8
  14. package/dist/errors/not-implemented-error.js +30 -12
  15. package/dist/errors/not-implemented-error.js.map +1 -6
  16. package/dist/errors/sd-error.d.ts +10 -10
  17. package/dist/errors/sd-error.d.ts.map +1 -1
  18. package/dist/errors/sd-error.js +45 -24
  19. package/dist/errors/sd-error.js.map +1 -6
  20. package/dist/errors/timeout-error.d.ts +10 -10
  21. package/dist/errors/timeout-error.js +34 -15
  22. package/dist/errors/timeout-error.js.map +1 -6
  23. package/dist/extensions/arr-ext.d.ts +2 -2
  24. package/dist/extensions/arr-ext.helpers.d.ts +10 -10
  25. package/dist/extensions/arr-ext.helpers.js +112 -89
  26. package/dist/extensions/arr-ext.helpers.js.map +1 -6
  27. package/dist/extensions/arr-ext.js +458 -422
  28. package/dist/extensions/arr-ext.js.map +1 -6
  29. package/dist/extensions/arr-ext.types.d.ts +57 -57
  30. package/dist/extensions/arr-ext.types.d.ts.map +1 -1
  31. package/dist/extensions/arr-ext.types.js +6 -1
  32. package/dist/extensions/arr-ext.types.js.map +1 -6
  33. package/dist/extensions/map-ext.d.ts +16 -16
  34. package/dist/extensions/map-ext.js +27 -22
  35. package/dist/extensions/map-ext.js.map +1 -6
  36. package/dist/extensions/set-ext.d.ts +11 -11
  37. package/dist/extensions/set-ext.js +32 -25
  38. package/dist/extensions/set-ext.js.map +1 -6
  39. package/dist/features/debounce-queue.d.ts +17 -17
  40. package/dist/features/debounce-queue.js +98 -70
  41. package/dist/features/debounce-queue.js.map +1 -6
  42. package/dist/features/event-emitter.d.ts +20 -20
  43. package/dist/features/event-emitter.js +101 -78
  44. package/dist/features/event-emitter.js.map +1 -6
  45. package/dist/features/serial-queue.d.ts +11 -11
  46. package/dist/features/serial-queue.js +78 -57
  47. package/dist/features/serial-queue.js.map +1 -6
  48. package/dist/globals.d.ts +4 -4
  49. package/dist/globals.js +9 -1
  50. package/dist/globals.js.map +1 -6
  51. package/dist/index.js +28 -27
  52. package/dist/index.js.map +1 -6
  53. package/dist/types/date-only.d.ts +64 -64
  54. package/dist/types/date-only.d.ts.map +1 -1
  55. package/dist/types/date-only.js +263 -252
  56. package/dist/types/date-only.js.map +1 -6
  57. package/dist/types/date-time.d.ts +36 -36
  58. package/dist/types/date-time.d.ts.map +1 -1
  59. package/dist/types/date-time.js +196 -288
  60. package/dist/types/date-time.js.map +1 -6
  61. package/dist/types/lazy-gc-map.d.ts +26 -26
  62. package/dist/types/lazy-gc-map.d.ts.map +1 -1
  63. package/dist/types/lazy-gc-map.js +202 -159
  64. package/dist/types/lazy-gc-map.js.map +1 -6
  65. package/dist/types/time.d.ts +23 -23
  66. package/dist/types/time.d.ts.map +1 -1
  67. package/dist/types/time.js +169 -158
  68. package/dist/types/time.js.map +1 -6
  69. package/dist/types/uuid.d.ts +11 -11
  70. package/dist/types/uuid.d.ts.map +1 -1
  71. package/dist/types/uuid.js +95 -70
  72. package/dist/types/uuid.js.map +1 -6
  73. package/dist/utils/bytes.d.ts +17 -17
  74. package/dist/utils/bytes.js +137 -81
  75. package/dist/utils/bytes.js.map +1 -6
  76. package/dist/utils/date-format.d.ts +40 -40
  77. package/dist/utils/date-format.js +187 -101
  78. package/dist/utils/date-format.js.map +1 -6
  79. package/dist/utils/error.d.ts +4 -4
  80. package/dist/utils/error.js +11 -6
  81. package/dist/utils/error.js.map +1 -6
  82. package/dist/utils/json.d.ts +19 -19
  83. package/dist/utils/json.js +187 -135
  84. package/dist/utils/json.js.map +1 -6
  85. package/dist/utils/num.d.ts +20 -20
  86. package/dist/utils/num.js +76 -34
  87. package/dist/utils/num.js.map +1 -6
  88. package/dist/utils/obj.d.ts +111 -111
  89. package/dist/utils/obj.d.ts.map +1 -1
  90. package/dist/utils/obj.js +706 -496
  91. package/dist/utils/obj.js.map +1 -6
  92. package/dist/utils/path.d.ts +10 -10
  93. package/dist/utils/path.js +35 -18
  94. package/dist/utils/path.js.map +1 -6
  95. package/dist/utils/primitive.d.ts +5 -5
  96. package/dist/utils/primitive.js +34 -14
  97. package/dist/utils/primitive.js.map +1 -6
  98. package/dist/utils/str.d.ts +38 -38
  99. package/dist/utils/str.js +217 -113
  100. package/dist/utils/str.js.map +1 -6
  101. package/dist/utils/template-strings.d.ts +26 -26
  102. package/dist/utils/template-strings.js +113 -40
  103. package/dist/utils/template-strings.js.map +1 -6
  104. package/dist/utils/transferable.d.ts +18 -18
  105. package/dist/utils/transferable.js +218 -151
  106. package/dist/utils/transferable.js.map +1 -6
  107. package/dist/utils/wait.d.ts +9 -9
  108. package/dist/utils/wait.js +30 -15
  109. package/dist/utils/wait.js.map +1 -6
  110. package/dist/utils/xml.d.ts +13 -13
  111. package/dist/utils/xml.js +84 -46
  112. package/dist/utils/xml.js.map +1 -6
  113. package/dist/utils/zip.d.ts +22 -22
  114. package/dist/utils/zip.js +172 -148
  115. package/dist/utils/zip.js.map +1 -6
  116. package/docs/array-extensions.md +430 -0
  117. package/docs/env.md +52 -0
  118. package/docs/errors.md +41 -56
  119. package/docs/features.md +82 -97
  120. package/docs/type-utilities.md +91 -0
  121. package/docs/types.md +221 -201
  122. package/docs/utils.md +319 -435
  123. package/package.json +7 -5
  124. package/src/common.types.ts +14 -14
  125. package/src/env.ts +12 -3
  126. package/src/errors/argument-error.ts +15 -15
  127. package/src/errors/not-implemented-error.ts +9 -9
  128. package/src/errors/sd-error.ts +12 -12
  129. package/src/errors/timeout-error.ts +12 -12
  130. package/src/extensions/arr-ext.helpers.ts +16 -16
  131. package/src/extensions/arr-ext.ts +35 -35
  132. package/src/extensions/arr-ext.types.ts +57 -57
  133. package/src/extensions/map-ext.ts +16 -16
  134. package/src/extensions/set-ext.ts +11 -11
  135. package/src/features/debounce-queue.ts +23 -23
  136. package/src/features/event-emitter.ts +25 -25
  137. package/src/features/serial-queue.ts +13 -13
  138. package/src/globals.ts +4 -4
  139. package/src/index.ts +5 -5
  140. package/src/types/date-only.ts +84 -83
  141. package/src/types/date-time.ts +43 -42
  142. package/src/types/lazy-gc-map.ts +44 -44
  143. package/src/types/time.ts +29 -29
  144. package/src/types/uuid.ts +15 -15
  145. package/src/utils/bytes.ts +35 -35
  146. package/src/utils/date-format.ts +59 -59
  147. package/src/utils/error.ts +4 -4
  148. package/src/utils/json.ts +41 -41
  149. package/src/utils/num.ts +20 -20
  150. package/src/utils/obj.ts +138 -138
  151. package/src/utils/path.ts +10 -10
  152. package/src/utils/primitive.ts +6 -6
  153. package/src/utils/str.ts +48 -48
  154. package/src/utils/template-strings.ts +29 -29
  155. package/src/utils/transferable.ts +38 -38
  156. package/src/utils/wait.ts +10 -10
  157. package/src/utils/xml.ts +19 -19
  158. package/src/utils/zip.ts +25 -25
  159. package/docs/extensions.md +0 -387
  160. package/tests/errors/errors.spec.ts +0 -80
  161. package/tests/extensions/array-extension.spec.ts +0 -654
  162. package/tests/extensions/map-extension.spec.ts +0 -117
  163. package/tests/extensions/set-extension.spec.ts +0 -67
  164. package/tests/types/date-only.spec.ts +0 -533
  165. package/tests/types/date-time.spec.ts +0 -246
  166. package/tests/types/lazy-gc-map.spec.ts +0 -606
  167. package/tests/types/time.spec.ts +0 -428
  168. package/tests/types/uuid.spec.ts +0 -74
  169. package/tests/utils/bytes-utils.spec.ts +0 -197
  170. package/tests/utils/date-format.spec.ts +0 -350
  171. package/tests/utils/debounce-queue.spec.ts +0 -226
  172. package/tests/utils/json.spec.ts +0 -400
  173. package/tests/utils/number.spec.ts +0 -136
  174. package/tests/utils/object.spec.ts +0 -810
  175. package/tests/utils/path.spec.ts +0 -70
  176. package/tests/utils/primitive.spec.ts +0 -43
  177. package/tests/utils/sd-event-emitter.spec.ts +0 -189
  178. package/tests/utils/serial-queue.spec.ts +0 -305
  179. package/tests/utils/string.spec.ts +0 -265
  180. package/tests/utils/template-strings.spec.ts +0 -48
  181. package/tests/utils/transferable.spec.ts +0 -639
  182. package/tests/utils/wait.spec.ts +0 -123
  183. package/tests/utils/xml.spec.ts +0 -146
  184. package/tests/utils/zip.spec.ts +0 -221
package/dist/utils/xml.js CHANGED
@@ -1,52 +1,90 @@
1
1
  import { XMLBuilder, XMLParser } from "fast-xml-parser";
2
- function parse(str, options) {
3
- const result = new XMLParser({
4
- ignoreAttributes: false,
5
- attributeNamePrefix: "",
6
- attributesGroupName: "$",
7
- parseAttributeValue: false,
8
- parseTagValue: false,
9
- textNodeName: "_",
10
- htmlEntities: true,
11
- isArray: (_tagName, jPath, _isLeafNode, isAttribute) => {
12
- return !isAttribute && typeof jPath === "string" && jPath.split(".").length > 1;
13
- }
14
- }).parse(str);
15
- return (options == null ? void 0 : options.stripTagPrefix) ? stripTagPrefix(result) : result;
2
+ //#region parse
3
+ /**
4
+ * XML 문자열을 객체로 파싱
5
+ * @param str XML 문자열
6
+ * @param options 옵션
7
+ * @param options.stripTagPrefix 태그 접두사(네임스페이스) 제거 여부
8
+ * @returns 파싱된 객체. 구조:
9
+ * - 속성: `$` 객체에 그룹화
10
+ * - 텍스트 노드: `_` key에 저장
11
+ * - 자식 요소: array로 변환 (루트 요소 제외)
12
+ * @example
13
+ * xmlParse('<root id="1"><item>hello</item></root>');
14
+ * // { root: { $: { id: "1" }, item: [{ _: "hello" }] } }
15
+ */
16
+ export function parse(str, options) {
17
+ const result = new XMLParser({
18
+ ignoreAttributes: false,
19
+ attributeNamePrefix: "",
20
+ attributesGroupName: "$",
21
+ parseAttributeValue: false,
22
+ parseTagValue: false,
23
+ textNodeName: "_",
24
+ htmlEntities: true,
25
+ isArray: (_tagName, jPath, _isLeafNode, isAttribute) => {
26
+ return !isAttribute && typeof jPath === "string" && jPath.split(".").length > 1;
27
+ },
28
+ }).parse(str);
29
+ return options?.stripTagPrefix ? stripTagPrefix(result) : result;
16
30
  }
17
- function stringify(obj, options) {
18
- return new XMLBuilder({
19
- ignoreAttributes: false,
20
- attributeNamePrefix: "",
21
- attributesGroupName: "$",
22
- suppressBooleanAttributes: false,
23
- textNodeName: "_",
24
- ...options
25
- }).build(obj);
31
+ //#endregion
32
+ //#region stringify
33
+ /**
34
+ * 객체를 XML 문자열로 직렬화
35
+ * @param obj 직렬화할 객체
36
+ * @param options fast-xml-parser XmlBuilderOptions (선택사항)
37
+ * @returns XML 문자열
38
+ * @example
39
+ * xmlStringify({
40
+ * root: {
41
+ * $: { id: "1" },
42
+ * item: [{ _: "hello" }, { _: "world" }],
43
+ * },
44
+ * });
45
+ * // '<root id="1"><item>hello</item><item>world</item></root>'
46
+ */
47
+ export function stringify(obj, options) {
48
+ return new XMLBuilder({
49
+ ignoreAttributes: false,
50
+ attributeNamePrefix: "",
51
+ attributesGroupName: "$",
52
+ suppressBooleanAttributes: false,
53
+ textNodeName: "_",
54
+ ...options,
55
+ }).build(obj);
26
56
  }
57
+ //#endregion
58
+ //#region private
59
+ /**
60
+ * 태그 이름에서 네임스페이스 접두사 제거
61
+ * @note XML 파싱 결과에서 "ns:tag" 형식의 네임스페이스 접두사를 제거하여 태그 이름만 남김.
62
+ * 네임스페이스를 고려하지 않고 XML 데이터에 일관되게 접근 가능.
63
+ * 단, 속성은 접두사가 유지됨.
64
+ */
27
65
  function stripTagPrefix(obj) {
28
- if (Array.isArray(obj)) {
29
- return obj.map((item) => stripTagPrefix(item));
30
- }
31
- if (typeof obj === "object" && obj !== null) {
32
- const newObj = {};
33
- const record = obj;
34
- for (const key of Object.keys(record)) {
35
- const value = record[key];
36
- if (key === "$") {
37
- newObj[key] = value;
38
- } else {
39
- const colonIndex = key.indexOf(":");
40
- const cleanKey = colonIndex !== -1 ? key.slice(colonIndex + 1) : key;
41
- newObj[cleanKey] = stripTagPrefix(value);
42
- }
66
+ if (Array.isArray(obj)) {
67
+ return obj.map((item) => stripTagPrefix(item));
68
+ }
69
+ if (typeof obj === "object" && obj !== null) {
70
+ const newObj = {};
71
+ const record = obj;
72
+ for (const key of Object.keys(record)) {
73
+ const value = record[key];
74
+ // 속성은 접두사를 제거하면 안 됨
75
+ if (key === "$") {
76
+ newObj[key] = value;
77
+ }
78
+ else {
79
+ // 번째 ":"를 기준으로 태그 이름에서만 접두사 제거
80
+ const colonIndex = key.indexOf(":");
81
+ const cleanKey = colonIndex !== -1 ? key.slice(colonIndex + 1) : key;
82
+ newObj[cleanKey] = stripTagPrefix(value);
83
+ }
84
+ }
85
+ return newObj;
43
86
  }
44
- return newObj;
45
- }
46
- return obj;
87
+ return obj;
47
88
  }
48
- export {
49
- parse,
50
- stringify
51
- };
52
- //# sourceMappingURL=xml.js.map
89
+ //#endregion
90
+ //# sourceMappingURL=xml.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/xml.ts"],
4
- "mappings": "AAIA,SAAS,YAAY,iBAAiB;AAiB/B,SAAS,MAAM,KAAa,SAAiD;AAClF,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,cAAc;AAAA,IACd,SAAS,CAAC,UAAkB,OAAgB,aAAsB,gBAAyB;AACzF,aAAO,CAAC,eAAe,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,EAAE,SAAS;AAAA,IAChF;AAAA,EACF,CAAC,EAAE,MAAM,GAAG;AACZ,UAAO,mCAAS,kBAAiB,eAAe,MAAM,IAAI;AAC5D;AAoBO,SAAS,UAAU,KAAc,SAAqC;AAC3E,SAAO,IAAI,WAAW;AAAA,IACpB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,IAC3B,cAAc;AAAA,IACd,GAAG;AAAA,EACL,CAAC,EAAE,MAAM,GAAG;AACd;AAYA,SAAS,eAAe,KAAuB;AAC7C,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC;AAAA,EAC/C;AAEA,MAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,UAAM,SAAkC,CAAC;AACzC,UAAM,SAAS;AAEf,eAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,YAAM,QAAQ,OAAO,GAAG;AAGxB,UAAI,QAAQ,KAAK;AACf,eAAO,GAAG,IAAI;AAAA,MAChB,OAAO;AAEL,cAAM,aAAa,IAAI,QAAQ,GAAG;AAClC,cAAM,WAAW,eAAe,KAAK,IAAI,MAAM,aAAa,CAAC,IAAI;AACjE,eAAO,QAAQ,IAAI,eAAe,KAAK;AAAA,MACzC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/utils/xml.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,eAAe;AAEf;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,KAAK,CAAC,GAAW,EAAE,OAAsC;IACvE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,EAAE;QACvB,mBAAmB,EAAE,GAAG;QACxB,mBAAmB,EAAE,KAAK;QAC1B,aAAa,EAAE,KAAK;QACpB,YAAY,EAAE,GAAG;QACjB,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,CAAC,QAAgB,EAAE,KAAc,EAAE,WAAoB,EAAE,WAAoB,EAAE,EAAE;YACxF,OAAO,CAAC,WAAW,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAClF,CAAC;KACF,CAAC,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACzB,OAAO,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACnE,CAAC;AAED,YAAY;AAEZ,mBAAmB;AAEnB;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,OAA2B;IACjE,OAAO,IAAI,UAAU,CAAC;QACpB,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,EAAE;QACvB,mBAAmB,EAAE,GAAG;QACxB,yBAAyB,EAAE,KAAK;QAChC,YAAY,EAAE,GAAG;QACjB,GAAG,OAAO;KACX,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC;AAED,YAAY;AAEZ,iBAAiB;AAEjB;;;;;GAKG;AACH,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,GAA8B,CAAC;QAE9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,oBAAoB;YACpB,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACrE,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,YAAY"}
@@ -5,25 +5,25 @@ export interface ZipArchiveProgress {
5
5
  extractedSize: number;
6
6
  }
7
7
  /**
8
- * ZIP archive processing class
8
+ * ZIP 아카이브 처리 클래스
9
9
  *
10
- * Handles reading, writing, compression, and decompression of ZIP files.
11
- * Uses internal caching to prevent duplicate decompression of the same file.
10
+ * ZIP 파일의 읽기, 쓰기, 압축, 해제를 처리.
11
+ * 동일 파일의 중복 해제를 방지하기 위해 내부 캐싱 사용.
12
12
  *
13
13
  * @example
14
- * // Read ZIP file
14
+ * // ZIP 파일 읽기
15
15
  * await using archive = new ZipArchive(zipBytes);
16
16
  * const content = await archive.get("file.txt");
17
17
  *
18
18
  * @example
19
- * // Create ZIP file
19
+ * // ZIP 파일 생성
20
20
  * await using archive = new ZipArchive();
21
21
  * archive.write("file.txt", textBytes);
22
22
  * archive.write("data.json", jsonBytes);
23
23
  * const zipBytes = await archive.compress();
24
24
  *
25
25
  * @example
26
- * // Extract all files (with progress reporting)
26
+ * // 모든 파일 추출 (진행률 보고 포함)
27
27
  * await using archive = new ZipArchive(zipBytes);
28
28
  * const files = await archive.extractAll((progress) => {
29
29
  * console.log(`${progress.fileName}: ${progress.extractedSize}/${progress.totalSize}`);
@@ -34,46 +34,46 @@ export declare class ZipArchive {
34
34
  private readonly _cache;
35
35
  private _entries?;
36
36
  /**
37
- * Create ZipArchive
38
- * @param data ZIP data (omit to create a new archive)
37
+ * ZipArchive 생성
38
+ * @param data ZIP 데이터 (생략하면 아카이브 생성)
39
39
  */
40
40
  constructor(data?: Blob | Bytes);
41
41
  private _getEntries;
42
42
  /**
43
- * Extract all files
44
- * @param progressCallback Progress callback
43
+ * 모든 파일 추출
44
+ * @param progressCallback 진행률 콜백
45
45
  */
46
46
  extractAll(progressCallback?: (progress: ZipArchiveProgress) => void): Promise<Map<string, Bytes | undefined>>;
47
47
  /**
48
- * Extract specific file
49
- * @param fileName File name
48
+ * 특정 파일 추출
49
+ * @param fileName 파일 이름
50
50
  */
51
51
  get(fileName: string): Promise<Bytes | undefined>;
52
52
  /**
53
- * Check if file exists
54
- * @param fileName File name
53
+ * 파일 존재 여부 확인
54
+ * @param fileName 파일 이름
55
55
  */
56
56
  exists(fileName: string): Promise<boolean>;
57
57
  /**
58
- * Write file (store in cache)
59
- * @param fileName File name
60
- * @param bytes File content
58
+ * 파일 쓰기 (캐시에 저장)
59
+ * @param fileName 파일 이름
60
+ * @param bytes 파일 내용
61
61
  */
62
62
  write(fileName: string, bytes: Bytes): void;
63
63
  /**
64
- * Compress cached files to ZIP
64
+ * 캐시된 파일을 ZIP으로 압축
65
65
  *
66
66
  * @remarks
67
- * Internally calls `extractAll()` to load all files into memory before compressing.
68
- * Be mindful of memory usage when dealing with large ZIP files.
67
+ * 내부적으로 `extractAll()`을 호출하여 모든 파일을 메모리에 로드한 압축.
68
+ * 대용량 ZIP 파일 처리 메모리 사용량에 주의.
69
69
  */
70
70
  compress(): Promise<Bytes>;
71
71
  /**
72
- * Close reader and clear cache
72
+ * 리더 닫기 캐시 비우기
73
73
  */
74
74
  close(): Promise<void>;
75
75
  /**
76
- * Support for await using
76
+ * await using 지원
77
77
  */
78
78
  [Symbol.asyncDispose](): Promise<void>;
79
79
  }
package/dist/utils/zip.js CHANGED
@@ -1,159 +1,183 @@
1
- import {
2
- BlobReader,
3
- Uint8ArrayReader,
4
- Uint8ArrayWriter,
5
- ZipReader,
6
- ZipWriter
7
- } from "@zip.js/zip.js";
8
- class ZipArchive {
9
- _reader;
10
- _cache = /* @__PURE__ */ new Map();
11
- _entries;
12
- /**
13
- * Create ZipArchive
14
- * @param data ZIP data (omit to create a new archive)
15
- */
16
- constructor(data) {
17
- if (!data) return;
18
- if (data instanceof Uint8Array) {
19
- this._reader = new ZipReader(new Uint8ArrayReader(data));
20
- } else {
21
- this._reader = new ZipReader(new BlobReader(data));
1
+ import { BlobReader, Uint8ArrayReader, Uint8ArrayWriter, ZipReader, ZipWriter, } from "@zip.js/zip.js";
2
+ /**
3
+ * ZIP 아카이브 처리 클래스
4
+ *
5
+ * ZIP 파일의 읽기, 쓰기, 압축, 해제를 처리.
6
+ * 동일 파일의 중복 해제를 방지하기 위해 내부 캐싱 사용.
7
+ *
8
+ * @example
9
+ * // ZIP 파일 읽기
10
+ * await using archive = new ZipArchive(zipBytes);
11
+ * const content = await archive.get("file.txt");
12
+ *
13
+ * @example
14
+ * // ZIP 파일 생성
15
+ * await using archive = new ZipArchive();
16
+ * archive.write("file.txt", textBytes);
17
+ * archive.write("data.json", jsonBytes);
18
+ * const zipBytes = await archive.compress();
19
+ *
20
+ * @example
21
+ * // 모든 파일 추출 (진행률 보고 포함)
22
+ * await using archive = new ZipArchive(zipBytes);
23
+ * const files = await archive.extractAll((progress) => {
24
+ * console.log(`${progress.fileName}: ${progress.extractedSize}/${progress.totalSize}`);
25
+ * });
26
+ */
27
+ export class ZipArchive {
28
+ _reader;
29
+ _cache = new Map();
30
+ _entries;
31
+ /**
32
+ * ZipArchive 생성
33
+ * @param data ZIP 데이터 (생략하면 새 아카이브 생성)
34
+ */
35
+ constructor(data) {
36
+ if (!data)
37
+ return;
38
+ if (data instanceof Uint8Array) {
39
+ this._reader = new ZipReader(new Uint8ArrayReader(data));
40
+ }
41
+ else {
42
+ this._reader = new ZipReader(new BlobReader(data));
43
+ }
22
44
  }
23
- }
24
- async _getEntries() {
25
- if (this._entries == null && this._reader != null) {
26
- this._entries = await this._reader.getEntries();
45
+ async _getEntries() {
46
+ if (this._entries == null && this._reader != null) {
47
+ this._entries = await this._reader.getEntries();
48
+ }
49
+ return this._entries;
27
50
  }
28
- return this._entries;
29
- }
30
- //#region extractAll
31
- /**
32
- * Extract all files
33
- * @param progressCallback Progress callback
34
- */
35
- async extractAll(progressCallback) {
36
- const entries = await this._getEntries();
37
- if (entries == null) return this._cache;
38
- const totalSize = entries.filter((e) => !e.directory).reduce((acc, e) => acc + e.uncompressedSize, 0);
39
- let totalExtracted = 0;
40
- for (const entry of entries) {
41
- if (entry.directory) continue;
42
- progressCallback == null ? void 0 : progressCallback({
43
- fileName: entry.filename,
44
- totalSize,
45
- extractedSize: totalExtracted
46
- });
47
- const entryBytes = this._cache.get(entry.filename) ?? await entry.getData(new Uint8ArrayWriter(), {
48
- onprogress: (extracted) => {
49
- const currentTotal = totalExtracted + extracted;
50
- progressCallback == null ? void 0 : progressCallback({
51
- fileName: entry.filename,
52
- totalSize,
53
- extractedSize: currentTotal
54
- });
55
- return void 0;
51
+ //#region extractAll
52
+ /**
53
+ * 모든 파일 추출
54
+ * @param progressCallback 진행률 콜백
55
+ */
56
+ async extractAll(progressCallback) {
57
+ const entries = await this._getEntries();
58
+ if (entries == null)
59
+ return this._cache;
60
+ // 추출할 전체 크기 계산
61
+ const totalSize = entries
62
+ .filter((e) => !e.directory)
63
+ .reduce((acc, e) => acc + e.uncompressedSize, 0);
64
+ let totalExtracted = 0;
65
+ for (const entry of entries) {
66
+ if (entry.directory)
67
+ continue;
68
+ progressCallback?.({
69
+ fileName: entry.filename,
70
+ totalSize: totalSize,
71
+ extractedSize: totalExtracted,
72
+ });
73
+ const entryBytes = this._cache.get(entry.filename) ??
74
+ (await entry.getData(new Uint8ArrayWriter(), {
75
+ onprogress: (extracted) => {
76
+ const currentTotal = totalExtracted + extracted;
77
+ progressCallback?.({
78
+ fileName: entry.filename,
79
+ totalSize: totalSize,
80
+ extractedSize: currentTotal,
81
+ });
82
+ return undefined;
83
+ },
84
+ }));
85
+ this._cache.set(entry.filename, entryBytes);
86
+ // 개별 파일 완료 시 누적
87
+ totalExtracted += entry.uncompressedSize;
88
+ progressCallback?.({
89
+ fileName: entry.filename,
90
+ totalSize: totalSize,
91
+ extractedSize: totalExtracted,
92
+ });
56
93
  }
57
- });
58
- this._cache.set(entry.filename, entryBytes);
59
- totalExtracted += entry.uncompressedSize;
60
- progressCallback == null ? void 0 : progressCallback({
61
- fileName: entry.filename,
62
- totalSize,
63
- extractedSize: totalExtracted
64
- });
94
+ return this._cache;
65
95
  }
66
- return this._cache;
67
- }
68
- //#endregion
69
- //#region get
70
- /**
71
- * Extract specific file
72
- * @param fileName File name
73
- */
74
- async get(fileName) {
75
- if (this._cache.has(fileName)) {
76
- return this._cache.get(fileName);
96
+ //#endregion
97
+ //#region get
98
+ /**
99
+ * 특정 파일 추출
100
+ * @param fileName 파일 이름
101
+ */
102
+ async get(fileName) {
103
+ if (this._cache.has(fileName)) {
104
+ return this._cache.get(fileName);
105
+ }
106
+ const entries = await this._getEntries();
107
+ if (entries == null) {
108
+ this._cache.set(fileName, undefined);
109
+ return undefined;
110
+ }
111
+ const entry = entries.find((item) => item.filename === fileName);
112
+ if (!entry) {
113
+ this._cache.set(fileName, undefined);
114
+ return undefined;
115
+ }
116
+ const bytes = await entry.getData(new Uint8ArrayWriter());
117
+ this._cache.set(fileName, bytes);
118
+ return bytes;
77
119
  }
78
- const entries = await this._getEntries();
79
- if (entries == null) {
80
- this._cache.set(fileName, void 0);
81
- return void 0;
120
+ //#endregion
121
+ //#region exists
122
+ /**
123
+ * 파일 존재 여부 확인
124
+ * @param fileName 파일 이름
125
+ */
126
+ async exists(fileName) {
127
+ if (this._cache.has(fileName)) {
128
+ return this._cache.get(fileName) != null;
129
+ }
130
+ const entries = await this._getEntries();
131
+ if (entries == null) {
132
+ return false;
133
+ }
134
+ const entry = entries.find((item) => item.filename === fileName);
135
+ return entry !== undefined;
82
136
  }
83
- const entry = entries.find((item) => item.filename === fileName);
84
- if (!entry) {
85
- this._cache.set(fileName, void 0);
86
- return void 0;
137
+ //#endregion
138
+ //#region write
139
+ /**
140
+ * 파일 쓰기 (캐시에 저장)
141
+ * @param fileName 파일 이름
142
+ * @param bytes 파일 내용
143
+ */
144
+ write(fileName, bytes) {
145
+ this._cache.set(fileName, bytes);
87
146
  }
88
- const bytes = await entry.getData(new Uint8ArrayWriter());
89
- this._cache.set(fileName, bytes);
90
- return bytes;
91
- }
92
- //#endregion
93
- //#region exists
94
- /**
95
- * Check if file exists
96
- * @param fileName File name
97
- */
98
- async exists(fileName) {
99
- if (this._cache.has(fileName)) {
100
- return this._cache.get(fileName) != null;
147
+ //#endregion
148
+ //#region compress
149
+ /**
150
+ * 캐시된 파일을 ZIP으로 압축
151
+ *
152
+ * @remarks
153
+ * 내부적으로 `extractAll()`을 호출하여 모든 파일을 메모리에 로드한 후 압축.
154
+ * 대용량 ZIP 파일 처리 시 메모리 사용량에 주의.
155
+ */
156
+ async compress() {
157
+ const fileMap = await this.extractAll();
158
+ const writer = new ZipWriter(new Uint8ArrayWriter());
159
+ for (const key of fileMap.keys()) {
160
+ const fileBytes = fileMap.get(key);
161
+ if (!fileBytes)
162
+ continue;
163
+ await writer.add(key, new Uint8ArrayReader(fileBytes));
164
+ }
165
+ return writer.close();
101
166
  }
102
- const entries = await this._getEntries();
103
- if (entries == null) {
104
- return false;
167
+ //#endregion
168
+ //#region close
169
+ /**
170
+ * 리더 닫기 및 캐시 비우기
171
+ */
172
+ async close() {
173
+ await this._reader?.close();
174
+ this._cache.clear();
105
175
  }
106
- const entry = entries.find((item) => item.filename === fileName);
107
- return entry !== void 0;
108
- }
109
- //#endregion
110
- //#region write
111
- /**
112
- * Write file (store in cache)
113
- * @param fileName File name
114
- * @param bytes File content
115
- */
116
- write(fileName, bytes) {
117
- this._cache.set(fileName, bytes);
118
- }
119
- //#endregion
120
- //#region compress
121
- /**
122
- * Compress cached files to ZIP
123
- *
124
- * @remarks
125
- * Internally calls `extractAll()` to load all files into memory before compressing.
126
- * Be mindful of memory usage when dealing with large ZIP files.
127
- */
128
- async compress() {
129
- const fileMap = await this.extractAll();
130
- const writer = new ZipWriter(new Uint8ArrayWriter());
131
- for (const key of fileMap.keys()) {
132
- const fileBytes = fileMap.get(key);
133
- if (!fileBytes) continue;
134
- await writer.add(key, new Uint8ArrayReader(fileBytes));
176
+ /**
177
+ * await using 지원
178
+ */
179
+ async [Symbol.asyncDispose]() {
180
+ await this.close();
135
181
  }
136
- return writer.close();
137
- }
138
- //#endregion
139
- //#region close
140
- /**
141
- * Close reader and clear cache
142
- */
143
- async close() {
144
- var _a;
145
- await ((_a = this._reader) == null ? void 0 : _a.close());
146
- this._cache.clear();
147
- }
148
- /**
149
- * Support for await using
150
- */
151
- async [Symbol.asyncDispose]() {
152
- await this.close();
153
- }
154
- //#endregion
155
182
  }
156
- export {
157
- ZipArchive
158
- };
159
- //# sourceMappingURL=zip.js.map
183
+ //# sourceMappingURL=zip.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/zip.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/utils/zip.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,SAAS,GACV,MAAM,gBAAgB,CAAC;AASxB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,UAAU;IACJ,OAAO,CAA2B;IAClC,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IACvD,QAAQ,CAA8D;IAE9E;;;OAGG;IACH,YAAY,IAAmB;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,oBAAoB;IACpB;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,gBAAyD;QAEzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAExC,eAAe;QACf,MAAM,SAAS,GAAG,OAAO;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;aAC3B,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAEnD,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,SAAS;gBAAE,SAAS;YAE9B,gBAAgB,EAAE,CAAC;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,cAAc;aAC9B,CAAC,CAAC;YAEH,MAAM,UAAU,GACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC/B,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,gBAAgB,EAAE,EAAE;oBAC3C,UAAU,EAAE,CAAC,SAAS,EAAE,EAAE;wBACxB,MAAM,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;wBAEhD,gBAAgB,EAAE,CAAC;4BACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,SAAS,EAAE,SAAS;4BACpB,aAAa,EAAE,YAAY;yBAC5B,CAAC,CAAC;wBAEH,OAAO,SAAS,CAAC;oBACnB,CAAC;iBACF,CAAC,CAAC,CAAC;YAEN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE5C,gBAAgB;YAChB,cAAc,IAAI,KAAK,CAAC,gBAAgB,CAAC;YAEzC,gBAAgB,EAAE,CAAC;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,cAAc;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,YAAY;IAEZ,aAAa;IACb;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,QAAgB;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAA0B,CAAC;QAC1F,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,YAAY;IAEZ,gBAAgB;IAChB;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;QAC3C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAA0B,CAAC;QAC1F,OAAO,KAAK,KAAK,SAAS,CAAC;IAC7B,CAAC;IACD,YAAY;IAEZ,eAAe;IACf;;;;OAIG;IACH,KAAK,CAAC,QAAgB,EAAE,KAAY;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,YAAY;IAEZ,kBAAkB;IAClB;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;QAErD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,YAAY;IAEZ,eAAe;IACf;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CAEF"}