start zip stream before complete listing of files

Massimo Melina committed Dec 28, 2021 at 21:06 UTC fa999303b7793a64a8a4dd4935ecb5e07374a61c
6 files changed +575 -601
package-lock.json
+357 -589
@@ -10,7 +10,7 @@
10 "license": "GPL-3.0",
11 "dependencies": {
12 "@koa/router": "^10.1.1",
13 - "archiver": "^5.3.0",
13 + "@node-rs/crc32": "^1.3.1",
14 "fast-glob": "^3.2.7",
15 "koa": "^2.13.4",
16 "koa-better-http-proxy": "^0.2.9",
@@ -81,6 +81,228 @@
81 "node": ">= 8.0.0"
82 }
83 },
84 + "node_modules/@node-rs/crc32": {
85 + "version": "1.3.1",
86 + "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.3.1.tgz",
87 + "integrity": "sha512-I03vfT0P4ud5QDsWtGc5qcBhvUz2PiaMhOg/B6GjyPy+VRJW5KR74+ODM1CsVZBHM6d/+wKHgsjtSh4HMz1fYg==",
88 + "engines": {
89 + "node": ">= 10"
90 + },
91 + "funding": {
92 + "type": "github",
93 + "url": "https://github.com/sponsors/Brooooooklyn"
94 + },
95 + "optionalDependencies": {
96 + "@node-rs/crc32-android-arm-eabi": "1.3.1",
97 + "@node-rs/crc32-android-arm64": "1.3.1",
98 + "@node-rs/crc32-darwin-arm64": "1.3.1",
99 + "@node-rs/crc32-darwin-x64": "1.3.1",
100 + "@node-rs/crc32-freebsd-x64": "1.3.1",
101 + "@node-rs/crc32-linux-arm-gnueabihf": "1.3.1",
102 + "@node-rs/crc32-linux-arm64-gnu": "1.3.1",
103 + "@node-rs/crc32-linux-arm64-musl": "1.3.1",
104 + "@node-rs/crc32-linux-x64-gnu": "1.3.1",
105 + "@node-rs/crc32-linux-x64-musl": "1.3.1",
106 + "@node-rs/crc32-win32-arm64-msvc": "1.3.1",
107 + "@node-rs/crc32-win32-ia32-msvc": "1.3.1",
108 + "@node-rs/crc32-win32-x64-msvc": "1.3.1"
109 + }
110 + },
111 + "node_modules/@node-rs/crc32-android-arm-eabi": {
112 + "version": "1.3.1",
113 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.3.1.tgz",
114 + "integrity": "sha512-iNNHEFSOwuQ0AZHTOkbZNs2hbu3+7l+Zi1ZjqHKAZFTbd2uDPmYIWNqqxWegaKAwnvVKL9ciSDYYEEY4oF8ETg==",
115 + "cpu": [
116 + "arm"
117 + ],
118 + "optional": true,
119 + "os": [
120 + "android"
121 + ],
122 + "engines": {
123 + "node": ">= 10"
124 + }
125 + },
126 + "node_modules/@node-rs/crc32-android-arm64": {
127 + "version": "1.3.1",
128 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.3.1.tgz",
129 + "integrity": "sha512-r4DH1XHR2gVRv5kiNrHJU45X1KhDIwKFMKM9mw3xR36MUq34frQdUrovF+DgHKqfTBRS1y1WSL/x6tS6qYHZgQ==",
130 + "cpu": [
131 + "arm64"
132 + ],
133 + "optional": true,
134 + "os": [
135 + "android"
136 + ],
137 + "engines": {
138 + "node": ">= 10"
139 + }
140 + },
141 + "node_modules/@node-rs/crc32-darwin-arm64": {
142 + "version": "1.3.1",
143 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.3.1.tgz",
144 + "integrity": "sha512-3QYYAh7b+1DY2T1kdVDb8dP08OwI6MIrhWYsOb8jVBjXSB0we2phM6J092ml8l18TJNw2VLO2UgM1QvTxOaOMw==",
145 + "cpu": [
146 + "arm64"
147 + ],
148 + "optional": true,
149 + "os": [
150 + "darwin"
151 + ],
152 + "engines": {
153 + "node": ">= 10"
154 + }
155 + },
156 + "node_modules/@node-rs/crc32-darwin-x64": {
157 + "version": "1.3.1",
158 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.3.1.tgz",
159 + "integrity": "sha512-l7AKwVV6670T2SnDWUrXDHZxi5QX+XkS44P1wHzf+hDkgkl6Dm6ou47RH63Ebvdjl/jm4Z5Zk7XSef9aSotpwQ==",
160 + "cpu": [
161 + "x64"
162 + ],
163 + "optional": true,
164 + "os": [
165 + "darwin"
166 + ],
167 + "engines": {
168 + "node": ">= 10"
169 + }
170 + },
171 + "node_modules/@node-rs/crc32-freebsd-x64": {
172 + "version": "1.3.1",
173 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.3.1.tgz",
174 + "integrity": "sha512-PVoCqAZWouXYRtWBw72a16Eq1NJVOfUEA2giEAHMtpV/D5tN7mgdPsKDbeLPSRwqVA2jouDXuiyA8IIzl6Fm8w==",
175 + "cpu": [
176 + "x64"
177 + ],
178 + "optional": true,
179 + "os": [
180 + "freebsd"
181 + ],
182 + "engines": {
183 + "node": ">= 10"
184 + }
185 + },
186 + "node_modules/@node-rs/crc32-linux-arm-gnueabihf": {
187 + "version": "1.3.1",
188 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.3.1.tgz",
189 + "integrity": "sha512-iJhJS14FFdj3MIMLnfNcLQPstxlBDrItkZIYiMRzkw9DWpLjjLYH/uishC5Q2DB9NzR2hBdQeTcM/Ie1vKF0xw==",
190 + "cpu": [
191 + "arm"
192 + ],
193 + "optional": true,
194 + "os": [
195 + "linux"
196 + ],
197 + "engines": {
198 + "node": ">= 10"
199 + }
200 + },
201 + "node_modules/@node-rs/crc32-linux-arm64-gnu": {
202 + "version": "1.3.1",
203 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.3.1.tgz",
204 + "integrity": "sha512-K0m9QBkpzxbnTMfj7mpHx2YHB2Dbskf/AVA1AbWJXg5xySSb48nL5ZCqkeE+OkEzPrA9c6eu3MnEwZWodxpuSw==",
205 + "cpu": [
206 + "arm64"
207 + ],
208 + "optional": true,
209 + "os": [
210 + "linux"
211 + ],
212 + "engines": {
213 + "node": ">= 10"
214 + }
215 + },
216 + "node_modules/@node-rs/crc32-linux-arm64-musl": {
217 + "version": "1.3.1",
218 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.3.1.tgz",
219 + "integrity": "sha512-Un4pryPsx761ovw21J0sKeIJdqN+2i/7KEXMEoGYl2extmadsE5swS9SlMHp3l1oE2HKt/2CLfdrbinc1zoI8A==",
220 + "cpu": [
221 + "arm64"
222 + ],
223 + "optional": true,
224 + "os": [
225 + "linux"
226 + ],
227 + "engines": {
228 + "node": ">= 10"
229 + }
230 + },
231 + "node_modules/@node-rs/crc32-linux-x64-gnu": {
232 + "version": "1.3.1",
233 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.3.1.tgz",
234 + "integrity": "sha512-7vGDwMfBunzhxTp52x1TsozZKc4946Ahx1GndsQoN3NpiWaW3ENouliOl3U9bpSF29k/9hJvcIBDghPtz6el6Q==",
235 + "cpu": [
236 + "x64"
237 + ],
238 + "optional": true,
239 + "os": [
240 + "linux"
241 + ],
242 + "engines": {
243 + "node": ">= 10"
244 + }
245 + },
246 + "node_modules/@node-rs/crc32-linux-x64-musl": {
247 + "version": "1.3.1",
248 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.3.1.tgz",
249 + "integrity": "sha512-YQaCdUSSnO9Y3MGF+qfj7phHUWvJSab2QF7ru6TfX6syWPB2GYj1OhgX6CyVRli/XCkqqOMz/u2iV22vzj0jNA==",
250 + "cpu": [
251 + "x64"
252 + ],
253 + "optional": true,
254 + "os": [
255 + "linux"
256 + ],
257 + "engines": {
258 + "node": ">= 10"
259 + }
260 + },
261 + "node_modules/@node-rs/crc32-win32-arm64-msvc": {
262 + "version": "1.3.1",
263 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.3.1.tgz",
264 + "integrity": "sha512-Hio1iAHrvWFFh4V7MsRjaYBbS2nRNcpSHpXu0Hf/C6saykSOMkxgYbC6pcN+LfsG43HOZYkqeJAEnMal+dbk8g==",
265 + "cpu": [
266 + "arm64"
267 + ],
268 + "optional": true,
269 + "os": [
270 + "win32"
271 + ],
272 + "engines": {
273 + "node": ">= 10"
274 + }
275 + },
276 + "node_modules/@node-rs/crc32-win32-ia32-msvc": {
277 + "version": "1.3.1",
278 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.3.1.tgz",
279 + "integrity": "sha512-QQ0mKhM4f9JyNUPQ0BFtzeb6CrFFnDEJG9dGfJAHgsqWaHNBmVXoMXYdVGXqged25WV7R/+Zk+EWUsvBBfnVig==",
280 + "cpu": [
281 + "ia32"
282 + ],
283 + "optional": true,
284 + "os": [
285 + "win32"
286 + ],
287 + "engines": {
288 + "node": ">= 10"
289 + }
290 + },
291 + "node_modules/@node-rs/crc32-win32-x64-msvc": {
292 + "version": "1.3.1",
293 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.3.1.tgz",
294 + "integrity": "sha512-1hlEyJ5QK9p8+8MHpxtxW+RA5v4Y7BeSauDUAWQfBrF6FSwNKvbypkVSwC19OLQFUv0PP0lvyBG/oo6X7xN73Q==",
295 + "cpu": [
296 + "x64"
297 + ],
298 + "optional": true,
299 + "os": [
300 + "win32"
301 + ],
302 + "engines": {
303 + "node": ">= 10"
304 + }
305 + },
306 "node_modules/@nodelib/fs.scandir": {
307 "version": "2.1.5",
308 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -544,70 +766,6 @@
766 "node": ">= 8"
767 }
768 },
547 - "node_modules/archiver": {
548 - "version": "5.3.0",
549 - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz",
550 - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==",
551 - "dependencies": {
552 - "archiver-utils": "^2.1.0",
553 - "async": "^3.2.0",
554 - "buffer-crc32": "^0.2.1",
555 - "readable-stream": "^3.6.0",
556 - "readdir-glob": "^1.0.0",
557 - "tar-stream": "^2.2.0",
558 - "zip-stream": "^4.1.0"
559 - },
560 - "engines": {
561 - "node": ">= 10"
562 - }
563 - },
564 - "node_modules/archiver-utils": {
565 - "version": "2.1.0",
566 - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
567 - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
568 - "dependencies": {
569 - "glob": "^7.1.4",
570 - "graceful-fs": "^4.2.0",
571 - "lazystream": "^1.0.0",
572 - "lodash.defaults": "^4.2.0",
573 - "lodash.difference": "^4.5.0",
574 - "lodash.flatten": "^4.4.0",
575 - "lodash.isplainobject": "^4.0.6",
576 - "lodash.union": "^4.6.0",
577 - "normalize-path": "^3.0.0",
578 - "readable-stream": "^2.0.0"
579 - },
580 - "engines": {
581 - "node": ">= 6"
582 - }
583 - },
584 - "node_modules/archiver-utils/node_modules/readable-stream": {
585 - "version": "2.3.7",
586 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
587 - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
588 - "dependencies": {
589 - "core-util-is": "~1.0.0",
590 - "inherits": "~2.0.3",
591 - "isarray": "~1.0.0",
592 - "process-nextick-args": "~2.0.0",
593 - "safe-buffer": "~5.1.1",
594 - "string_decoder": "~1.1.1",
595 - "util-deprecate": "~1.0.1"
596 - }
597 - },
598 - "node_modules/archiver-utils/node_modules/string_decoder": {
599 - "version": "1.1.1",
600 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
601 - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
602 - "dependencies": {
603 - "safe-buffer": "~5.1.0"
604 - }
605 - },
606 - "node_modules/archiver/node_modules/async": {
607 - "version": "3.2.2",
608 - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
609 - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g=="
610 - },
769 "node_modules/arg": {
770 "version": "4.1.3",
771 "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -631,7 +789,8 @@
789 "node_modules/balanced-match": {
790 "version": "1.0.2",
791 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
634 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
792 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
793 + "dev": true
794 },
795 "node_modules/base64-js": {
796 "version": "1.5.1",
@@ -661,16 +820,6 @@
820 "node": ">=8"
821 }
822 },
664 - "node_modules/bl": {
665 - "version": "4.1.0",
666 - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
667 - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
668 - "dependencies": {
669 - "buffer": "^5.5.0",
670 - "inherits": "^2.0.4",
671 - "readable-stream": "^3.4.0"
672 - }
673 - },
823 "node_modules/boxen": {
824 "version": "5.1.2",
825 "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
@@ -697,6 +846,7 @@
846 "version": "1.1.11",
847 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
848 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
849 + "dev": true,
850 "dependencies": {
851 "balanced-match": "^1.0.0",
852 "concat-map": "0.0.1"
@@ -742,14 +892,6 @@
892 "ieee754": "^1.1.13"
893 }
894 },
745 - "node_modules/buffer-crc32": {
746 - "version": "0.2.13",
747 - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
748 - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
749 - "engines": {
750 - "node": "*"
751 - }
752 - },
895 "node_modules/bytes": {
896 "version": "3.1.1",
897 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -978,20 +1120,6 @@
1120 "node": ">=0.1.90"
1121 }
1122 },
981 - "node_modules/compress-commons": {
982 - "version": "4.1.1",
983 - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
984 - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
985 - "dependencies": {
986 - "buffer-crc32": "^0.2.13",
987 - "crc32-stream": "^4.0.2",
988 - "normalize-path": "^3.0.0",
989 - "readable-stream": "^3.6.0"
990 - },
991 - "engines": {
992 - "node": ">= 10"
993 - }
994 - },
1123 "node_modules/compressible": {
1124 "version": "2.0.18",
1125 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -1006,7 +1134,8 @@
1134 "node_modules/concat-map": {
1135 "version": "0.0.1",
1136 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1009 - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
1137 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
1138 + "dev": true
1139 },
1140 "node_modules/configstore": {
1141 "version": "5.0.1",
@@ -1074,33 +1203,6 @@
1203 "buffer": "^5.1.0"
1204 }
1205 },
1077 - "node_modules/crc-32": {
1078 - "version": "1.2.0",
1079 - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
1080 - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
1081 - "dependencies": {
1082 - "exit-on-epipe": "~1.0.1",
1083 - "printj": "~1.1.0"
1084 - },
1085 - "bin": {
1086 - "crc32": "bin/crc32.njs"
1087 - },
1088 - "engines": {
1089 - "node": ">=0.8"
1090 - }
1091 - },
1092 - "node_modules/crc32-stream": {
1093 - "version": "4.0.2",
1094 - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
1095 - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
1096 - "dependencies": {
1097 - "crc-32": "^1.2.0",
1098 - "readable-stream": "^3.4.0"
1099 - },
1100 - "engines": {
1101 - "node": ">= 10"
1102 - }
1103 - },
1206 "node_modules/create-require": {
1207 "version": "1.1.1",
1208 "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -1252,6 +1354,7 @@
1354 "version": "1.4.4",
1355 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
1356 "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
1357 + "dev": true,
1358 "dependencies": {
1359 "once": "^1.4.0"
1360 }
@@ -1284,14 +1387,6 @@
1387 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1388 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
1389 },
1287 - "node_modules/exit-on-epipe": {
1288 - "version": "1.0.1",
1289 - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
1290 - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==",
1291 - "engines": {
1292 - "node": ">=0.8"
1293 - }
1294 - },
1390 "node_modules/eyes": {
1391 "version": "0.1.8",
1392 "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
@@ -1371,15 +1466,11 @@
1466 "node": ">= 0.6"
1467 }
1468 },
1374 - "node_modules/fs-constants": {
1375 - "version": "1.0.0",
1376 - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
1377 - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
1378 - },
1469 "node_modules/fs.realpath": {
1470 "version": "1.0.0",
1471 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1382 - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
1472 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1473 + "dev": true
1474 },
1475 "node_modules/fsevents": {
1476 "version": "2.3.2",
@@ -1434,25 +1525,6 @@
1525 "node": ">=6"
1526 }
1527 },
1437 - "node_modules/glob": {
1438 - "version": "7.2.0",
1439 - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
1440 - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
1441 - "dependencies": {
1442 - "fs.realpath": "^1.0.0",
1443 - "inflight": "^1.0.4",
1444 - "inherits": "2",
1445 - "minimatch": "^3.0.4",
1446 - "once": "^1.3.0",
1447 - "path-is-absolute": "^1.0.0"
1448 - },
1449 - "engines": {
1450 - "node": "*"
1451 - },
1452 - "funding": {
1453 - "url": "https://github.com/sponsors/isaacs"
1454 - }
1455 - },
1528 "node_modules/glob-parent": {
1529 "version": "5.1.2",
1530 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -1504,7 +1576,8 @@
1576 "node_modules/graceful-fs": {
1577 "version": "4.2.8",
1578 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
1507 - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
1579 + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
1580 + "dev": true
1581 },
1582 "node_modules/growl": {
1583 "version": "1.10.5",
@@ -1685,6 +1758,7 @@
1758 "version": "1.0.6",
1759 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1760 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1761 + "dev": true,
1762 "dependencies": {
1763 "once": "^1.3.0",
1764 "wrappy": "1"
@@ -1872,11 +1946,6 @@
1946 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
1947 "dev": true
1948 },
1875 - "node_modules/isarray": {
1876 - "version": "1.0.0",
1877 - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1878 - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1879 - },
1949 "node_modules/isexe": {
1950 "version": "2.0.0",
1951 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -2063,69 +2132,11 @@
2132 "node": ">=8"
2133 }
2134 },
2066 - "node_modules/lazystream": {
2067 - "version": "1.0.1",
2068 - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
2069 - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
2070 - "dependencies": {
2071 - "readable-stream": "^2.0.5"
2072 - },
2073 - "engines": {
2074 - "node": ">= 0.6.3"
2075 - }
2076 - },
2077 - "node_modules/lazystream/node_modules/readable-stream": {
2078 - "version": "2.3.7",
2079 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
2080 - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
2081 - "dependencies": {
2082 - "core-util-is": "~1.0.0",
2083 - "inherits": "~2.0.3",
2084 - "isarray": "~1.0.0",
2085 - "process-nextick-args": "~2.0.0",
2086 - "safe-buffer": "~5.1.1",
2087 - "string_decoder": "~1.1.1",
2088 - "util-deprecate": "~1.0.1"
2089 - }
2090 - },
2091 - "node_modules/lazystream/node_modules/string_decoder": {
2092 - "version": "1.1.1",
2093 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2094 - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2095 - "dependencies": {
2096 - "safe-buffer": "~5.1.0"
2097 - }
2098 - },
2135 "node_modules/lodash": {
2136 "version": "4.17.21",
2137 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
2138 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
2139 },
2104 - "node_modules/lodash.defaults": {
2105 - "version": "4.2.0",
2106 - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
2107 - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
2108 - },
2109 - "node_modules/lodash.difference": {
2110 - "version": "4.5.0",
2111 - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
2112 - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
2113 - },
2114 - "node_modules/lodash.flatten": {
2115 - "version": "4.4.0",
2116 - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
2117 - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
2118 - },
2119 - "node_modules/lodash.isplainobject": {
2120 - "version": "4.0.6",
2121 - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
2122 - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
2123 - },
2124 - "node_modules/lodash.union": {
2125 - "version": "4.6.0",
2126 - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
2127 - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
2128 - },
2140 "node_modules/log-symbols": {
2141 "version": "4.1.0",
2142 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -2261,6 +2272,7 @@
2272 "version": "3.0.4",
2273 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2274 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2275 + "dev": true,
2276 "dependencies": {
2277 "brace-expansion": "^1.1.7"
2278 },
@@ -2592,6 +2604,7 @@
2604 "version": "3.0.0",
2605 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2606 "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2607 + "dev": true,
2608 "engines": {
2609 "node": ">=0.10.0"
2610 }
@@ -2628,6 +2641,7 @@
2641 "version": "1.4.0",
2642 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2643 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2644 + "dev": true,
2645 "dependencies": {
2646 "wrappy": "1"
2647 }
@@ -2691,6 +2705,7 @@
2705 "version": "1.0.1",
2706 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2707 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2708 + "dev": true,
2709 "engines": {
2710 "node": ">=0.10.0"
2711 }
@@ -2720,22 +2735,6 @@
2735 "node": ">=4"
2736 }
2737 },
2723 - "node_modules/printj": {
2724 - "version": "1.1.2",
2725 - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
2726 - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==",
2727 - "bin": {
2728 - "printj": "bin/printj.njs"
2729 - },
2730 - "engines": {
2731 - "node": ">=0.8"
2732 - }
2733 - },
2734 - "node_modules/process-nextick-args": {
2735 - "version": "2.0.1",
2736 - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2737 - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
2738 - },
2738 "node_modules/pstree.remy": {
2739 "version": "1.1.8",
2740 "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
@@ -2841,27 +2840,6 @@
2840 "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
2841 "dev": true
2842 },
2844 - "node_modules/readable-stream": {
2845 - "version": "3.6.0",
2846 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
2847 - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
2848 - "dependencies": {
2849 - "inherits": "^2.0.3",
2850 - "string_decoder": "^1.1.1",
2851 - "util-deprecate": "^1.0.1"
2852 - },
2853 - "engines": {
2854 - "node": ">= 6"
2855 - }
2856 - },
2857 - "node_modules/readdir-glob": {
2858 - "version": "1.1.1",
2859 - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz",
2860 - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==",
2861 - "dependencies": {
2862 - "minimatch": "^3.0.4"
2863 - }
2864 - },
2843 "node_modules/readdirp": {
2844 "version": "3.6.0",
2845 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -3036,33 +3014,6 @@
3014 "node": ">= 0.6"
3015 }
3016 },
3039 - "node_modules/string_decoder": {
3040 - "version": "1.3.0",
3041 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
3042 - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
3043 - "dependencies": {
3044 - "safe-buffer": "~5.2.0"
3045 - }
3046 - },
3047 - "node_modules/string_decoder/node_modules/safe-buffer": {
3048 - "version": "5.2.1",
3049 - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
3050 - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
3051 - "funding": [
3052 - {
3053 - "type": "github",
3054 - "url": "https://github.com/sponsors/feross"
3055 - },
3056 - {
3057 - "type": "patreon",
3058 - "url": "https://www.patreon.com/feross"
3059 - },
3060 - {
3061 - "type": "consulting",
3062 - "url": "https://feross.org/support"
3063 - }
3064 - ]
3065 - },
3017 "node_modules/string-width": {
3018 "version": "4.2.3",
3019 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -3110,21 +3061,6 @@
3061 "node": ">=4"
3062 }
3063 },
3113 - "node_modules/tar-stream": {
3114 - "version": "2.2.0",
3115 - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
3116 - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
3117 - "dependencies": {
3118 - "bl": "^4.0.3",
3119 - "end-of-stream": "^1.4.1",
3120 - "fs-constants": "^1.0.0",
3121 - "inherits": "^2.0.3",
3122 - "readable-stream": "^3.1.1"
3123 - },
3124 - "engines": {
3125 - "node": ">=6"
3126 - }
3127 - },
3064 "node_modules/to-readable-stream": {
3065 "version": "1.0.0",
3066 "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -3341,11 +3277,6 @@
3277 "node": ">=4"
3278 }
3279 },
3344 - "node_modules/util-deprecate": {
3345 - "version": "1.0.2",
3346 - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3347 - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
3348 - },
3280 "node_modules/uuid": {
3281 "version": "3.4.0",
3282 "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -3432,7 +3363,8 @@
3363 "node_modules/wrappy": {
3364 "version": "1.0.2",
3365 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3435 - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
3366 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3367 + "dev": true
3368 },
3369 "node_modules/write-file-atomic": {
3370 "version": "3.0.3",
@@ -3548,19 +3480,6 @@
3480 "funding": {
3481 "url": "https://github.com/sponsors/sindresorhus"
3482 }
3551 - },
3552 - "node_modules/zip-stream": {
3553 - "version": "4.1.0",
3554 - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
3555 - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
3556 - "dependencies": {
3557 - "archiver-utils": "^2.1.0",
3558 - "compress-commons": "^4.1.0",
3559 - "readable-stream": "^3.6.0"
3560 - },
3561 - "engines": {
3562 - "node": ">= 10"
3563 - }
3483 }
3484 },
3485 "dependencies": {
@@ -3591,6 +3510,104 @@
3510 "path-to-regexp": "^6.1.0"
3511 }
3512 },
3513 + "@node-rs/crc32": {
3514 + "version": "1.3.1",
3515 + "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.3.1.tgz",
3516 + "integrity": "sha512-I03vfT0P4ud5QDsWtGc5qcBhvUz2PiaMhOg/B6GjyPy+VRJW5KR74+ODM1CsVZBHM6d/+wKHgsjtSh4HMz1fYg==",
3517 + "requires": {
3518 + "@node-rs/crc32-android-arm-eabi": "1.3.1",
3519 + "@node-rs/crc32-android-arm64": "1.3.1",
3520 + "@node-rs/crc32-darwin-arm64": "1.3.1",
3521 + "@node-rs/crc32-darwin-x64": "1.3.1",
3522 + "@node-rs/crc32-freebsd-x64": "1.3.1",
3523 + "@node-rs/crc32-linux-arm-gnueabihf": "1.3.1",
3524 + "@node-rs/crc32-linux-arm64-gnu": "1.3.1",
3525 + "@node-rs/crc32-linux-arm64-musl": "1.3.1",
3526 + "@node-rs/crc32-linux-x64-gnu": "1.3.1",
3527 + "@node-rs/crc32-linux-x64-musl": "1.3.1",
3528 + "@node-rs/crc32-win32-arm64-msvc": "1.3.1",
3529 + "@node-rs/crc32-win32-ia32-msvc": "1.3.1",
3530 + "@node-rs/crc32-win32-x64-msvc": "1.3.1"
3531 + }
3532 + },
3533 + "@node-rs/crc32-android-arm-eabi": {
3534 + "version": "1.3.1",
3535 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.3.1.tgz",
3536 + "integrity": "sha512-iNNHEFSOwuQ0AZHTOkbZNs2hbu3+7l+Zi1ZjqHKAZFTbd2uDPmYIWNqqxWegaKAwnvVKL9ciSDYYEEY4oF8ETg==",
3537 + "optional": true
3538 + },
3539 + "@node-rs/crc32-android-arm64": {
3540 + "version": "1.3.1",
3541 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.3.1.tgz",
3542 + "integrity": "sha512-r4DH1XHR2gVRv5kiNrHJU45X1KhDIwKFMKM9mw3xR36MUq34frQdUrovF+DgHKqfTBRS1y1WSL/x6tS6qYHZgQ==",
3543 + "optional": true
3544 + },
3545 + "@node-rs/crc32-darwin-arm64": {
3546 + "version": "1.3.1",
3547 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.3.1.tgz",
3548 + "integrity": "sha512-3QYYAh7b+1DY2T1kdVDb8dP08OwI6MIrhWYsOb8jVBjXSB0we2phM6J092ml8l18TJNw2VLO2UgM1QvTxOaOMw==",
3549 + "optional": true
3550 + },
3551 + "@node-rs/crc32-darwin-x64": {
3552 + "version": "1.3.1",
3553 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.3.1.tgz",
3554 + "integrity": "sha512-l7AKwVV6670T2SnDWUrXDHZxi5QX+XkS44P1wHzf+hDkgkl6Dm6ou47RH63Ebvdjl/jm4Z5Zk7XSef9aSotpwQ==",
3555 + "optional": true
3556 + },
3557 + "@node-rs/crc32-freebsd-x64": {
3558 + "version": "1.3.1",
3559 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.3.1.tgz",
3560 + "integrity": "sha512-PVoCqAZWouXYRtWBw72a16Eq1NJVOfUEA2giEAHMtpV/D5tN7mgdPsKDbeLPSRwqVA2jouDXuiyA8IIzl6Fm8w==",
3561 + "optional": true
3562 + },
3563 + "@node-rs/crc32-linux-arm-gnueabihf": {
3564 + "version": "1.3.1",
3565 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.3.1.tgz",
3566 + "integrity": "sha512-iJhJS14FFdj3MIMLnfNcLQPstxlBDrItkZIYiMRzkw9DWpLjjLYH/uishC5Q2DB9NzR2hBdQeTcM/Ie1vKF0xw==",
3567 + "optional": true
3568 + },
3569 + "@node-rs/crc32-linux-arm64-gnu": {
3570 + "version": "1.3.1",
3571 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.3.1.tgz",
3572 + "integrity": "sha512-K0m9QBkpzxbnTMfj7mpHx2YHB2Dbskf/AVA1AbWJXg5xySSb48nL5ZCqkeE+OkEzPrA9c6eu3MnEwZWodxpuSw==",
3573 + "optional": true
3574 + },
3575 + "@node-rs/crc32-linux-arm64-musl": {
3576 + "version": "1.3.1",
3577 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.3.1.tgz",
3578 + "integrity": "sha512-Un4pryPsx761ovw21J0sKeIJdqN+2i/7KEXMEoGYl2extmadsE5swS9SlMHp3l1oE2HKt/2CLfdrbinc1zoI8A==",
3579 + "optional": true
3580 + },
3581 + "@node-rs/crc32-linux-x64-gnu": {
3582 + "version": "1.3.1",
3583 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.3.1.tgz",
3584 + "integrity": "sha512-7vGDwMfBunzhxTp52x1TsozZKc4946Ahx1GndsQoN3NpiWaW3ENouliOl3U9bpSF29k/9hJvcIBDghPtz6el6Q==",
3585 + "optional": true
3586 + },
3587 + "@node-rs/crc32-linux-x64-musl": {
3588 + "version": "1.3.1",
3589 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.3.1.tgz",
3590 + "integrity": "sha512-YQaCdUSSnO9Y3MGF+qfj7phHUWvJSab2QF7ru6TfX6syWPB2GYj1OhgX6CyVRli/XCkqqOMz/u2iV22vzj0jNA==",
3591 + "optional": true
3592 + },
3593 + "@node-rs/crc32-win32-arm64-msvc": {
3594 + "version": "1.3.1",
3595 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.3.1.tgz",
3596 + "integrity": "sha512-Hio1iAHrvWFFh4V7MsRjaYBbS2nRNcpSHpXu0Hf/C6saykSOMkxgYbC6pcN+LfsG43HOZYkqeJAEnMal+dbk8g==",
3597 + "optional": true
3598 + },
3599 + "@node-rs/crc32-win32-ia32-msvc": {
3600 + "version": "1.3.1",
3601 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.3.1.tgz",
3602 + "integrity": "sha512-QQ0mKhM4f9JyNUPQ0BFtzeb6CrFFnDEJG9dGfJAHgsqWaHNBmVXoMXYdVGXqged25WV7R/+Zk+EWUsvBBfnVig==",
3603 + "optional": true
3604 + },
3605 + "@node-rs/crc32-win32-x64-msvc": {
3606 + "version": "1.3.1",
3607 + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.3.1.tgz",
3608 + "integrity": "sha512-1hlEyJ5QK9p8+8MHpxtxW+RA5v4Y7BeSauDUAWQfBrF6FSwNKvbypkVSwC19OLQFUv0PP0lvyBG/oo6X7xN73Q==",
3609 + "optional": true
3610 + },
3611 "@nodelib/fs.scandir": {
3612 "version": "2.1.5",
3613 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -4011,68 +4028,6 @@
4028 "picomatch": "^2.0.4"
4029 }
4030 },
4014 - "archiver": {
4015 - "version": "5.3.0",
4016 - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz",
4017 - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==",
4018 - "requires": {
4019 - "archiver-utils": "^2.1.0",
4020 - "async": "^3.2.0",
4021 - "buffer-crc32": "^0.2.1",
4022 - "readable-stream": "^3.6.0",
4023 - "readdir-glob": "^1.0.0",
4024 - "tar-stream": "^2.2.0",
4025 - "zip-stream": "^4.1.0"
4026 - },
4027 - "dependencies": {
4028 - "async": {
4029 - "version": "3.2.2",
4030 - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz",
4031 - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g=="
4032 - }
4033 - }
4034 - },
4035 - "archiver-utils": {
4036 - "version": "2.1.0",
4037 - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
4038 - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
4039 - "requires": {
4040 - "glob": "^7.1.4",
4041 - "graceful-fs": "^4.2.0",
4042 - "lazystream": "^1.0.0",
4043 - "lodash.defaults": "^4.2.0",
4044 - "lodash.difference": "^4.5.0",
4045 - "lodash.flatten": "^4.4.0",
4046 - "lodash.isplainobject": "^4.0.6",
4047 - "lodash.union": "^4.6.0",
4048 - "normalize-path": "^3.0.0",
4049 - "readable-stream": "^2.0.0"
4050 - },
4051 - "dependencies": {
4052 - "readable-stream": {
4053 - "version": "2.3.7",
4054 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
4055 - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
4056 - "requires": {
4057 - "core-util-is": "~1.0.0",
4058 - "inherits": "~2.0.3",
4059 - "isarray": "~1.0.0",
4060 - "process-nextick-args": "~2.0.0",
4061 - "safe-buffer": "~5.1.1",
4062 - "string_decoder": "~1.1.1",
4063 - "util-deprecate": "~1.0.1"
4064 - }
4065 - },
4066 - "string_decoder": {
4067 - "version": "1.1.1",
4068 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
4069 - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
4070 - "requires": {
4071 - "safe-buffer": "~5.1.0"
4072 - }
4073 - }
4074 - }
4075 - },
4031 "arg": {
4032 "version": "4.1.3",
4033 "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -4096,7 +4051,8 @@
4051 "balanced-match": {
4052 "version": "1.0.2",
4053 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
4099 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
4054 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
4055 + "dev": true
4056 },
4057 "base64-js": {
4058 "version": "1.5.1",
@@ -4109,16 +4065,6 @@
4065 "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
4066 "dev": true
4067 },
4112 - "bl": {
4113 - "version": "4.1.0",
4114 - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
4115 - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
4116 - "requires": {
4117 - "buffer": "^5.5.0",
4118 - "inherits": "^2.0.4",
4119 - "readable-stream": "^3.4.0"
4120 - }
4121 - },
4068 "boxen": {
4069 "version": "5.1.2",
4070 "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
@@ -4139,6 +4085,7 @@
4085 "version": "1.1.11",
4086 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
4087 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
4088 + "dev": true,
4089 "requires": {
4090 "balanced-match": "^1.0.0",
4091 "concat-map": "0.0.1"
@@ -4167,11 +4114,6 @@
4114 "ieee754": "^1.1.13"
4115 }
4116 },
4170 - "buffer-crc32": {
4171 - "version": "0.2.13",
4172 - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
4173 - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
4174 - },
4117 "bytes": {
4118 "version": "3.1.1",
4119 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -4344,17 +4286,6 @@
4286 "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
4287 "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
4288 },
4347 - "compress-commons": {
4348 - "version": "4.1.1",
4349 - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
4350 - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
4351 - "requires": {
4352 - "buffer-crc32": "^0.2.13",
4353 - "crc32-stream": "^4.0.2",
4354 - "normalize-path": "^3.0.0",
4355 - "readable-stream": "^3.6.0"
4356 - }
4357 - },
4289 "compressible": {
4290 "version": "2.0.18",
4291 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -4366,7 +4297,8 @@
4297 "concat-map": {
4298 "version": "0.0.1",
4299 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
4369 - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
4300 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
4301 + "dev": true
4302 },
4303 "configstore": {
4304 "version": "5.0.1",
@@ -4422,24 +4354,6 @@
4354 "buffer": "^5.1.0"
4355 }
4356 },
4425 - "crc-32": {
4426 - "version": "1.2.0",
4427 - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
4428 - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
4429 - "requires": {
4430 - "exit-on-epipe": "~1.0.1",
4431 - "printj": "~1.1.0"
4432 - }
4433 - },
4434 - "crc32-stream": {
4435 - "version": "4.0.2",
4436 - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
4437 - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
4438 - "requires": {
4439 - "crc-32": "^1.2.0",
4440 - "readable-stream": "^3.4.0"
4441 - }
4442 - },
4357 "create-require": {
4358 "version": "1.1.1",
4359 "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -4553,6 +4467,7 @@
4467 "version": "1.4.4",
4468 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
4469 "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
4470 + "dev": true,
4471 "requires": {
4472 "once": "^1.4.0"
4473 }
@@ -4579,11 +4494,6 @@
4494 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
4495 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
4496 },
4582 - "exit-on-epipe": {
4583 - "version": "1.0.1",
4584 - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
4585 - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
4586 - },
4497 "eyes": {
4498 "version": "0.1.8",
4499 "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
@@ -4634,15 +4544,11 @@
4544 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
4545 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
4546 },
4637 - "fs-constants": {
4638 - "version": "1.0.0",
4639 - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
4640 - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
4641 - },
4547 "fs.realpath": {
4548 "version": "1.0.0",
4549 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
4645 - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
4550 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
4551 + "dev": true
4552 },
4553 "fsevents": {
4554 "version": "2.3.2",
@@ -4681,19 +4587,6 @@
4587 "pump": "^3.0.0"
4588 }
4589 },
4684 - "glob": {
4685 - "version": "7.2.0",
4686 - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
4687 - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
4688 - "requires": {
4689 - "fs.realpath": "^1.0.0",
4690 - "inflight": "^1.0.4",
4691 - "inherits": "2",
4692 - "minimatch": "^3.0.4",
4693 - "once": "^1.3.0",
4694 - "path-is-absolute": "^1.0.0"
4695 - }
4696 - },
4590 "glob-parent": {
4591 "version": "5.1.2",
4592 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -4733,7 +4626,8 @@
4626 "graceful-fs": {
4627 "version": "4.2.8",
4628 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
4736 - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
4629 + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
4630 + "dev": true
4631 },
4632 "growl": {
4633 "version": "1.10.5",
@@ -4854,6 +4748,7 @@
4748 "version": "1.0.6",
4749 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
4750 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
4751 + "dev": true,
4752 "requires": {
4753 "once": "^1.3.0",
4754 "wrappy": "1"
@@ -4987,11 +4882,6 @@
4882 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
4883 "dev": true
4884 },
4990 - "isarray": {
4991 - "version": "1.0.0",
4992 - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
4993 - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
4994 - },
4885 "isexe": {
4886 "version": "2.0.0",
4887 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -5152,68 +5042,11 @@
5042 "package-json": "^6.3.0"
5043 }
5044 },
5155 - "lazystream": {
5156 - "version": "1.0.1",
5157 - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
5158 - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
5159 - "requires": {
5160 - "readable-stream": "^2.0.5"
5161 - },
5162 - "dependencies": {
5163 - "readable-stream": {
5164 - "version": "2.3.7",
5165 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
5166 - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
5167 - "requires": {
5168 - "core-util-is": "~1.0.0",
5169 - "inherits": "~2.0.3",
5170 - "isarray": "~1.0.0",
5171 - "process-nextick-args": "~2.0.0",
5172 - "safe-buffer": "~5.1.1",
5173 - "string_decoder": "~1.1.1",
5174 - "util-deprecate": "~1.0.1"
5175 - }
5176 - },
5177 - "string_decoder": {
5178 - "version": "1.1.1",
5179 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5180 - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5181 - "requires": {
5182 - "safe-buffer": "~5.1.0"
5183 - }
5184 - }
5185 - }
5186 - },
5045 "lodash": {
5046 "version": "4.17.21",
5047 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
5048 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
5049 },
5192 - "lodash.defaults": {
5193 - "version": "4.2.0",
5194 - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
5195 - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
5196 - },
5197 - "lodash.difference": {
5198 - "version": "4.5.0",
5199 - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
5200 - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
5201 - },
5202 - "lodash.flatten": {
5203 - "version": "4.4.0",
5204 - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
5205 - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
5206 - },
5207 - "lodash.isplainobject": {
5208 - "version": "4.0.6",
5209 - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
5210 - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
5211 - },
5212 - "lodash.union": {
5213 - "version": "4.6.0",
5214 - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
5215 - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
5216 - },
5050 "log-symbols": {
5051 "version": "4.1.0",
5052 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -5309,6 +5142,7 @@
5142 "version": "3.0.4",
5143 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
5144 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
5145 + "dev": true,
5146 "requires": {
5147 "brace-expansion": "^1.1.7"
5148 }
@@ -5537,7 +5371,8 @@
5371 "normalize-path": {
5372 "version": "3.0.0",
5373 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
5540 - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
5374 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
5375 + "dev": true
5376 },
5377 "normalize-url": {
5378 "version": "4.5.1",
@@ -5562,6 +5397,7 @@
5397 "version": "1.4.0",
5398 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
5399 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
5400 + "dev": true,
5401 "requires": {
5402 "wrappy": "1"
5403 }
@@ -5611,7 +5447,8 @@
5447 "path-is-absolute": {
5448 "version": "1.0.1",
5449 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
5614 - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
5450 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
5451 + "dev": true
5452 },
5453 "path-to-regexp": {
5454 "version": "6.2.0",
@@ -5629,16 +5466,6 @@
5466 "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
5467 "dev": true
5468 },
5632 - "printj": {
5633 - "version": "1.1.2",
5634 - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
5635 - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
5636 - },
5637 - "process-nextick-args": {
5638 - "version": "2.0.1",
5639 - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
5640 - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
5641 - },
5469 "pstree.remy": {
5470 "version": "1.1.8",
5471 "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
@@ -5717,24 +5544,6 @@
5544 }
5545 }
5546 },
5720 - "readable-stream": {
5721 - "version": "3.6.0",
5722 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
5723 - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
5724 - "requires": {
5725 - "inherits": "^2.0.3",
5726 - "string_decoder": "^1.1.1",
5727 - "util-deprecate": "^1.0.1"
5728 - }
5729 - },
5730 - "readdir-glob": {
5731 - "version": "1.1.1",
5732 - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz",
5733 - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==",
5734 - "requires": {
5735 - "minimatch": "^3.0.4"
5736 - }
5737 - },
5547 "readdirp": {
5548 "version": "3.6.0",
5549 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -5863,21 +5672,6 @@
5672 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
5673 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
5674 },
5866 - "string_decoder": {
5867 - "version": "1.3.0",
5868 - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
5869 - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
5870 - "requires": {
5871 - "safe-buffer": "~5.2.0"
5872 - },
5873 - "dependencies": {
5874 - "safe-buffer": {
5875 - "version": "5.2.1",
5876 - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
5877 - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
5878 - }
5879 - }
5880 - },
5675 "string-width": {
5676 "version": "4.2.3",
5677 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -5913,18 +5707,6 @@
5707 "has-flag": "^3.0.0"
5708 }
5709 },
5916 - "tar-stream": {
5917 - "version": "2.2.0",
5918 - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
5919 - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
5920 - "requires": {
5921 - "bl": "^4.0.3",
5922 - "end-of-stream": "^1.4.1",
5923 - "fs-constants": "^1.0.0",
5924 - "inherits": "^2.0.3",
5925 - "readable-stream": "^3.1.1"
5926 - }
5927 - },
5710 "to-readable-stream": {
5711 "version": "1.0.0",
5712 "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -6070,11 +5852,6 @@
5852 "prepend-http": "^2.0.0"
5853 }
5854 },
6073 - "util-deprecate": {
6074 - "version": "1.0.2",
6075 - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
6076 - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
6077 - },
5855 "uuid": {
5856 "version": "3.4.0",
5857 "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -6136,7 +5913,8 @@
5913 "wrappy": {
5914 "version": "1.0.2",
5915 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
6139 - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
5916 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
5917 + "dev": true
5918 },
5919 "write-file-atomic": {
5920 "version": "3.0.3",
@@ -6222,16 +6000,6 @@
6000 "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
6001 "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
6002 "dev": true
6225 - },
6226 - "zip-stream": {
6227 - "version": "4.1.0",
6228 - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
6229 - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
6230 - "requires": {
6231 - "archiver-utils": "^2.1.0",
6232 - "compress-commons": "^4.1.0",
6233 - "readable-stream": "^3.6.0"
6234 - }
6003 }
6004 }
6005 }
package.json
+1 -1
@@ -19,7 +19,7 @@
19 },
20 "dependencies": {
21 "@koa/router": "^10.1.1",
22 - "archiver": "^5.3.0",
22 + "@node-rs/crc32": "^1.3.1",
23 "fast-glob": "^3.2.7",
24 "koa": "^2.13.4",
25 "koa-better-http-proxy": "^0.2.9",
src/QuickZipStream.ts new
+193
@@ -0,0 +1,193 @@
1 +import { crc32 } from '@node-rs/crc32'
2 +import { Readable } from 'stream'
3 +
4 +const ZIP64_LIMIT = 2**31 -1
5 +
6 +interface ZipSource {
7 + path: string
8 + data: Readable
9 + size: number
10 + ts: Date
11 +}
12 +export class QuickZipStream extends Readable {
13 + private workingFile = false
14 + private numberOfFiles: number = 0
15 + private finished = false
16 + private readonly centralDir: ({ size:number, crc:number, ts:Date, pathAsBuffer:Buffer, offset:number, version:number })[] = []
17 + private dataWritten = 0
18 +
19 + constructor(private readonly walker: AsyncIterableIterator<ZipSource>) {
20 + super({})
21 + }
22 +
23 + _push(chunk:any) {
24 + if (Array.isArray(chunk))
25 + chunk = buffer(chunk)
26 + this.push(chunk)
27 + this.dataWritten += chunk.length
28 + }
29 +
30 + async _read(): Promise<void> {
31 + if (this.workingFile || this.finished) return
32 + const { value } = await this.walker.next() as { value: ZipSource }
33 + if (!value)
34 + return this.closeArchive()
35 + ++this.numberOfFiles
36 + let { path, data, size, ts } = value
37 + const pathAsBuffer = Buffer.from(path, 'utf8')
38 +
39 + let crc: number | undefined = undefined
40 + const offset = this.dataWritten
41 + let version = 20
42 + this._push([
43 + 4, 0x04034b50,
44 + 2, version,
45 + 2, 0x08, // flags
46 + 2, 0, // compression = store
47 + ...ts2buf(ts),
48 + 4, 0, // crc
49 + 4, 0, // size
50 + 4, 0, // size
51 + 2, pathAsBuffer.length,
52 + 2, 0, // extra length
53 + ])
54 + this._push(pathAsBuffer)
55 +
56 + let total = 0
57 + data.on('error', (err) => console.error(err))
58 + data.on('data', chunk => {
59 + this._push(chunk)
60 + crc = crc32(chunk, crc)
61 + total += chunk.length
62 + })
63 + this.workingFile = true
64 + data.on('end', ()=>{
65 + this.workingFile = false
66 + console.debug('zip', total, path)
67 + this.centralDir.push({ size, crc:crc!, pathAsBuffer, ts, offset, version })
68 + const sizeSize = size > ZIP64_LIMIT ? 8 : 4
69 + this._push([
70 + 4, 0x08074b50,
71 + 4, crc,
72 + sizeSize, size,
73 + sizeSize, size,
74 + ])
75 + })
76 + }
77 +
78 + closeArchive() {
79 + this.finished = true
80 + let centralOffset = this.dataWritten
81 + for (let { size, ts, crc, offset, pathAsBuffer, version } of this.centralDir) {
82 + const extra = []
83 + if (size > ZIP64_LIMIT) {
84 + extra.push(size, size)
85 + size = 0xffffffff
86 + }
87 + if (offset > ZIP64_LIMIT) {
88 + extra.push(offset)
89 + offset = 0xffffffff
90 + }
91 + const extraData = buffer(!extra.length ? []
92 + : [ 2,1, 2,8*extra.length, ...extra.map(x=> [8,x]).flat() ])
93 + if (extraData.length && version < 45)
94 + version = 45
95 + this._push([
96 + 4, 0x02014b50, // central dir signature
97 + 2, version,
98 + 2, version,
99 + 2, 0x08, // flags (bit3 = no crc in local header)
100 + 2, 0, // compression method = store
101 + ...ts2buf(ts),
102 + 4, crc,
103 + 4, size, // compressed
104 + 4, size,
105 + 2, pathAsBuffer.length,
106 + 2, extraData.length,
107 + 2, 0, //comment length
108 + 2, 0, // disk
109 + 2, 0, // attr
110 + 4, 0, // ext.attr
111 + 4, offset,
112 + ])
113 + this._push(pathAsBuffer)
114 + this._push(extraData)
115 + }
116 + const n = this.centralDir.length
117 + const after = this.dataWritten
118 + let centralSize = after-centralOffset
119 + if (centralOffset > ZIP64_LIMIT) {
120 + this._push([
121 + 4, 0x06064b50, // end of central dir zip64
122 + 8, 44,
123 + 2, 45,
124 + 2, 45,
125 + 4, 0,
126 + 4, 0,
127 + 8, n,
128 + 8, n,
129 + 8, centralSize,
130 + 8, centralOffset,
131 + ])
132 + this._push([
133 + 4, 0x07064b50,
134 + 4, 0,
135 + 8, after,
136 + 4, 1,
137 + ])
138 + centralOffset = 0xFFFFFFFF
139 + }
140 + this._push([
141 + 4,0x06054b50, // end of central directory signature
142 + 4,0, // disk-related stuff
143 + 2,this.numberOfFiles,
144 + 2,this.numberOfFiles,
145 + 4,centralSize,
146 + 4,centralOffset,
147 + 2,0, // comment length
148 + ])
149 + this.push(null) // EOF
150 + }
151 +}
152 +
153 +function buffer(parts: any[]) {
154 + const pairs = []
155 + let total = 0
156 + while (parts.length) {
157 + const size = parts.shift()
158 + if (typeof size === 'string') {
159 + pairs.push([String, size])
160 + total += size.length
161 + }
162 + else {
163 + pairs.push([size, parts.shift()])
164 + total += size
165 + }
166 + }
167 + const ret = Buffer.alloc(total, 0)
168 + let offset = 0
169 + for (const [size, data] of pairs) {
170 + if (size === 1)
171 + offset = ret.writeUInt8(data, offset)
172 + else if (size === 2)
173 + offset = ret.writeUInt16LE(data, offset)
174 + else if (size === 4)
175 + offset = ret.writeUInt32LE(data, offset)
176 + else if (size === 8)
177 + offset = ret.writeBigUInt64LE(BigInt(data), offset)
178 + else if (size === String)
179 + offset = ret.write(data,'ascii')
180 + else
181 + throw 'unsupported'
182 + }
183 + return ret
184 +}
185 +
186 +function ts2buf(ts:Date) {
187 + const date = (ts.getFullYear() - 1980) << 9 | ts.getMonth() << 5 | ts.getDate()
188 + const time = ts.getHours() << 11 | ts.getMinutes() << 5 | ts.getSeconds()
189 + return [
190 + 2, time,
191 + 2, date,
192 + ]
193 +}
src/misc.ts
+9
@@ -74,3 +74,12 @@ export function watchLoad(path:string, parser:(data:any)=>void|Promise<void>) {
74 doing = false
75 }
76 }
77 +
78 +// callback can return undefined to skip element
79 +export async function* filterMapGenerator<IN,OUT>(generator: AsyncIterableIterator<IN>, filterMap: (el: IN) => Promise<OUT>) {
80 + for await (const x of generator) {
81 + const res:OUT = await filterMap(x)
82 + if (res !== undefined)
83 + yield res as Exclude<OUT,undefined>
84 + }
85 +}
src/zip.ts
+13 -10
@@ -1,19 +1,22 @@
1 import { VfsNode, walkNode } from './vfs'
2 -import { getCurrentUsernameExpanded } from './perm'
2 import Koa from 'koa'
4 -import archiver from 'archiver'
5 -import { isFile } from './misc'
3 +import { filterMapGenerator } from './misc'
4 +import { QuickZipStream } from './QuickZipStream'
5 +import { createReadStream } from 'fs'
6 +import fs from 'fs/promises'
7
8 export async function zipStreamFromFolder(node: VfsNode, ctx: Koa.Context) {
9 ctx.status = 200
10 ctx.mime = 'zip'
11 const { name } = node
12 ctx.attachment(name+'.zip')
12 - const who = await getCurrentUsernameExpanded(ctx) // cache value
13 - const walker = walkNode(node, who, Infinity)
14 - const archive = ctx.body = archiver('zip', { store: true })
15 - for await (const { source, name } of walker)
16 - if (source && await isFile(source))
17 - archive.file(source, { name })
18 - archive.finalize().then()
13 + const walker = filterMapGenerator(walkNode(node, ctx, Infinity), async (el:VfsNode) => {
14 + if (!el.source || ctx.req.aborted)
15 + return
16 + const st = await fs.stat(el.source)
17 + if (!st?.isFile())
18 + return
19 + return { path:el.name, size:st.size, ts:st.mtime||st.ctime, data: createReadStream(el.source) }
20 + })
21 + ctx.body = new QuickZipStream(walker)
22 }
todo.md
+2 -1
@@ -5,7 +5,6 @@
5 - upload
6 - log file
7 - node.comment
8 -- streamable zip archives (no compression, resumable?)
8 - config: max speed (total/per-ip)
9 - config: max connections (total/per-ip)
10 - user.ignoreLimits
@@ -16,6 +15,8 @@
15 - webdav?
16 - vfs: ability to remove/hide/rename files deep in a source
17 - administration interface
18 +- log: ip2name
19 +- errors in separated log file
20 - login without passing clear text password?
21 we could use asymmetric encryption, possibly on a hashed password, that means
22 we should store a hash2(hash1(password+salt1)), where hash1 is applied on both client