zip folder

Massimo Melina committed Dec 28, 2021 at 12:21 UTC f0f7d5d531576cc55c4641321ffde3b2937b231a
5 files changed +694 -58
frontend/src/Head.ts
+29 -22
@@ -23,6 +23,28 @@ function MenuPanel() {
23 const [showFilter, setShowFilter] = useState(listFilter > '')
24 const [filter, setFilter] = useState(listFilter)
25 ;[state.listFilter] = useDebounce(showFilter ? filter : '', 300)
26 + const searchButtonProps = stopSearch ? {
27 + icon: 'stop',
28 + label: 'Stop list',
29 + className: 'ani-working',
30 + onClick() {
31 + stopSearch()
32 + state.stoppedSearch = true
33 + }
34 + } : state.remoteSearch ? {
35 + icon: 'search_off',
36 + label: 'Clear search',
37 + onClick() {
38 + state.remoteSearch = ''
39 + }
40 + } : {
41 + icon: 'search',
42 + label: 'Search',
43 + async onClick() {
44 + state.remoteSearch = await promptDialog('Search for...') ||''
45 + }
46 + }
47 +
48 return h('div', { id:'menu-panel' },
49 h('div', { id:'menu-bar' },
50 h(LoginButton),
@@ -34,29 +56,14 @@ function MenuPanel() {
56 setShowFilter(!showFilter)
57 }
58 }),
37 - h(MenuButton,
38 - stopSearch ? {
39 - icon: 'stop',
40 - label: 'Stop list',
41 - className: 'ani-working',
42 - onClick() {
43 - stopSearch()
44 - state.stoppedSearch = true
45 - }
46 - } : state.remoteSearch ? {
47 - icon: 'search_off',
48 - label: 'Clear search',
49 - onClick() {
50 - state.remoteSearch = ''
51 - }
52 - } : {
53 - icon: 'search',
54 - label: 'Search',
55 - async onClick() {
56 - state.remoteSearch = await promptDialog('Search for...') ||''
57 - }
59 + h(MenuButton, searchButtonProps),
60 + h(MenuButton, {
61 + icon: 'archive',
62 + label: 'Archive',
63 + onClick() {
64 + window.location.href = '?get=zip'
65 }
59 - )
66 + })
67 ),
68 remoteSearch && h('div', { id: 'searched' }, (stopSearch ? 'Searching' : 'Searched') + ': ' + remoteSearch),
69 showFilter && h('input',{
package-lock.json
+640 -36
@@ -10,6 +10,7 @@
10 "license": "GPL-3.0",
11 "dependencies": {
12 "@koa/router": "^10.1.1",
13 + "archiver": "^5.3.0",
14 "fast-glob": "^3.2.7",
15 "koa": "^2.13.4",
16 "koa-better-http-proxy": "^0.2.9",
@@ -22,6 +23,7 @@
23 "yaml": "^1.10.2"
24 },
25 "devDependencies": {
26 + "@types/archiver": "^5.1.1",
27 "@types/axios": "^0.14.0",
28 "@types/koa": "^2.13.4",
29 "@types/koa__router": "^8.0.11",
@@ -165,6 +167,15 @@
167 "@types/node": "*"
168 }
169 },
170 + "node_modules/@types/archiver": {
171 + "version": "5.1.1",
172 + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.1.1.tgz",
173 + "integrity": "sha512-heuaCk0YH5m274NOLSi66H1zX6GtZoMsdE6TYFcpFFjBjg0FoU4i4/M/a/kNlgNg26Xk3g364mNOYe1JaiEPOQ==",
174 + "dev": true,
175 + "dependencies": {
176 + "@types/glob": "*"
177 + }
178 + },
179 "node_modules/@types/axios": {
180 "version": "0.14.0",
181 "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz",
@@ -241,6 +252,16 @@
252 "@types/range-parser": "*"
253 }
254 },
255 + "node_modules/@types/glob": {
256 + "version": "7.2.0",
257 + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
258 + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
259 + "dev": true,
260 + "dependencies": {
261 + "@types/minimatch": "*",
262 + "@types/node": "*"
263 + }
264 + },
265 "node_modules/@types/http-assert": {
266 "version": "1.5.3",
267 "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
@@ -377,6 +398,12 @@
398 "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==",
399 "dev": true
400 },
401 + "node_modules/@types/minimatch": {
402 + "version": "3.0.5",
403 + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
404 + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
405 + "dev": true
406 + },
407 "node_modules/@types/minimist": {
408 "version": "1.2.2",
409 "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
@@ -517,6 +544,70 @@
544 "node": ">= 8"
545 }
546 },
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 + },
611 "node_modules/arg": {
612 "version": "4.1.3",
613 "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -540,8 +631,7 @@
631 "node_modules/balanced-match": {
632 "version": "1.0.2",
633 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
543 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
544 - "dev": true
634 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
635 },
636 "node_modules/base64-js": {
637 "version": "1.5.1",
@@ -571,6 +661,16 @@
661 "node": ">=8"
662 }
663 },
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 + },
674 "node_modules/boxen": {
675 "version": "5.1.2",
676 "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
@@ -597,7 +697,6 @@
697 "version": "1.1.11",
698 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
699 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
600 - "dev": true,
700 "dependencies": {
701 "balanced-match": "^1.0.0",
702 "concat-map": "0.0.1"
@@ -643,6 +742,14 @@
742 "ieee754": "^1.1.13"
743 }
744 },
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 + },
753 "node_modules/bytes": {
754 "version": "3.1.1",
755 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -871,6 +978,20 @@
978 "node": ">=0.1.90"
979 }
980 },
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 + },
995 "node_modules/compressible": {
996 "version": "2.0.18",
997 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -885,8 +1006,7 @@
1006 "node_modules/concat-map": {
1007 "version": "0.0.1",
1008 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
888 - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
889 - "dev": true
1009 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
1010 },
1011 "node_modules/configstore": {
1012 "version": "5.0.1",
@@ -954,6 +1074,33 @@
1074 "buffer": "^5.1.0"
1075 }
1076 },
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 + },
1104 "node_modules/create-require": {
1105 "version": "1.1.1",
1106 "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -1105,7 +1252,6 @@
1252 "version": "1.4.4",
1253 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
1254 "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
1108 - "dev": true,
1255 "dependencies": {
1256 "once": "^1.4.0"
1257 }
@@ -1138,6 +1284,14 @@
1284 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1285 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
1286 },
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 + },
1295 "node_modules/eyes": {
1296 "version": "0.1.8",
1297 "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
@@ -1217,11 +1371,15 @@
1371 "node": ">= 0.6"
1372 }
1373 },
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 + },
1379 "node_modules/fs.realpath": {
1380 "version": "1.0.0",
1381 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1223 - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1224 - "dev": true
1382 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
1383 },
1384 "node_modules/fsevents": {
1385 "version": "2.3.2",
@@ -1276,6 +1434,25 @@
1434 "node": ">=6"
1435 }
1436 },
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 + },
1456 "node_modules/glob-parent": {
1457 "version": "5.1.2",
1458 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -1327,8 +1504,7 @@
1504 "node_modules/graceful-fs": {
1505 "version": "4.2.8",
1506 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
1330 - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
1331 - "dev": true
1507 + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
1508 },
1509 "node_modules/growl": {
1510 "version": "1.10.5",
@@ -1509,7 +1685,6 @@
1685 "version": "1.0.6",
1686 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1687 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1512 - "dev": true,
1688 "dependencies": {
1689 "once": "^1.3.0",
1690 "wrappy": "1"
@@ -1697,6 +1872,11 @@
1872 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
1873 "dev": true
1874 },
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 + },
1880 "node_modules/isexe": {
1881 "version": "2.0.0",
1882 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -1883,11 +2063,69 @@
2063 "node": ">=8"
2064 }
2065 },
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 + },
2099 "node_modules/lodash": {
2100 "version": "4.17.21",
2101 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
2102 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
2103 },
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 + },
2129 "node_modules/log-symbols": {
2130 "version": "4.1.0",
2131 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -2023,7 +2261,6 @@
2261 "version": "3.0.4",
2262 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2263 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2026 - "dev": true,
2264 "dependencies": {
2265 "brace-expansion": "^1.1.7"
2266 },
@@ -2355,7 +2592,6 @@
2592 "version": "3.0.0",
2593 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2594 "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2358 - "dev": true,
2595 "engines": {
2596 "node": ">=0.10.0"
2597 }
@@ -2392,7 +2628,6 @@
2628 "version": "1.4.0",
2629 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2630 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2395 - "dev": true,
2631 "dependencies": {
2632 "wrappy": "1"
2633 }
@@ -2456,7 +2691,6 @@
2691 "version": "1.0.1",
2692 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2693 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2459 - "dev": true,
2694 "engines": {
2695 "node": ">=0.10.0"
2696 }
@@ -2486,6 +2720,22 @@
2720 "node": ">=4"
2721 }
2722 },
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 + },
2739 "node_modules/pstree.remy": {
2740 "version": "1.1.8",
2741 "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
@@ -2591,6 +2841,27 @@
2841 "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
2842 "dev": true
2843 },
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 + },
2865 "node_modules/readdirp": {
2866 "version": "3.6.0",
2867 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -2765,6 +3036,33 @@
3036 "node": ">= 0.6"
3037 }
3038 },
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 + },
3066 "node_modules/string-width": {
3067 "version": "4.2.3",
3068 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -2812,6 +3110,21 @@
3110 "node": ">=4"
3111 }
3112 },
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 + },
3128 "node_modules/to-readable-stream": {
3129 "version": "1.0.0",
3130 "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -3028,6 +3341,11 @@
3341 "node": ">=4"
3342 }
3343 },
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 + },
3349 "node_modules/uuid": {
3350 "version": "3.4.0",
3351 "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -3114,8 +3432,7 @@
3432 "node_modules/wrappy": {
3433 "version": "1.0.2",
3434 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3117 - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3118 - "dev": true
3435 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
3436 },
3437 "node_modules/write-file-atomic": {
3438 "version": "3.0.3",
@@ -3231,6 +3548,19 @@
3548 "funding": {
3549 "url": "https://github.com/sponsors/sindresorhus"
3550 }
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 + }
3564 }
3565 },
3566 "dependencies": {
@@ -3332,6 +3662,15 @@
3662 "@types/node": "*"
3663 }
3664 },
3665 + "@types/archiver": {
3666 + "version": "5.1.1",
3667 + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.1.1.tgz",
3668 + "integrity": "sha512-heuaCk0YH5m274NOLSi66H1zX6GtZoMsdE6TYFcpFFjBjg0FoU4i4/M/a/kNlgNg26Xk3g364mNOYe1JaiEPOQ==",
3669 + "dev": true,
3670 + "requires": {
3671 + "@types/glob": "*"
3672 + }
3673 + },
3674 "@types/axios": {
3675 "version": "0.14.0",
3676 "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz",
@@ -3407,6 +3746,16 @@
3746 "@types/range-parser": "*"
3747 }
3748 },
3749 + "@types/glob": {
3750 + "version": "7.2.0",
3751 + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
3752 + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
3753 + "dev": true,
3754 + "requires": {
3755 + "@types/minimatch": "*",
3756 + "@types/node": "*"
3757 + }
3758 + },
3759 "@types/http-assert": {
3760 "version": "1.5.3",
3761 "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
@@ -3543,6 +3892,12 @@
3892 "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==",
3893 "dev": true
3894 },
3895 + "@types/minimatch": {
3896 + "version": "3.0.5",
3897 + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
3898 + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
3899 + "dev": true
3900 + },
3901 "@types/minimist": {
3902 "version": "1.2.2",
3903 "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
@@ -3656,6 +4011,68 @@
4011 "picomatch": "^2.0.4"
4012 }
4013 },
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 + },
4076 "arg": {
4077 "version": "4.1.3",
4078 "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -3679,8 +4096,7 @@
4096 "balanced-match": {
4097 "version": "1.0.2",
4098 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
3682 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
3683 - "dev": true
4099 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
4100 },
4101 "base64-js": {
4102 "version": "1.5.1",
@@ -3693,6 +4109,16 @@
4109 "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
4110 "dev": true
4111 },
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 + },
4122 "boxen": {
4123 "version": "5.1.2",
4124 "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
@@ -3713,7 +4139,6 @@
4139 "version": "1.1.11",
4140 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
4141 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
3716 - "dev": true,
4142 "requires": {
4143 "balanced-match": "^1.0.0",
4144 "concat-map": "0.0.1"
@@ -3742,6 +4167,11 @@
4167 "ieee754": "^1.1.13"
4168 }
4169 },
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 + },
4175 "bytes": {
4176 "version": "3.1.1",
4177 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -3914,6 +4344,17 @@
4344 "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
4345 "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
4346 },
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 + },
4358 "compressible": {
4359 "version": "2.0.18",
4360 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -3925,8 +4366,7 @@
4366 "concat-map": {
4367 "version": "0.0.1",
4368 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
3928 - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
3929 - "dev": true
4369 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
4370 },
4371 "configstore": {
4372 "version": "5.0.1",
@@ -3982,6 +4422,24 @@
4422 "buffer": "^5.1.0"
4423 }
4424 },
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 + },
4443 "create-require": {
4444 "version": "1.1.1",
4445 "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
@@ -4095,7 +4553,6 @@
4553 "version": "1.4.4",
4554 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
4555 "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
4098 - "dev": true,
4556 "requires": {
4557 "once": "^1.4.0"
4558 }
@@ -4122,6 +4579,11 @@
4579 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
4580 "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
4581 },
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 + },
4587 "eyes": {
4588 "version": "0.1.8",
4589 "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
@@ -4172,11 +4634,15 @@
4634 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
4635 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
4636 },
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 + },
4642 "fs.realpath": {
4643 "version": "1.0.0",
4644 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
4178 - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
4179 - "dev": true
4645 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
4646 },
4647 "fsevents": {
4648 "version": "2.3.2",
@@ -4215,6 +4681,19 @@
4681 "pump": "^3.0.0"
4682 }
4683 },
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 + },
4697 "glob-parent": {
4698 "version": "5.1.2",
4699 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -4254,8 +4733,7 @@
4733 "graceful-fs": {
4734 "version": "4.2.8",
4735 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
4257 - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
4258 - "dev": true
4736 + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
4737 },
4738 "growl": {
4739 "version": "1.10.5",
@@ -4376,7 +4854,6 @@
4854 "version": "1.0.6",
4855 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
4856 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
4379 - "dev": true,
4857 "requires": {
4858 "once": "^1.3.0",
4859 "wrappy": "1"
@@ -4510,6 +4987,11 @@
4987 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
4988 "dev": true
4989 },
4990 + "isarray": {
4991 + "version": "1.0.0",
4992 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
4993 + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
4994 + },
4995 "isexe": {
4996 "version": "2.0.0",
4997 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -4670,11 +5152,68 @@
5152 "package-json": "^6.3.0"
5153 }
5154 },
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 + },
5187 "lodash": {
5188 "version": "4.17.21",
5189 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
5190 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
5191 },
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 + },
5217 "log-symbols": {
5218 "version": "4.1.0",
5219 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -4770,7 +5309,6 @@
5309 "version": "3.0.4",
5310 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
5311 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
4773 - "dev": true,
5312 "requires": {
5313 "brace-expansion": "^1.1.7"
5314 }
@@ -4999,8 +5537,7 @@
5537 "normalize-path": {
5538 "version": "3.0.0",
5539 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
5002 - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
5003 - "dev": true
5540 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
5541 },
5542 "normalize-url": {
5543 "version": "4.5.1",
@@ -5025,7 +5562,6 @@
5562 "version": "1.4.0",
5563 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
5564 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
5028 - "dev": true,
5565 "requires": {
5566 "wrappy": "1"
5567 }
@@ -5075,8 +5611,7 @@
5611 "path-is-absolute": {
5612 "version": "1.0.1",
5613 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
5078 - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
5079 - "dev": true
5614 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
5615 },
5616 "path-to-regexp": {
5617 "version": "6.2.0",
@@ -5094,6 +5629,16 @@
5629 "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
5630 "dev": true
5631 },
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 + },
5642 "pstree.remy": {
5643 "version": "1.1.8",
5644 "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
@@ -5172,6 +5717,24 @@
5717 }
5718 }
5719 },
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 + },
5738 "readdirp": {
5739 "version": "3.6.0",
5740 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -5300,6 +5863,21 @@
5863 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
5864 "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
5865 },
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 + },
5881 "string-width": {
5882 "version": "4.2.3",
5883 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -5335,6 +5913,18 @@
5913 "has-flag": "^3.0.0"
5914 }
5915 },
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 + },
5928 "to-readable-stream": {
5929 "version": "1.0.0",
5930 "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -5480,6 +6070,11 @@
6070 "prepend-http": "^2.0.0"
6071 }
6072 },
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 + },
6078 "uuid": {
6079 "version": "3.4.0",
6080 "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -5541,8 +6136,7 @@
6136 "wrappy": {
6137 "version": "1.0.2",
6138 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
5544 - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
5545 - "dev": true
6139 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
6140 },
6141 "write-file-atomic": {
6142 "version": "3.0.3",
@@ -5628,6 +6222,16 @@
6222 "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
6223 "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
6224 "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 + }
6235 }
6236 }
6237 }
package.json
+2
@@ -19,6 +19,7 @@
19 },
20 "dependencies": {
21 "@koa/router": "^10.1.1",
22 + "archiver": "^5.3.0",
23 "fast-glob": "^3.2.7",
24 "koa": "^2.13.4",
25 "koa-better-http-proxy": "^0.2.9",
@@ -31,6 +32,7 @@
32 "yaml": "^1.10.2"
33 },
34 "devDependencies": {
35 + "@types/archiver": "^5.1.1",
36 "@types/axios": "^0.14.0",
37 "@types/koa": "^2.13.4",
38 "@types/koa__router": "^8.0.11",
src/index.ts
+4
@@ -12,6 +12,7 @@ import compress from 'koa-compress'
12 import { Server } from 'http'
13 import { subscribe } from './config'
14 import session from 'koa-session'
15 +import { zipStreamFromFolder } from './zip'
16
17 const BUILD_TIMESTAMP = ""
18
@@ -55,6 +56,9 @@ app.use(async (ctx, next) => {
56 return await next()
57 const { source } = node
58 if (!source || await isDirectory(source)) {
59 + const { get } = ctx.query
60 + if (get === 'zip')
61 + return await zipStreamFromFolder(node, ctx)
62 if (!path.endsWith('/')) // this folder was requested without the trailing /
63 return ctx.redirect(path + '/')
64 if (node.default) {
src/zip.ts new
+19
@@ -0,0 +1,19 @@
1 +import { VfsNode, walkNode } from './vfs'
2 +import { getCurrentUsernameExpanded } from './perm'
3 +import Koa from 'koa'
4 +import archiver from 'archiver'
5 +import { isFile } from './misc'
6 +
7 +export async function zipStreamFromFolder(node: VfsNode, ctx: Koa.Context) {
8 + ctx.status = 200
9 + ctx.mime = 'zip'
10 + const { name } = node
11 + 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()
19 +}