@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.
- package/README.md +86 -92
- package/dist/common.types.d.ts +14 -14
- package/dist/common.types.js +2 -1
- package/dist/common.types.js.map +1 -6
- package/dist/env.d.ts +8 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +13 -9
- package/dist/env.js.map +1 -6
- package/dist/errors/argument-error.d.ts +10 -10
- package/dist/errors/argument-error.d.ts.map +1 -1
- package/dist/errors/argument-error.js +31 -14
- package/dist/errors/argument-error.js.map +1 -6
- package/dist/errors/not-implemented-error.d.ts +8 -8
- package/dist/errors/not-implemented-error.js +30 -12
- package/dist/errors/not-implemented-error.js.map +1 -6
- package/dist/errors/sd-error.d.ts +10 -10
- package/dist/errors/sd-error.d.ts.map +1 -1
- package/dist/errors/sd-error.js +45 -24
- package/dist/errors/sd-error.js.map +1 -6
- package/dist/errors/timeout-error.d.ts +10 -10
- package/dist/errors/timeout-error.js +34 -15
- package/dist/errors/timeout-error.js.map +1 -6
- package/dist/extensions/arr-ext.d.ts +2 -2
- package/dist/extensions/arr-ext.helpers.d.ts +10 -10
- package/dist/extensions/arr-ext.helpers.js +112 -89
- package/dist/extensions/arr-ext.helpers.js.map +1 -6
- package/dist/extensions/arr-ext.js +458 -422
- package/dist/extensions/arr-ext.js.map +1 -6
- package/dist/extensions/arr-ext.types.d.ts +57 -57
- package/dist/extensions/arr-ext.types.d.ts.map +1 -1
- package/dist/extensions/arr-ext.types.js +6 -1
- package/dist/extensions/arr-ext.types.js.map +1 -6
- package/dist/extensions/map-ext.d.ts +16 -16
- package/dist/extensions/map-ext.js +27 -22
- package/dist/extensions/map-ext.js.map +1 -6
- package/dist/extensions/set-ext.d.ts +11 -11
- package/dist/extensions/set-ext.js +32 -25
- package/dist/extensions/set-ext.js.map +1 -6
- package/dist/features/debounce-queue.d.ts +17 -17
- package/dist/features/debounce-queue.js +98 -70
- package/dist/features/debounce-queue.js.map +1 -6
- package/dist/features/event-emitter.d.ts +20 -20
- package/dist/features/event-emitter.js +101 -78
- package/dist/features/event-emitter.js.map +1 -6
- package/dist/features/serial-queue.d.ts +11 -11
- package/dist/features/serial-queue.js +78 -57
- package/dist/features/serial-queue.js.map +1 -6
- package/dist/globals.d.ts +4 -4
- package/dist/globals.js +9 -1
- package/dist/globals.js.map +1 -6
- package/dist/index.js +28 -27
- package/dist/index.js.map +1 -6
- package/dist/types/date-only.d.ts +64 -64
- package/dist/types/date-only.d.ts.map +1 -1
- package/dist/types/date-only.js +263 -252
- package/dist/types/date-only.js.map +1 -6
- package/dist/types/date-time.d.ts +36 -36
- package/dist/types/date-time.d.ts.map +1 -1
- package/dist/types/date-time.js +196 -288
- package/dist/types/date-time.js.map +1 -6
- package/dist/types/lazy-gc-map.d.ts +26 -26
- package/dist/types/lazy-gc-map.d.ts.map +1 -1
- package/dist/types/lazy-gc-map.js +202 -159
- package/dist/types/lazy-gc-map.js.map +1 -6
- package/dist/types/time.d.ts +23 -23
- package/dist/types/time.d.ts.map +1 -1
- package/dist/types/time.js +169 -158
- package/dist/types/time.js.map +1 -6
- package/dist/types/uuid.d.ts +11 -11
- package/dist/types/uuid.d.ts.map +1 -1
- package/dist/types/uuid.js +95 -70
- package/dist/types/uuid.js.map +1 -6
- package/dist/utils/bytes.d.ts +17 -17
- package/dist/utils/bytes.js +137 -81
- package/dist/utils/bytes.js.map +1 -6
- package/dist/utils/date-format.d.ts +40 -40
- package/dist/utils/date-format.js +187 -101
- package/dist/utils/date-format.js.map +1 -6
- package/dist/utils/error.d.ts +4 -4
- package/dist/utils/error.js +11 -6
- package/dist/utils/error.js.map +1 -6
- package/dist/utils/json.d.ts +19 -19
- package/dist/utils/json.js +187 -135
- package/dist/utils/json.js.map +1 -6
- package/dist/utils/num.d.ts +20 -20
- package/dist/utils/num.js +76 -34
- package/dist/utils/num.js.map +1 -6
- package/dist/utils/obj.d.ts +111 -111
- package/dist/utils/obj.d.ts.map +1 -1
- package/dist/utils/obj.js +706 -496
- package/dist/utils/obj.js.map +1 -6
- package/dist/utils/path.d.ts +10 -10
- package/dist/utils/path.js +35 -18
- package/dist/utils/path.js.map +1 -6
- package/dist/utils/primitive.d.ts +5 -5
- package/dist/utils/primitive.js +34 -14
- package/dist/utils/primitive.js.map +1 -6
- package/dist/utils/str.d.ts +38 -38
- package/dist/utils/str.js +217 -113
- package/dist/utils/str.js.map +1 -6
- package/dist/utils/template-strings.d.ts +26 -26
- package/dist/utils/template-strings.js +113 -40
- package/dist/utils/template-strings.js.map +1 -6
- package/dist/utils/transferable.d.ts +18 -18
- package/dist/utils/transferable.js +218 -151
- package/dist/utils/transferable.js.map +1 -6
- package/dist/utils/wait.d.ts +9 -9
- package/dist/utils/wait.js +30 -15
- package/dist/utils/wait.js.map +1 -6
- package/dist/utils/xml.d.ts +13 -13
- package/dist/utils/xml.js +84 -46
- package/dist/utils/xml.js.map +1 -6
- package/dist/utils/zip.d.ts +22 -22
- package/dist/utils/zip.js +172 -148
- package/dist/utils/zip.js.map +1 -6
- package/docs/array-extensions.md +430 -0
- package/docs/env.md +52 -0
- package/docs/errors.md +41 -56
- package/docs/features.md +82 -97
- package/docs/type-utilities.md +91 -0
- package/docs/types.md +221 -201
- package/docs/utils.md +319 -435
- package/package.json +7 -5
- package/src/common.types.ts +14 -14
- package/src/env.ts +12 -3
- package/src/errors/argument-error.ts +15 -15
- package/src/errors/not-implemented-error.ts +9 -9
- package/src/errors/sd-error.ts +12 -12
- package/src/errors/timeout-error.ts +12 -12
- package/src/extensions/arr-ext.helpers.ts +16 -16
- package/src/extensions/arr-ext.ts +35 -35
- package/src/extensions/arr-ext.types.ts +57 -57
- package/src/extensions/map-ext.ts +16 -16
- package/src/extensions/set-ext.ts +11 -11
- package/src/features/debounce-queue.ts +23 -23
- package/src/features/event-emitter.ts +25 -25
- package/src/features/serial-queue.ts +13 -13
- package/src/globals.ts +4 -4
- package/src/index.ts +5 -5
- package/src/types/date-only.ts +84 -83
- package/src/types/date-time.ts +43 -42
- package/src/types/lazy-gc-map.ts +44 -44
- package/src/types/time.ts +29 -29
- package/src/types/uuid.ts +15 -15
- package/src/utils/bytes.ts +35 -35
- package/src/utils/date-format.ts +59 -59
- package/src/utils/error.ts +4 -4
- package/src/utils/json.ts +41 -41
- package/src/utils/num.ts +20 -20
- package/src/utils/obj.ts +138 -138
- package/src/utils/path.ts +10 -10
- package/src/utils/primitive.ts +6 -6
- package/src/utils/str.ts +48 -48
- package/src/utils/template-strings.ts +29 -29
- package/src/utils/transferable.ts +38 -38
- package/src/utils/wait.ts +10 -10
- package/src/utils/xml.ts +19 -19
- package/src/utils/zip.ts +25 -25
- package/docs/extensions.md +0 -387
- package/tests/errors/errors.spec.ts +0 -80
- package/tests/extensions/array-extension.spec.ts +0 -654
- package/tests/extensions/map-extension.spec.ts +0 -117
- package/tests/extensions/set-extension.spec.ts +0 -67
- package/tests/types/date-only.spec.ts +0 -533
- package/tests/types/date-time.spec.ts +0 -246
- package/tests/types/lazy-gc-map.spec.ts +0 -606
- package/tests/types/time.spec.ts +0 -428
- package/tests/types/uuid.spec.ts +0 -74
- package/tests/utils/bytes-utils.spec.ts +0 -197
- package/tests/utils/date-format.spec.ts +0 -350
- package/tests/utils/debounce-queue.spec.ts +0 -226
- package/tests/utils/json.spec.ts +0 -400
- package/tests/utils/number.spec.ts +0 -136
- package/tests/utils/object.spec.ts +0 -810
- package/tests/utils/path.spec.ts +0 -70
- package/tests/utils/primitive.spec.ts +0 -43
- package/tests/utils/sd-event-emitter.spec.ts +0 -189
- package/tests/utils/serial-queue.spec.ts +0 -305
- package/tests/utils/string.spec.ts +0 -265
- package/tests/utils/template-strings.spec.ts +0 -48
- package/tests/utils/transferable.spec.ts +0 -639
- package/tests/utils/wait.spec.ts +0 -123
- package/tests/utils/xml.spec.ts +0 -146
- 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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
45
|
-
}
|
|
46
|
-
return obj;
|
|
87
|
+
return obj;
|
|
47
88
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
stringify
|
|
51
|
-
};
|
|
52
|
-
//# sourceMappingURL=xml.js.map
|
|
89
|
+
//#endregion
|
|
90
|
+
//# sourceMappingURL=xml.js.map
|
package/dist/utils/xml.js.map
CHANGED
|
@@ -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"}
|
package/dist/utils/zip.d.ts
CHANGED
|
@@ -5,25 +5,25 @@ export interface ZipArchiveProgress {
|
|
|
5
5
|
extractedSize: number;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
|
-
* ZIP
|
|
8
|
+
* ZIP 아카이브 처리 클래스
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* ZIP 파일의 읽기, 쓰기, 압축, 해제를 처리.
|
|
11
|
+
* 동일 파일의 중복 해제를 방지하기 위해 내부 캐싱 사용.
|
|
12
12
|
*
|
|
13
13
|
* @example
|
|
14
|
-
* //
|
|
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
|
-
* //
|
|
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
|
-
* //
|
|
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
|
-
*
|
|
38
|
-
* @param data ZIP
|
|
37
|
+
* ZipArchive 생성
|
|
38
|
+
* @param data ZIP 데이터 (생략하면 새 아카이브 생성)
|
|
39
39
|
*/
|
|
40
40
|
constructor(data?: Blob | Bytes);
|
|
41
41
|
private _getEntries;
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
44
|
-
* @param progressCallback
|
|
43
|
+
* 모든 파일 추출
|
|
44
|
+
* @param progressCallback 진행률 콜백
|
|
45
45
|
*/
|
|
46
46
|
extractAll(progressCallback?: (progress: ZipArchiveProgress) => void): Promise<Map<string, Bytes | undefined>>;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
49
|
-
* @param fileName
|
|
48
|
+
* 특정 파일 추출
|
|
49
|
+
* @param fileName 파일 이름
|
|
50
50
|
*/
|
|
51
51
|
get(fileName: string): Promise<Bytes | undefined>;
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
54
|
-
* @param fileName
|
|
53
|
+
* 파일 존재 여부 확인
|
|
54
|
+
* @param fileName 파일 이름
|
|
55
55
|
*/
|
|
56
56
|
exists(fileName: string): Promise<boolean>;
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
59
|
-
* @param fileName
|
|
60
|
-
* @param bytes
|
|
58
|
+
* 파일 쓰기 (캐시에 저장)
|
|
59
|
+
* @param fileName 파일 이름
|
|
60
|
+
* @param bytes 파일 내용
|
|
61
61
|
*/
|
|
62
62
|
write(fileName: string, bytes: Bytes): void;
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
64
|
+
* 캐시된 파일을 ZIP으로 압축
|
|
65
65
|
*
|
|
66
66
|
* @remarks
|
|
67
|
-
*
|
|
68
|
-
*
|
|
67
|
+
* 내부적으로 `extractAll()`을 호출하여 모든 파일을 메모리에 로드한 후 압축.
|
|
68
|
+
* 대용량 ZIP 파일 처리 시 메모리 사용량에 주의.
|
|
69
69
|
*/
|
|
70
70
|
compress(): Promise<Bytes>;
|
|
71
71
|
/**
|
|
72
|
-
*
|
|
72
|
+
* 리더 닫기 및 캐시 비우기
|
|
73
73
|
*/
|
|
74
74
|
close(): Promise<void>;
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
167
|
+
//#endregion
|
|
168
|
+
//#region close
|
|
169
|
+
/**
|
|
170
|
+
* 리더 닫기 및 캐시 비우기
|
|
171
|
+
*/
|
|
172
|
+
async close() {
|
|
173
|
+
await this._reader?.close();
|
|
174
|
+
this._cache.clear();
|
|
105
175
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
157
|
-
ZipArchive
|
|
158
|
-
};
|
|
159
|
-
//# sourceMappingURL=zip.js.map
|
|
183
|
+
//# sourceMappingURL=zip.js.map
|
package/dist/utils/zip.js.map
CHANGED
|
@@ -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":"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"}
|