upload via post

Massimo Melina committed Jan 18, 2023 at 15:35 UTC e78289e80cd3604406401e0666bb7883301902f3
9 files changed +403 -200
package-lock.json
+336 -152
@@ -22,6 +22,7 @@
22 "cidr-tools": "^4.3.0",
23 "fast-glob": "^3.2.7",
24 "find-process": "^1.4.7",
25 + "formidable": "^2.1.1",
26 "koa": "^2.13.4",
27 "koa-compress": "^5.1.0",
28 "koa-mount": "^4.0.0",
@@ -40,6 +41,7 @@
41 "devDependencies": {
42 "@types/archiver": "^5.1.1",
43 "@types/basic-auth": "^1.1.3",
44 + "@types/formidable": "^2.0.5",
45 "@types/koa": "^2.13.4",
46 "@types/koa__router": "^8.0.11",
47 "@types/koa-compress": "^4.0.3",
@@ -310,24 +312,24 @@
312 }
313 },
314 "node_modules/@babel/helper-function-name": {
313 - "version": "7.18.9",
314 - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
315 - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
315 + "version": "7.19.0",
316 + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
317 + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
318 "dependencies": {
317 - "@babel/template": "^7.18.6",
318 - "@babel/types": "^7.18.9"
319 + "@babel/template": "^7.18.10",
320 + "@babel/types": "^7.19.0"
321 },
322 "engines": {
323 "node": ">=6.9.0"
324 }
325 },
326 "node_modules/@babel/helper-function-name/node_modules/@babel/types": {
325 - "version": "7.18.13",
326 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
327 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
327 + "version": "7.20.7",
328 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
329 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
330 "dependencies": {
329 - "@babel/helper-string-parser": "^7.18.10",
330 - "@babel/helper-validator-identifier": "^7.18.6",
331 + "@babel/helper-string-parser": "^7.19.4",
332 + "@babel/helper-validator-identifier": "^7.19.1",
333 "to-fast-properties": "^2.0.0"
334 },
335 "engines": {
@@ -383,32 +385,32 @@
385 }
386 },
387 "node_modules/@babel/helper-module-transforms": {
386 - "version": "7.18.9",
387 - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
388 - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
388 + "version": "7.20.11",
389 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
390 + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
391 "peer": true,
392 "dependencies": {
393 "@babel/helper-environment-visitor": "^7.18.9",
394 "@babel/helper-module-imports": "^7.18.6",
393 - "@babel/helper-simple-access": "^7.18.6",
395 + "@babel/helper-simple-access": "^7.20.2",
396 "@babel/helper-split-export-declaration": "^7.18.6",
395 - "@babel/helper-validator-identifier": "^7.18.6",
396 - "@babel/template": "^7.18.6",
397 - "@babel/traverse": "^7.18.9",
398 - "@babel/types": "^7.18.9"
397 + "@babel/helper-validator-identifier": "^7.19.1",
398 + "@babel/template": "^7.20.7",
399 + "@babel/traverse": "^7.20.10",
400 + "@babel/types": "^7.20.7"
401 },
402 "engines": {
403 "node": ">=6.9.0"
404 }
405 },
406 "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": {
405 - "version": "7.18.13",
406 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
407 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
407 + "version": "7.20.7",
408 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
409 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
410 "peer": true,
411 "dependencies": {
410 - "@babel/helper-string-parser": "^7.18.10",
411 - "@babel/helper-validator-identifier": "^7.18.6",
412 + "@babel/helper-string-parser": "^7.19.4",
413 + "@babel/helper-validator-identifier": "^7.19.1",
414 "to-fast-properties": "^2.0.0"
415 },
416 "engines": {
@@ -416,33 +418,33 @@
418 }
419 },
420 "node_modules/@babel/helper-plugin-utils": {
419 - "version": "7.18.9",
420 - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz",
421 - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==",
421 + "version": "7.20.2",
422 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
423 + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
424 "engines": {
425 "node": ">=6.9.0"
426 }
427 },
428 "node_modules/@babel/helper-simple-access": {
427 - "version": "7.18.6",
428 - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz",
429 - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==",
429 + "version": "7.20.2",
430 + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
431 + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
432 "peer": true,
433 "dependencies": {
432 - "@babel/types": "^7.18.6"
434 + "@babel/types": "^7.20.2"
435 },
436 "engines": {
437 "node": ">=6.9.0"
438 }
439 },
440 "node_modules/@babel/helper-simple-access/node_modules/@babel/types": {
439 - "version": "7.18.13",
440 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
441 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
441 + "version": "7.20.7",
442 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
443 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
444 "peer": true,
445 "dependencies": {
444 - "@babel/helper-string-parser": "^7.18.10",
445 - "@babel/helper-validator-identifier": "^7.18.6",
446 + "@babel/helper-string-parser": "^7.19.4",
447 + "@babel/helper-validator-identifier": "^7.19.1",
448 "to-fast-properties": "^2.0.0"
449 },
450 "engines": {
@@ -474,17 +476,17 @@
476 }
477 },
478 "node_modules/@babel/helper-string-parser": {
477 - "version": "7.18.10",
478 - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
479 - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==",
479 + "version": "7.19.4",
480 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
481 + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
482 "engines": {
483 "node": ">=6.9.0"
484 }
485 },
486 "node_modules/@babel/helper-validator-identifier": {
485 - "version": "7.18.6",
486 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
487 - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==",
487 + "version": "7.19.1",
488 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
489 + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
490 "engines": {
491 "node": ">=6.9.0"
492 }
@@ -641,22 +643,22 @@
643 }
644 },
645 "node_modules/@babel/template": {
644 - "version": "7.18.10",
645 - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
646 - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
646 + "version": "7.20.7",
647 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
648 + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
649 "dependencies": {
650 "@babel/code-frame": "^7.18.6",
649 - "@babel/parser": "^7.18.10",
650 - "@babel/types": "^7.18.10"
651 + "@babel/parser": "^7.20.7",
652 + "@babel/types": "^7.20.7"
653 },
654 "engines": {
655 "node": ">=6.9.0"
656 }
657 },
658 "node_modules/@babel/template/node_modules/@babel/parser": {
657 - "version": "7.18.13",
658 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
659 - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==",
659 + "version": "7.20.7",
660 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
661 + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
662 "bin": {
663 "parser": "bin/babel-parser.js"
664 },
@@ -665,12 +667,12 @@
667 }
668 },
669 "node_modules/@babel/template/node_modules/@babel/types": {
668 - "version": "7.18.13",
669 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
670 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
670 + "version": "7.20.7",
671 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
672 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
673 "dependencies": {
672 - "@babel/helper-string-parser": "^7.18.10",
673 - "@babel/helper-validator-identifier": "^7.18.6",
674 + "@babel/helper-string-parser": "^7.19.4",
675 + "@babel/helper-validator-identifier": "^7.19.1",
676 "to-fast-properties": "^2.0.0"
677 },
678 "engines": {
@@ -678,18 +680,18 @@
680 }
681 },
682 "node_modules/@babel/traverse": {
681 - "version": "7.18.13",
682 - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz",
683 - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==",
683 + "version": "7.20.12",
684 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz",
685 + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==",
686 "dependencies": {
687 "@babel/code-frame": "^7.18.6",
686 - "@babel/generator": "^7.18.13",
688 + "@babel/generator": "^7.20.7",
689 "@babel/helper-environment-visitor": "^7.18.9",
688 - "@babel/helper-function-name": "^7.18.9",
690 + "@babel/helper-function-name": "^7.19.0",
691 "@babel/helper-hoist-variables": "^7.18.6",
692 "@babel/helper-split-export-declaration": "^7.18.6",
691 - "@babel/parser": "^7.18.13",
692 - "@babel/types": "^7.18.13",
693 + "@babel/parser": "^7.20.7",
694 + "@babel/types": "^7.20.7",
695 "debug": "^4.1.0",
696 "globals": "^11.1.0"
697 },
@@ -698,11 +700,11 @@
700 }
701 },
702 "node_modules/@babel/traverse/node_modules/@babel/generator": {
701 - "version": "7.18.13",
702 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz",
703 - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==",
703 + "version": "7.20.7",
704 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
705 + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
706 "dependencies": {
705 - "@babel/types": "^7.18.13",
707 + "@babel/types": "^7.20.7",
708 "@jridgewell/gen-mapping": "^0.3.2",
709 "jsesc": "^2.5.1"
710 },
@@ -711,9 +713,9 @@
713 }
714 },
715 "node_modules/@babel/traverse/node_modules/@babel/parser": {
714 - "version": "7.18.13",
715 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
716 - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==",
716 + "version": "7.20.7",
717 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
718 + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==",
719 "bin": {
720 "parser": "bin/babel-parser.js"
721 },
@@ -722,12 +724,12 @@
724 }
725 },
726 "node_modules/@babel/traverse/node_modules/@babel/types": {
725 - "version": "7.18.13",
726 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
727 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
727 + "version": "7.20.7",
728 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
729 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
730 "dependencies": {
729 - "@babel/helper-string-parser": "^7.18.10",
730 - "@babel/helper-validator-identifier": "^7.18.6",
731 + "@babel/helper-string-parser": "^7.19.4",
732 + "@babel/helper-validator-identifier": "^7.19.1",
733 "to-fast-properties": "^2.0.0"
734 },
735 "engines": {
@@ -1836,6 +1838,15 @@
1838 "@types/range-parser": "*"
1839 }
1840 },
1841 + "node_modules/@types/formidable": {
1842 + "version": "2.0.5",
1843 + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.5.tgz",
1844 + "integrity": "sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==",
1845 + "dev": true,
1846 + "dependencies": {
1847 + "@types/node": "*"
1848 + }
1849 + },
1850 "node_modules/@types/glob": {
1851 "version": "7.2.0",
1852 "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
@@ -2237,6 +2248,11 @@
2248 "node": ">=0.10.0"
2249 }
2250 },
2251 + "node_modules/asap": {
2252 + "version": "2.0.6",
2253 + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
2254 + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
2255 + },
2256 "node_modules/at-least-node": {
2257 "version": "1.0.0",
2258 "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -2481,6 +2497,18 @@
2497 "node": ">= 6.0.0"
2498 }
2499 },
2500 + "node_modules/call-bind": {
2501 + "version": "1.0.2",
2502 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
2503 + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
2504 + "dependencies": {
2505 + "function-bind": "^1.1.1",
2506 + "get-intrinsic": "^1.0.2"
2507 + },
2508 + "funding": {
2509 + "url": "https://github.com/sponsors/ljharb"
2510 + }
2511 + },
2512 "node_modules/callsites": {
2513 "version": "3.1.0",
2514 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -3058,6 +3086,15 @@
3086 "node": ">=0.10"
3087 }
3088 },
3089 + "node_modules/dezalgo": {
3090 + "version": "1.0.4",
3091 + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
3092 + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
3093 + "dependencies": {
3094 + "asap": "^2.0.0",
3095 + "wrappy": "1"
3096 + }
3097 + },
3098 "node_modules/diff": {
3099 "version": "5.0.0",
3100 "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
@@ -3331,6 +3368,20 @@
3368 }
3369 }
3370 },
3371 + "node_modules/formidable": {
3372 + "version": "2.1.1",
3373 + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz",
3374 + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==",
3375 + "dependencies": {
3376 + "dezalgo": "^1.0.4",
3377 + "hexoid": "^1.0.0",
3378 + "once": "^1.4.0",
3379 + "qs": "^6.11.0"
3380 + },
3381 + "funding": {
3382 + "url": "https://ko-fi.com/tunnckoCore/commissions"
3383 + }
3384 + },
3385 "node_modules/fresh": {
3386 "version": "0.5.2",
3387 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -3425,6 +3476,19 @@
3476 "node": "6.* || 8.* || >= 10.*"
3477 }
3478 },
3479 + "node_modules/get-intrinsic": {
3480 + "version": "1.1.3",
3481 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
3482 + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
3483 + "dependencies": {
3484 + "function-bind": "^1.1.1",
3485 + "has": "^1.0.3",
3486 + "has-symbols": "^1.0.3"
3487 + },
3488 + "funding": {
3489 + "url": "https://github.com/sponsors/ljharb"
3490 + }
3491 + },
3492 "node_modules/github-from-package": {
3493 "version": "0.0.0",
3494 "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
@@ -3595,6 +3659,14 @@
3659 "tslib": "^2.0.3"
3660 }
3661 },
3662 + "node_modules/hexoid": {
3663 + "version": "1.0.0",
3664 + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
3665 + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==",
3666 + "engines": {
3667 + "node": ">=8"
3668 + }
3669 + },
3670 "node_modules/history": {
3671 "version": "5.3.0",
3672 "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz",
@@ -4914,6 +4986,14 @@
4986 "node": ">=0.10.0"
4987 }
4988 },
4989 + "node_modules/object-inspect": {
4990 + "version": "1.12.3",
4991 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
4992 + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
4993 + "funding": {
4994 + "url": "https://github.com/sponsors/ljharb"
4995 + }
4996 + },
4997 "node_modules/on-finished": {
4998 "version": "2.4.1",
4999 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -4929,7 +5009,6 @@
5009 "version": "1.4.0",
5010 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
5011 "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
4932 - "dev": true,
5012 "dependencies": {
5013 "wrappy": "1"
5014 }
@@ -5419,6 +5498,20 @@
5498 "node": ">=6"
5499 }
5500 },
5501 + "node_modules/qs": {
5502 + "version": "6.11.0",
5503 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
5504 + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
5505 + "dependencies": {
5506 + "side-channel": "^1.0.4"
5507 + },
5508 + "engines": {
5509 + "node": ">=0.6"
5510 + },
5511 + "funding": {
5512 + "url": "https://github.com/sponsors/ljharb"
5513 + }
5514 + },
5515 "node_modules/querystringify": {
5516 "version": "2.2.0",
5517 "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -5971,6 +6064,19 @@
6064 "node": ">=8"
6065 }
6066 },
6067 + "node_modules/side-channel": {
6068 + "version": "1.0.4",
6069 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
6070 + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
6071 + "dependencies": {
6072 + "call-bind": "^1.0.0",
6073 + "get-intrinsic": "^1.0.2",
6074 + "object-inspect": "^1.9.0"
6075 + },
6076 + "funding": {
6077 + "url": "https://github.com/sponsors/ljharb"
6078 + }
6079 + },
6080 "node_modules/signal-exit": {
6081 "version": "3.0.7",
6082 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -6843,8 +6949,7 @@
6949 "node_modules/wrappy": {
6950 "version": "1.0.2",
6951 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
6846 - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
6847 - "dev": true
6952 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
6953 },
6954 "node_modules/y18n": {
6955 "version": "5.0.8",
@@ -7162,21 +7267,21 @@
7267 "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
7268 },
7269 "@babel/helper-function-name": {
7165 - "version": "7.18.9",
7166 - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz",
7167 - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==",
7270 + "version": "7.19.0",
7271 + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
7272 + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
7273 "requires": {
7169 - "@babel/template": "^7.18.6",
7170 - "@babel/types": "^7.18.9"
7274 + "@babel/template": "^7.18.10",
7275 + "@babel/types": "^7.19.0"
7276 },
7277 "dependencies": {
7278 "@babel/types": {
7174 - "version": "7.18.13",
7175 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
7176 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
7279 + "version": "7.20.7",
7280 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
7281 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
7282 "requires": {
7178 - "@babel/helper-string-parser": "^7.18.10",
7179 - "@babel/helper-validator-identifier": "^7.18.6",
7283 + "@babel/helper-string-parser": "^7.19.4",
7284 + "@babel/helper-validator-identifier": "^7.19.1",
7285 "to-fast-properties": "^2.0.0"
7286 }
7287 }
@@ -7223,56 +7328,56 @@
7328 }
7329 },
7330 "@babel/helper-module-transforms": {
7226 - "version": "7.18.9",
7227 - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz",
7228 - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==",
7331 + "version": "7.20.11",
7332 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
7333 + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
7334 "peer": true,
7335 "requires": {
7336 "@babel/helper-environment-visitor": "^7.18.9",
7337 "@babel/helper-module-imports": "^7.18.6",
7233 - "@babel/helper-simple-access": "^7.18.6",
7338 + "@babel/helper-simple-access": "^7.20.2",
7339 "@babel/helper-split-export-declaration": "^7.18.6",
7235 - "@babel/helper-validator-identifier": "^7.18.6",
7236 - "@babel/template": "^7.18.6",
7237 - "@babel/traverse": "^7.18.9",
7238 - "@babel/types": "^7.18.9"
7340 + "@babel/helper-validator-identifier": "^7.19.1",
7341 + "@babel/template": "^7.20.7",
7342 + "@babel/traverse": "^7.20.10",
7343 + "@babel/types": "^7.20.7"
7344 },
7345 "dependencies": {
7346 "@babel/types": {
7242 - "version": "7.18.13",
7243 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
7244 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
7347 + "version": "7.20.7",
7348 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
7349 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
7350 "peer": true,
7351 "requires": {
7247 - "@babel/helper-string-parser": "^7.18.10",
7248 - "@babel/helper-validator-identifier": "^7.18.6",
7352 + "@babel/helper-string-parser": "^7.19.4",
7353 + "@babel/helper-validator-identifier": "^7.19.1",
7354 "to-fast-properties": "^2.0.0"
7355 }
7356 }
7357 }
7358 },
7359 "@babel/helper-plugin-utils": {
7255 - "version": "7.18.9",
7256 - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz",
7257 - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w=="
7360 + "version": "7.20.2",
7361 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
7362 + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ=="
7363 },
7364 "@babel/helper-simple-access": {
7260 - "version": "7.18.6",
7261 - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz",
7262 - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==",
7365 + "version": "7.20.2",
7366 + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
7367 + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
7368 "peer": true,
7369 "requires": {
7265 - "@babel/types": "^7.18.6"
7370 + "@babel/types": "^7.20.2"
7371 },
7372 "dependencies": {
7373 "@babel/types": {
7269 - "version": "7.18.13",
7270 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
7271 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
7374 + "version": "7.20.7",
7375 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
7376 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
7377 "peer": true,
7378 "requires": {
7274 - "@babel/helper-string-parser": "^7.18.10",
7275 - "@babel/helper-validator-identifier": "^7.18.6",
7379 + "@babel/helper-string-parser": "^7.19.4",
7380 + "@babel/helper-validator-identifier": "^7.19.1",
7381 "to-fast-properties": "^2.0.0"
7382 }
7383 }
@@ -7299,14 +7404,14 @@
7404 }
7405 },
7406 "@babel/helper-string-parser": {
7302 - "version": "7.18.10",
7303 - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz",
7304 - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw=="
7407 + "version": "7.19.4",
7408 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
7409 + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
7410 },
7411 "@babel/helper-validator-identifier": {
7307 - "version": "7.18.6",
7308 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
7309 - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g=="
7412 + "version": "7.19.1",
7413 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
7414 + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
7415 },
7416 "@babel/helper-validator-option": {
7417 "version": "7.18.6",
@@ -7422,71 +7527,71 @@
7527 }
7528 },
7529 "@babel/template": {
7425 - "version": "7.18.10",
7426 - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
7427 - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
7530 + "version": "7.20.7",
7531 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
7532 + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
7533 "requires": {
7534 "@babel/code-frame": "^7.18.6",
7430 - "@babel/parser": "^7.18.10",
7431 - "@babel/types": "^7.18.10"
7535 + "@babel/parser": "^7.20.7",
7536 + "@babel/types": "^7.20.7"
7537 },
7538 "dependencies": {
7539 "@babel/parser": {
7435 - "version": "7.18.13",
7436 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
7437 - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg=="
7540 + "version": "7.20.7",
7541 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
7542 + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg=="
7543 },
7544 "@babel/types": {
7440 - "version": "7.18.13",
7441 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
7442 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
7545 + "version": "7.20.7",
7546 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
7547 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
7548 "requires": {
7444 - "@babel/helper-string-parser": "^7.18.10",
7445 - "@babel/helper-validator-identifier": "^7.18.6",
7549 + "@babel/helper-string-parser": "^7.19.4",
7550 + "@babel/helper-validator-identifier": "^7.19.1",
7551 "to-fast-properties": "^2.0.0"
7552 }
7553 }
7554 }
7555 },
7556 "@babel/traverse": {
7452 - "version": "7.18.13",
7453 - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz",
7454 - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==",
7557 + "version": "7.20.12",
7558 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz",
7559 + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==",
7560 "requires": {
7561 "@babel/code-frame": "^7.18.6",
7457 - "@babel/generator": "^7.18.13",
7562 + "@babel/generator": "^7.20.7",
7563 "@babel/helper-environment-visitor": "^7.18.9",
7459 - "@babel/helper-function-name": "^7.18.9",
7564 + "@babel/helper-function-name": "^7.19.0",
7565 "@babel/helper-hoist-variables": "^7.18.6",
7566 "@babel/helper-split-export-declaration": "^7.18.6",
7462 - "@babel/parser": "^7.18.13",
7463 - "@babel/types": "^7.18.13",
7567 + "@babel/parser": "^7.20.7",
7568 + "@babel/types": "^7.20.7",
7569 "debug": "^4.1.0",
7570 "globals": "^11.1.0"
7571 },
7572 "dependencies": {
7573 "@babel/generator": {
7469 - "version": "7.18.13",
7470 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz",
7471 - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==",
7574 + "version": "7.20.7",
7575 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
7576 + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
7577 "requires": {
7473 - "@babel/types": "^7.18.13",
7578 + "@babel/types": "^7.20.7",
7579 "@jridgewell/gen-mapping": "^0.3.2",
7580 "jsesc": "^2.5.1"
7581 }
7582 },
7583 "@babel/parser": {
7479 - "version": "7.18.13",
7480 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz",
7481 - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg=="
7584 + "version": "7.20.7",
7585 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz",
7586 + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg=="
7587 },
7588 "@babel/types": {
7484 - "version": "7.18.13",
7485 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz",
7486 - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==",
7589 + "version": "7.20.7",
7590 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
7591 + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
7592 "requires": {
7488 - "@babel/helper-string-parser": "^7.18.10",
7489 - "@babel/helper-validator-identifier": "^7.18.6",
7593 + "@babel/helper-string-parser": "^7.19.4",
7594 + "@babel/helper-validator-identifier": "^7.19.1",
7595 "to-fast-properties": "^2.0.0"
7596 }
7597 }
@@ -8199,6 +8304,15 @@
8304 "@types/range-parser": "*"
8305 }
8306 },
8307 + "@types/formidable": {
8308 + "version": "2.0.5",
8309 + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.5.tgz",
8310 + "integrity": "sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==",
8311 + "dev": true,
8312 + "requires": {
8313 + "@types/node": "*"
8314 + }
8315 + },
8316 "@types/glob": {
8317 "version": "7.2.0",
8318 "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
@@ -8564,6 +8678,11 @@
8678 "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
8679 "dev": true
8680 },
8681 + "asap": {
8682 + "version": "2.0.6",
8683 + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
8684 + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
8685 + },
8686 "at-least-node": {
8687 "version": "1.0.0",
8688 "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -8725,6 +8844,15 @@
8844 "ylru": "^1.2.0"
8845 }
8846 },
8847 + "call-bind": {
8848 + "version": "1.0.2",
8849 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
8850 + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
8851 + "requires": {
8852 + "function-bind": "^1.1.1",
8853 + "get-intrinsic": "^1.0.2"
8854 + }
8855 + },
8856 "callsites": {
8857 "version": "3.1.0",
8858 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -9150,6 +9278,15 @@
9278 "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
9279 "dev": true
9280 },
9281 + "dezalgo": {
9282 + "version": "1.0.4",
9283 + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
9284 + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
9285 + "requires": {
9286 + "asap": "^2.0.0",
9287 + "wrappy": "1"
9288 + }
9289 + },
9290 "diff": {
9291 "version": "5.0.0",
9292 "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
@@ -9360,6 +9497,17 @@
9497 "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
9498 "dev": true
9499 },
9500 + "formidable": {
9501 + "version": "2.1.1",
9502 + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz",
9503 + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==",
9504 + "requires": {
9505 + "dezalgo": "^1.0.4",
9506 + "hexoid": "^1.0.0",
9507 + "once": "^1.4.0",
9508 + "qs": "^6.11.0"
9509 + }
9510 + },
9511 "fresh": {
9512 "version": "0.5.2",
9513 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -9438,6 +9586,16 @@
9586 "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
9587 "dev": true
9588 },
9589 + "get-intrinsic": {
9590 + "version": "1.1.3",
9591 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
9592 + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
9593 + "requires": {
9594 + "function-bind": "^1.1.1",
9595 + "has": "^1.0.3",
9596 + "has-symbols": "^1.0.3"
9597 + }
9598 + },
9599 "github-from-package": {
9600 "version": "0.0.0",
9601 "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
@@ -9562,6 +9720,11 @@
9720 "tslib": "^2.0.3"
9721 }
9722 },
9723 + "hexoid": {
9724 + "version": "1.0.0",
9725 + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
9726 + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g=="
9727 + },
9728 "history": {
9729 "version": "5.3.0",
9730 "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz",
@@ -10548,6 +10711,11 @@
10711 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
10712 "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
10713 },
10714 + "object-inspect": {
10715 + "version": "1.12.3",
10716 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
10717 + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
10718 + },
10719 "on-finished": {
10720 "version": "2.4.1",
10721 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -10560,7 +10728,6 @@
10728 "version": "1.4.0",
10729 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
10730 "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
10563 - "dev": true,
10731 "requires": {
10732 "wrappy": "1"
10733 }
@@ -10931,6 +11098,14 @@
11098 "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
11099 "dev": true
11100 },
11101 + "qs": {
11102 + "version": "6.11.0",
11103 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
11104 + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
11105 + "requires": {
11106 + "side-channel": "^1.0.4"
11107 + }
11108 + },
11109 "querystringify": {
11110 "version": "2.2.0",
11111 "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -11344,6 +11519,16 @@
11519 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
11520 "dev": true
11521 },
11522 + "side-channel": {
11523 + "version": "1.0.4",
11524 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
11525 + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
11526 + "requires": {
11527 + "call-bind": "^1.0.0",
11528 + "get-intrinsic": "^1.0.2",
11529 + "object-inspect": "^1.9.0"
11530 + }
11531 + },
11532 "signal-exit": {
11533 "version": "3.0.7",
11534 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -11963,8 +12148,7 @@
12148 "wrappy": {
12149 "version": "1.0.2",
12150 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
11966 - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
11967 - "dev": true
12151 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
12152 },
12153 "y18n": {
12154 "version": "5.0.8",
package.json
+2
@@ -64,6 +64,7 @@
64 "cidr-tools": "^4.3.0",
65 "fast-glob": "^3.2.7",
66 "find-process": "^1.4.7",
67 + "formidable": "^2.1.1",
68 "koa": "^2.13.4",
69 "koa-compress": "^5.1.0",
70 "koa-mount": "^4.0.0",
@@ -79,6 +80,7 @@
80 "devDependencies": {
81 "@types/archiver": "^5.1.1",
82 "@types/basic-auth": "^1.1.3",
83 + "@types/formidable": "^2.0.5",
84 "@types/koa": "^2.13.4",
85 "@types/koa__router": "^8.0.11",
86 "@types/koa-compress": "^4.0.3",
plugins/vhosting/plugin.js
+1 -1
@@ -24,7 +24,7 @@ exports.init = api => {
24 let toModify = ctx
25 if (ctx.path.startsWith(api.const.SPECIAL_URI)) { // special uris should be excluded...
26 toModify = ctx.params
27 - if (toModify.path === undefined) // ...unless they carry a path in the query. In that case we'll work that.
27 + if (toModify?.path === undefined) // ...unless they carry a path in the query. In that case we'll work that.
28 return
29 }
30 const hosts = api.getConfig('hosts')
src/apiMiddleware.ts
+6 -3
@@ -3,7 +3,7 @@
3 import Koa from 'koa'
4 import createSSE from './sse'
5 import { Readable } from 'stream'
6 -import { asyncGeneratorToReadable, onOff } from './misc'
6 +import { asyncGeneratorToReadable, objSameKeys, onOff, stream2string, tryJson } from './misc'
7 import events from './events'
8 import { HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_UNAUTHORIZED } from './const'
9 import _, { DebouncedFunc } from 'lodash'
@@ -26,10 +26,13 @@ export function apiMiddleware(apis: ApiHandlers) : Koa.Middleware {
26 ctx.body = 'invalid api'
27 return ctx.status = HTTP_NOT_FOUND
28 }
29 + ctx.params = ctx.method === 'POST' ? tryJson(await stream2string(ctx.req))
30 + : objSameKeys(ctx.query, x => Array.isArray(x) ? x : tryJson(x))
31 + console.debug('API', ctx.method, ctx.path, { ...ctx.params })
32 const csrf = ctx.cookies.get('csrf')
33 // we don't rely on SameSite cookie option because it's https-only
31 - let res = csrf && csrf !== params.csrf ? new ApiError(HTTP_UNAUTHORIZED, 'csrf')
32 - : await apiFun(params || {}, ctx)
34 + let res = csrf && csrf !== ctx.params.csrf ? new ApiError(HTTP_UNAUTHORIZED, 'csrf')
35 + : await apiFun(ctx.params || {}, ctx)
36 if (isAsyncGenerator(res))
37 res = asyncGeneratorToReadable(res)
38 if (res instanceof Readable) { // Readable, we'll go SSE-mode
src/index.ts
+3 -2
@@ -9,7 +9,7 @@ import { frontEndApis } from './frontEndApis'
9 import { log } from './log'
10 import { pluginsMiddleware } from './plugins'
11 import { throttler } from './throttler'
12 -import { headRequests, gzipper, sessions, serveGuiAndSharedFiles, someSecurity, prepareState, paramsDecoder } from './middlewares'
12 +import { headRequests, gzipper, sessions, serveGuiAndSharedFiles, someSecurity, prepareState } from './middlewares'
13 import './listen'
14 import './commands'
15 import { adminApis } from './adminApis'
@@ -17,6 +17,7 @@ import { defineConfig } from './config'
17 import { ok } from 'assert'
18 import _ from 'lodash'
19 import { randomId } from './misc'
20 +//import body from 'koa-better-body'
21
22 ok(_.intersection(Object.keys(frontEndApis), Object.keys(adminApis)).length === 0) // they share same endpoints
23
@@ -29,9 +30,9 @@ app.use(someSecurity)
30 .use(log())
31 .use(throttler)
32 .use(gzipper)
32 - .use(paramsDecoder)
33 .use(pluginsMiddleware())
34 .use(mount(API_URI, apiMiddleware({ ...frontEndApis, ...adminApis })))
35 + //.use(body({ multipart: false }))
36 .use(serveGuiAndSharedFiles)
37 .on('error', errorHandler)
38
src/middlewares.ts
+33 -40
@@ -4,7 +4,6 @@ import compress from 'koa-compress'
4 import Koa from 'koa'
5 import session from 'koa-session'
6 import {
7 - HTTP_FOOL,
7 ADMIN_URI,
8 BUILD_TIMESTAMP,
9 DEV,
@@ -15,12 +14,12 @@ import {
14 } from './const'
15 import { FRONTEND_URI } from './const'
16 import { cantReadStatusCode, hasPermission, nodeIsDirectory, urlToNode, vfs, VfsNode } from './vfs'
18 -import { dirTraversal, objSameKeys, prepareFolder, tryJson } from './misc'
17 +import { dirTraversal } from './misc'
18 import { zipStreamFromFolder } from './zip'
19 import { serveFileNode } from './serveFile'
20 import { serveGuiFiles } from './serveGuiFiles'
21 import mount from 'koa-mount'
23 -import { Readable } from 'stream'
22 +import { once, Readable } from 'stream'
23 import { applyBlock } from './block'
24 import { getAccount } from './perm'
25 import { socket2connection, updateConnection, normalizeIp } from './connections'
@@ -28,8 +27,9 @@ import basicAuth from 'basic-auth'
27 import { SRPClientSession, SRPParameters, SRPRoutines } from 'tssrp6a'
28 import { srpStep1 } from './api.auth'
29 import { basename, dirname, join } from 'path'
31 -import { createWriteStream } from 'fs'
30 +import { createWriteStream, mkdirSync } from 'fs'
31 import { pipeline } from 'stream/promises'
32 +import formidable from 'formidable'
33
34 export const gzipper = compress({
35 threshold: 2048,
@@ -82,11 +82,27 @@ export const serveGuiAndSharedFiles: Koa.Middleware = async (ctx, next) => {
82 const folder = await urlToNode(dirname(decPath), ctx, vfs, v => rest = v+'/'+rest)
83 if (!folder)
84 return ctx.status = HTTP_NOT_FOUND
85 - return await receiveUpload(folder, rest, ctx.req, ctx)
85 + const dest = uploadWriter(folder, rest, ctx)
86 + if (dest) {
87 + await pipeline(ctx.req, dest)
88 + ctx.body = {}
89 + }
90 + return
91 }
92 const node = await urlToNode(path, ctx)
93 if (!node)
94 return ctx.status = HTTP_NOT_FOUND
95 + if (ctx.method === 'POST') { // curl -F upload=@file url/
96 + ctx.body = {}
97 + const form = formidable({
98 + maxFileSize: Infinity,
99 + //@ts-ignore wrong in the .d.ts file
100 + fileWriteStreamHandler: f => uploadWriter(node, f.originalFilename, ctx)
101 + })
102 + form.parse(ctx.req)
103 + await once(form, 'end').catch(()=> {})
104 + return
105 + }
106 const canRead = hasPermission(node, 'can_read', ctx)
107 const isFolder = await nodeIsDirectory(node)
108 if (isFolder && !path.endsWith('/'))
@@ -115,16 +131,17 @@ export const serveGuiAndSharedFiles: Koa.Middleware = async (ctx, next) => {
131 : ctx.status = cantReadStatusCode(def)
132 }
133 return serveFrontendFiles(ctx, next)
118 -}
134
120 -async function receiveUpload(base: VfsNode, path: string, stream: Readable, ctx: Koa.Context) {
121 - if (!base.source || !hasPermission(base, 'can_upload', ctx))
122 - return ctx.status = base.can_upload === false ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED
123 - path = join(base.source, path)
124 - await prepareFolder(path)
125 - const dest = createWriteStream(path)
126 - await pipeline(stream, dest)
127 - ctx.body = '{}'
135 + function uploadWriter(base: VfsNode, path: string, ctx: Koa.Context) {
136 + if (!base.source || !hasPermission(base, 'can_upload', ctx)) {
137 + ctx.status = base.can_upload === false ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED
138 + return
139 + }
140 + path = join(base.source, path)
141 + mkdirSync(dirname(path), { recursive: true })
142 + return createWriteStream(path)
143 + }
144 +
145 }
146
147 let proxyDetected = false
@@ -136,14 +153,14 @@ export const someSecurity: Koa.Middleware = async (ctx, next) => {
153 if (DEV && proxy && [process.env.FRONTEND_PROXY, process.env.ADMIN_PROXY].includes(ctx.get('X-Forwarded-port')))
154 proxy = ''
155 if (dirTraversal(decodeURI(ctx.path)))
139 - return ctx.status = HTTP_FOOL
156 + return ctx.status = 418
157 if (applyBlock(ctx.socket, ctx.ip))
158 return
159 proxyDetected ||= proxy > ''
160 ctx.state.proxiedFor = proxy
161 }
162 catch {
146 - return ctx.status = HTTP_FOOL
163 + return ctx.status = 418
164 }
165 return next()
166 }
@@ -177,27 +194,3 @@ async function srpCheck(username: string, password: string) {
194 const clientRes2 = await clientRes1.step2(BigInt(salt), BigInt(pubKey))
195 return await step1.step2(clientRes2.A, clientRes2.M1).then(() => true, () => false)
196 }
180 -
181 -// unify get/post parameters, with JSON decoding to not be limited to strings
182 -export const paramsDecoder: Koa.Middleware = async (ctx, next) => {
183 - ctx.params = ctx.method === 'POST' ? tryJson(await stream2string(ctx.req))
184 - : objSameKeys(ctx.query, x => Array.isArray(x) ? x : tryJson(x))
185 - await next()
186 -}
187 -
188 -async function stream2string(stream: Readable): Promise<string> {
189 - return new Promise((resolve, reject) => {
190 - let data = ''
191 - stream.on('data', chunk =>
192 - data += chunk)
193 - stream.on('error', reject)
194 - stream.on('end', () => {
195 - try {
196 - resolve(data)
197 - }
198 - catch(e) {
199 - reject(e)
200 - }
201 - })
202 - })
203 -}
src/misc.ts
+18
@@ -10,6 +10,7 @@ export * from './util-http'
10 export * from './util-generators'
11 export * from './util-files'
12 import debounceAsync from './debounceAsync'
13 +import { Readable } from 'stream'
14 export { debounceAsync }
15
16 export type Callback<IN=void, OUT=void> = (x:IN) => OUT
@@ -147,3 +148,20 @@ export function tryJson(s?: string) {
148 try { return s && JSON.parse(s) }
149 catch {}
150 }
151 +
152 +export async function stream2string(stream: Readable): Promise<string> {
153 + return new Promise((resolve, reject) => {
154 + let data = ''
155 + stream.on('data', chunk =>
156 + data += chunk)
157 + stream.on('error', reject)
158 + stream.on('end', () => {
159 + try {
160 + resolve(data)
161 + }
162 + catch(e) {
163 + reject(e)
164 + }
165 + })
166 + })
167 +}
todo.md
+3 -1
@@ -1,4 +1,5 @@
1 # To do
2 +- upload: minimum available disk
3 - admin/fs: check if source exist when set
4 - plugins: after installing, switch to installed (and perhaps highlight new one)
5 - plugins' log, accessible in admin
@@ -36,7 +37,8 @@
37 - remove seconds from time
38 - upload
39 - upload unzipping (while streaming?)
39 -- plugin to make letsencrypt easier
40 +- plugin: upload quota per-account (possibly inheriting), and a default
41 +- plugin: make letsencrypt easier
42 - could be just automatic detection of files by certbot
43 - letsencrypt supports plugins to automatically configure webservers
44 - delete
tsconfig.json
+1 -1
@@ -25,7 +25,7 @@
25 // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
26
27 /* Modules */
28 - "module": "commonjs", /* Specify what module code is generated. */
28 + "module": "node16", /* Specify what module code is generated. */
29 "rootDir": "src", /* Specify the root folder within your source files. */
30 // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
31 // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */