some test for backend

Massimo Melina committed Dec 12, 2021 at 16:25 UTC c69a384979dcb4345acdaaa13707c8e2fad5755f
8 files changed +1010 -23
frontend/src/App.tsx
+1 -1
@@ -27,7 +27,7 @@ function Head() {
27 interface FileObj { n:string, s?:number }
28
29 function FilesList() {
30 - const res = useApi('files_list', { path: useLocation().pathname })?.list
30 + const res = useApi('file_list', { path: useLocation().pathname })?.list
31 if (!res)
32 return h(Loading)
33 return h('ul', {}, res.map(({ n }:FileObj) => {
package-lock.json
+963
@@ -15,13 +15,17 @@
15 "mime-types": "^2.1.34"
16 },
17 "devDependencies": {
18 + "@types/axios": "^0.14.0",
19 "@types/koa": "^2.13.4",
20 "@types/koa__router": "^8.0.11",
21 "@types/koa-bodyparser": "^4.3.4",
22 "@types/koa-mount": "^4.0.1",
23 "@types/koa-static": "^4.0.2",
24 "@types/mime-types": "^2.1.1",
25 + "@types/mocha": "^9.0.0",
26 "@types/node": "^16.11.12",
27 + "axios": "^0.24.0",
28 + "mocha": "^9.1.3",
29 "nodemon": "^2.0.15",
30 "ts-node": "^10.4.0",
31 "typescript": "^4.5.2"
@@ -149,6 +153,16 @@
153 "@types/node": "*"
154 }
155 },
156 + "node_modules/@types/axios": {
157 + "version": "0.14.0",
158 + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz",
159 + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=",
160 + "deprecated": "This is a stub types definition for axios (https://github.com/mzabriskie/axios). axios provides its own type definitions, so you don't need @types/axios installed!",
161 + "dev": true,
162 + "dependencies": {
163 + "axios": "*"
164 + }
165 + },
166 "node_modules/@types/body-parser": {
167 "version": "1.19.2",
168 "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
@@ -310,6 +324,12 @@
324 "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==",
325 "dev": true
326 },
327 + "node_modules/@types/mocha": {
328 + "version": "9.0.0",
329 + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz",
330 + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==",
331 + "dev": true
332 + },
333 "node_modules/@types/node": {
334 "version": "16.11.12",
335 "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz",
@@ -338,6 +358,12 @@
358 "@types/node": "*"
359 }
360 },
361 + "node_modules/@ungap/promise-all-settled": {
362 + "version": "1.1.2",
363 + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
364 + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
365 + "dev": true
366 + },
367 "node_modules/abbrev": {
368 "version": "1.1.1",
369 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -386,6 +412,15 @@
412 "string-width": "^4.1.0"
413 }
414 },
415 + "node_modules/ansi-colors": {
416 + "version": "4.1.1",
417 + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
418 + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
419 + "dev": true,
420 + "engines": {
421 + "node": ">=6"
422 + }
423 + },
424 "node_modules/ansi-regex": {
425 "version": "5.0.1",
426 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -434,6 +469,15 @@
469 "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
470 "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
471 },
472 + "node_modules/axios": {
473 + "version": "0.24.0",
474 + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
475 + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
476 + "dev": true,
477 + "dependencies": {
478 + "follow-redirects": "^1.14.4"
479 + }
480 + },
481 "node_modules/balanced-match": {
482 "version": "1.0.2",
483 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -492,6 +536,12 @@
536 "node": ">=8"
537 }
538 },
539 + "node_modules/browser-stdout": {
540 + "version": "1.3.1",
541 + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
542 + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
543 + "dev": true
544 + },
545 "node_modules/bytes": {
546 "version": "3.1.1",
547 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -654,6 +704,17 @@
704 "url": "https://github.com/sponsors/sindresorhus"
705 }
706 },
707 + "node_modules/cliui": {
708 + "version": "7.0.4",
709 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
710 + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
711 + "dev": true,
712 + "dependencies": {
713 + "string-width": "^4.2.0",
714 + "strip-ansi": "^6.0.0",
715 + "wrap-ansi": "^7.0.0"
716 + }
717 + },
718 "node_modules/clone-response": {
719 "version": "1.0.2",
720 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -807,6 +868,18 @@
868 }
869 }
870 },
871 + "node_modules/decamelize": {
872 + "version": "4.0.0",
873 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
874 + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
875 + "dev": true,
876 + "engines": {
877 + "node": ">=10"
878 + },
879 + "funding": {
880 + "url": "https://github.com/sponsors/sindresorhus"
881 + }
882 + },
883 "node_modules/decompress-response": {
884 "version": "3.3.0",
885 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
@@ -917,6 +990,15 @@
990 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
991 "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM="
992 },
993 + "node_modules/escalade": {
994 + "version": "3.1.1",
995 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
996 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
997 + "dev": true,
998 + "engines": {
999 + "node": ">=6"
1000 + }
1001 + },
1002 "node_modules/escape-goat": {
1003 "version": "2.1.1",
1004 "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
@@ -973,6 +1055,35 @@
1055 "node": ">=8"
1056 }
1057 },
1058 + "node_modules/flat": {
1059 + "version": "5.0.2",
1060 + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
1061 + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
1062 + "dev": true,
1063 + "bin": {
1064 + "flat": "cli.js"
1065 + }
1066 + },
1067 + "node_modules/follow-redirects": {
1068 + "version": "1.14.6",
1069 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
1070 + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
1071 + "dev": true,
1072 + "funding": [
1073 + {
1074 + "type": "individual",
1075 + "url": "https://github.com/sponsors/RubenVerborgh"
1076 + }
1077 + ],
1078 + "engines": {
1079 + "node": ">=4.0"
1080 + },
1081 + "peerDependenciesMeta": {
1082 + "debug": {
1083 + "optional": true
1084 + }
1085 + }
1086 + },
1087 "node_modules/fresh": {
1088 "version": "0.5.2",
1089 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -981,6 +1092,12 @@
1092 "node": ">= 0.6"
1093 }
1094 },
1095 + "node_modules/fs.realpath": {
1096 + "version": "1.0.0",
1097 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1098 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1099 + "dev": true
1100 + },
1101 "node_modules/fsevents": {
1102 "version": "2.3.2",
1103 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -1000,6 +1117,15 @@
1117 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1118 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1119 },
1120 + "node_modules/get-caller-file": {
1121 + "version": "2.0.5",
1122 + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1123 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1124 + "dev": true,
1125 + "engines": {
1126 + "node": "6.* || 8.* || >= 10.*"
1127 + }
1128 + },
1129 "node_modules/get-intrinsic": {
1130 "version": "1.1.1",
1131 "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
@@ -1079,6 +1205,15 @@
1205 "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
1206 "dev": true
1207 },
1208 + "node_modules/growl": {
1209 + "version": "1.10.5",
1210 + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
1211 + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
1212 + "dev": true,
1213 + "engines": {
1214 + "node": ">=4.x"
1215 + }
1216 + },
1217 "node_modules/has": {
1218 "version": "1.0.3",
1219 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -1133,6 +1268,15 @@
1268 "node": ">=8"
1269 }
1270 },
1271 + "node_modules/he": {
1272 + "version": "1.2.0",
1273 + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1274 + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1275 + "dev": true,
1276 + "bin": {
1277 + "he": "bin/he"
1278 + }
1279 + },
1280 "node_modules/http-assert": {
1281 "version": "1.5.0",
1282 "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz",
@@ -1217,6 +1361,16 @@
1361 "node": ">= 0.8.0"
1362 }
1363 },
1364 + "node_modules/inflight": {
1365 + "version": "1.0.6",
1366 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1367 + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1368 + "dev": true,
1369 + "dependencies": {
1370 + "once": "^1.3.0",
1371 + "wrappy": "1"
1372 + }
1373 + },
1374 "node_modules/inherits": {
1375 "version": "2.0.4",
1376 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@@ -1351,18 +1505,45 @@
1505 "node": ">=8"
1506 }
1507 },
1508 + "node_modules/is-plain-obj": {
1509 + "version": "2.1.0",
1510 + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
1511 + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
1512 + "dev": true,
1513 + "engines": {
1514 + "node": ">=8"
1515 + }
1516 + },
1517 "node_modules/is-typedarray": {
1518 "version": "1.0.0",
1519 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1520 "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1521 "dev": true
1522 },
1523 + "node_modules/is-unicode-supported": {
1524 + "version": "0.1.0",
1525 + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
1526 + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
1527 + "dev": true,
1528 + "engines": {
1529 + "node": ">=10"
1530 + },
1531 + "funding": {
1532 + "url": "https://github.com/sponsors/sindresorhus"
1533 + }
1534 + },
1535 "node_modules/is-yarn-global": {
1536 "version": "0.3.0",
1537 "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
1538 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
1539 "dev": true
1540 },
1541 + "node_modules/isexe": {
1542 + "version": "2.0.0",
1543 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1544 + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1545 + "dev": true
1546 + },
1547 "node_modules/isstream": {
1548 "version": "0.1.2",
1549 "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -1526,6 +1707,22 @@
1707 "node": ">=8"
1708 }
1709 },
1710 + "node_modules/log-symbols": {
1711 + "version": "4.1.0",
1712 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
1713 + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
1714 + "dev": true,
1715 + "dependencies": {
1716 + "chalk": "^4.1.0",
1717 + "is-unicode-supported": "^0.1.0"
1718 + },
1719 + "engines": {
1720 + "node": ">=10"
1721 + },
1722 + "funding": {
1723 + "url": "https://github.com/sponsors/sindresorhus"
1724 + }
1725 + },
1726 "node_modules/lowercase-keys": {
1727 "version": "1.0.1",
1728 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
@@ -1659,11 +1856,260 @@
1856 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1857 "dev": true
1858 },
1859 + "node_modules/mocha": {
1860 + "version": "9.1.3",
1861 + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz",
1862 + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==",
1863 + "dev": true,
1864 + "dependencies": {
1865 + "@ungap/promise-all-settled": "1.1.2",
1866 + "ansi-colors": "4.1.1",
1867 + "browser-stdout": "1.3.1",
1868 + "chokidar": "3.5.2",
1869 + "debug": "4.3.2",
1870 + "diff": "5.0.0",
1871 + "escape-string-regexp": "4.0.0",
1872 + "find-up": "5.0.0",
1873 + "glob": "7.1.7",
1874 + "growl": "1.10.5",
1875 + "he": "1.2.0",
1876 + "js-yaml": "4.1.0",
1877 + "log-symbols": "4.1.0",
1878 + "minimatch": "3.0.4",
1879 + "ms": "2.1.3",
1880 + "nanoid": "3.1.25",
1881 + "serialize-javascript": "6.0.0",
1882 + "strip-json-comments": "3.1.1",
1883 + "supports-color": "8.1.1",
1884 + "which": "2.0.2",
1885 + "workerpool": "6.1.5",
1886 + "yargs": "16.2.0",
1887 + "yargs-parser": "20.2.4",
1888 + "yargs-unparser": "2.0.0"
1889 + },
1890 + "bin": {
1891 + "_mocha": "bin/_mocha",
1892 + "mocha": "bin/mocha"
1893 + },
1894 + "engines": {
1895 + "node": ">= 12.0.0"
1896 + },
1897 + "funding": {
1898 + "type": "opencollective",
1899 + "url": "https://opencollective.com/mochajs"
1900 + }
1901 + },
1902 + "node_modules/mocha/node_modules/argparse": {
1903 + "version": "2.0.1",
1904 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1905 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1906 + "dev": true
1907 + },
1908 + "node_modules/mocha/node_modules/debug": {
1909 + "version": "4.3.2",
1910 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
1911 + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
1912 + "dev": true,
1913 + "dependencies": {
1914 + "ms": "2.1.2"
1915 + },
1916 + "engines": {
1917 + "node": ">=6.0"
1918 + },
1919 + "peerDependenciesMeta": {
1920 + "supports-color": {
1921 + "optional": true
1922 + }
1923 + }
1924 + },
1925 + "node_modules/mocha/node_modules/debug/node_modules/ms": {
1926 + "version": "2.1.2",
1927 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1928 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1929 + "dev": true
1930 + },
1931 + "node_modules/mocha/node_modules/diff": {
1932 + "version": "5.0.0",
1933 + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
1934 + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
1935 + "dev": true,
1936 + "engines": {
1937 + "node": ">=0.3.1"
1938 + }
1939 + },
1940 + "node_modules/mocha/node_modules/escape-string-regexp": {
1941 + "version": "4.0.0",
1942 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1943 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1944 + "dev": true,
1945 + "engines": {
1946 + "node": ">=10"
1947 + },
1948 + "funding": {
1949 + "url": "https://github.com/sponsors/sindresorhus"
1950 + }
1951 + },
1952 + "node_modules/mocha/node_modules/find-up": {
1953 + "version": "5.0.0",
1954 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
1955 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
1956 + "dev": true,
1957 + "dependencies": {
1958 + "locate-path": "^6.0.0",
1959 + "path-exists": "^4.0.0"
1960 + },
1961 + "engines": {
1962 + "node": ">=10"
1963 + },
1964 + "funding": {
1965 + "url": "https://github.com/sponsors/sindresorhus"
1966 + }
1967 + },
1968 + "node_modules/mocha/node_modules/glob": {
1969 + "version": "7.1.7",
1970 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
1971 + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
1972 + "dev": true,
1973 + "dependencies": {
1974 + "fs.realpath": "^1.0.0",
1975 + "inflight": "^1.0.4",
1976 + "inherits": "2",
1977 + "minimatch": "^3.0.4",
1978 + "once": "^1.3.0",
1979 + "path-is-absolute": "^1.0.0"
1980 + },
1981 + "engines": {
1982 + "node": "*"
1983 + },
1984 + "funding": {
1985 + "url": "https://github.com/sponsors/isaacs"
1986 + }
1987 + },
1988 + "node_modules/mocha/node_modules/has-flag": {
1989 + "version": "4.0.0",
1990 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1991 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1992 + "dev": true,
1993 + "engines": {
1994 + "node": ">=8"
1995 + }
1996 + },
1997 + "node_modules/mocha/node_modules/js-yaml": {
1998 + "version": "4.1.0",
1999 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2000 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2001 + "dev": true,
2002 + "dependencies": {
2003 + "argparse": "^2.0.1"
2004 + },
2005 + "bin": {
2006 + "js-yaml": "bin/js-yaml.js"
2007 + }
2008 + },
2009 + "node_modules/mocha/node_modules/locate-path": {
2010 + "version": "6.0.0",
2011 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2012 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2013 + "dev": true,
2014 + "dependencies": {
2015 + "p-locate": "^5.0.0"
2016 + },
2017 + "engines": {
2018 + "node": ">=10"
2019 + },
2020 + "funding": {
2021 + "url": "https://github.com/sponsors/sindresorhus"
2022 + }
2023 + },
2024 + "node_modules/mocha/node_modules/ms": {
2025 + "version": "2.1.3",
2026 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2027 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2028 + "dev": true
2029 + },
2030 + "node_modules/mocha/node_modules/p-limit": {
2031 + "version": "3.1.0",
2032 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2033 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2034 + "dev": true,
2035 + "dependencies": {
2036 + "yocto-queue": "^0.1.0"
2037 + },
2038 + "engines": {
2039 + "node": ">=10"
2040 + },
2041 + "funding": {
2042 + "url": "https://github.com/sponsors/sindresorhus"
2043 + }
2044 + },
2045 + "node_modules/mocha/node_modules/p-locate": {
2046 + "version": "5.0.0",
2047 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2048 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2049 + "dev": true,
2050 + "dependencies": {
2051 + "p-limit": "^3.0.2"
2052 + },
2053 + "engines": {
2054 + "node": ">=10"
2055 + },
2056 + "funding": {
2057 + "url": "https://github.com/sponsors/sindresorhus"
2058 + }
2059 + },
2060 + "node_modules/mocha/node_modules/strip-json-comments": {
2061 + "version": "3.1.1",
2062 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2063 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2064 + "dev": true,
2065 + "engines": {
2066 + "node": ">=8"
2067 + },
2068 + "funding": {
2069 + "url": "https://github.com/sponsors/sindresorhus"
2070 + }
2071 + },
2072 + "node_modules/mocha/node_modules/supports-color": {
2073 + "version": "8.1.1",
2074 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
2075 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
2076 + "dev": true,
2077 + "dependencies": {
2078 + "has-flag": "^4.0.0"
2079 + },
2080 + "engines": {
2081 + "node": ">=10"
2082 + },
2083 + "funding": {
2084 + "url": "https://github.com/chalk/supports-color?sponsor=1"
2085 + }
2086 + },
2087 + "node_modules/mocha/node_modules/yargs-parser": {
2088 + "version": "20.2.4",
2089 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
2090 + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
2091 + "dev": true,
2092 + "engines": {
2093 + "node": ">=10"
2094 + }
2095 + },
2096 "node_modules/ms": {
2097 "version": "2.1.2",
2098 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2099 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
2100 },
2101 + "node_modules/nanoid": {
2102 + "version": "3.1.25",
2103 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
2104 + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
2105 + "dev": true,
2106 + "bin": {
2107 + "nanoid": "bin/nanoid.cjs"
2108 + },
2109 + "engines": {
2110 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2111 + }
2112 + },
2113 "node_modules/negotiator": {
2114 "version": "0.6.2",
2115 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@@ -1817,6 +2263,15 @@
2263 "node": ">= 0.8"
2264 }
2265 },
2266 + "node_modules/path-exists": {
2267 + "version": "4.0.0",
2268 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2269 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2270 + "dev": true,
2271 + "engines": {
2272 + "node": ">=8"
2273 + }
2274 + },
2275 "node_modules/path-is-absolute": {
2276 "version": "1.0.1",
2277 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -1911,6 +2366,15 @@
2366 }
2367 ]
2368 },
2369 + "node_modules/randombytes": {
2370 + "version": "2.1.0",
2371 + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2372 + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2373 + "dev": true,
2374 + "dependencies": {
2375 + "safe-buffer": "^5.1.0"
2376 + }
2377 + },
2378 "node_modules/raw-body": {
2379 "version": "2.4.2",
2380 "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
@@ -1982,6 +2446,15 @@
2446 "node": ">=8"
2447 }
2448 },
2449 + "node_modules/require-directory": {
2450 + "version": "2.1.1",
2451 + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2452 + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
2453 + "dev": true,
2454 + "engines": {
2455 + "node": ">=0.10.0"
2456 + }
2457 + },
2458 "node_modules/resolve-path": {
2459 "version": "1.4.0",
2460 "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz",
@@ -2106,6 +2579,15 @@
2579 "semver": "bin/semver.js"
2580 }
2581 },
2582 + "node_modules/serialize-javascript": {
2583 + "version": "6.0.0",
2584 + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
2585 + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
2586 + "dev": true,
2587 + "dependencies": {
2588 + "randombytes": "^2.1.0"
2589 + }
2590 + },
2591 "node_modules/setprototypeof": {
2592 "version": "1.2.0",
2593 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -2417,6 +2899,21 @@
2899 "node": ">= 0.8"
2900 }
2901 },
2902 + "node_modules/which": {
2903 + "version": "2.0.2",
2904 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2905 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2906 + "dev": true,
2907 + "dependencies": {
2908 + "isexe": "^2.0.0"
2909 + },
2910 + "bin": {
2911 + "node-which": "bin/node-which"
2912 + },
2913 + "engines": {
2914 + "node": ">= 8"
2915 + }
2916 + },
2917 "node_modules/widest-line": {
2918 "version": "3.1.0",
2919 "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
@@ -2445,6 +2942,12 @@
2942 "node": ">= 0.10.0"
2943 }
2944 },
2945 + "node_modules/workerpool": {
2946 + "version": "6.1.5",
2947 + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
2948 + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
2949 + "dev": true
2950 + },
2951 "node_modules/wrap-ansi": {
2952 "version": "7.0.0",
2953 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -2489,12 +2992,63 @@
2992 "node": ">=8"
2993 }
2994 },
2995 + "node_modules/y18n": {
2996 + "version": "5.0.8",
2997 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
2998 + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
2999 + "dev": true,
3000 + "engines": {
3001 + "node": ">=10"
3002 + }
3003 + },
3004 "node_modules/yallist": {
3005 "version": "4.0.0",
3006 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
3007 "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
3008 "dev": true
3009 },
3010 + "node_modules/yargs": {
3011 + "version": "16.2.0",
3012 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
3013 + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
3014 + "dev": true,
3015 + "dependencies": {
3016 + "cliui": "^7.0.2",
3017 + "escalade": "^3.1.1",
3018 + "get-caller-file": "^2.0.5",
3019 + "require-directory": "^2.1.1",
3020 + "string-width": "^4.2.0",
3021 + "y18n": "^5.0.5",
3022 + "yargs-parser": "^20.2.2"
3023 + },
3024 + "engines": {
3025 + "node": ">=10"
3026 + }
3027 + },
3028 + "node_modules/yargs-parser": {
3029 + "version": "20.2.9",
3030 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
3031 + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
3032 + "dev": true,
3033 + "engines": {
3034 + "node": ">=10"
3035 + }
3036 + },
3037 + "node_modules/yargs-unparser": {
3038 + "version": "2.0.0",
3039 + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
3040 + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
3041 + "dev": true,
3042 + "dependencies": {
3043 + "camelcase": "^6.0.0",
3044 + "decamelize": "^4.0.0",
3045 + "flat": "^5.0.2",
3046 + "is-plain-obj": "^2.1.0"
3047 + },
3048 + "engines": {
3049 + "node": ">=10"
3050 + }
3051 + },
3052 "node_modules/ylru": {
3053 "version": "1.2.1",
3054 "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz",
@@ -2511,6 +3065,18 @@
3065 "engines": {
3066 "node": ">=6"
3067 }
3068 + },
3069 + "node_modules/yocto-queue": {
3070 + "version": "0.1.0",
3071 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
3072 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
3073 + "dev": true,
3074 + "engines": {
3075 + "node": ">=10"
3076 + },
3077 + "funding": {
3078 + "url": "https://github.com/sponsors/sindresorhus"
3079 + }
3080 }
3081 },
3082 "dependencies": {
@@ -2612,6 +3178,15 @@
3178 "@types/node": "*"
3179 }
3180 },
3181 + "@types/axios": {
3182 + "version": "0.14.0",
3183 + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz",
3184 + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=",
3185 + "dev": true,
3186 + "requires": {
3187 + "axios": "*"
3188 + }
3189 + },
3190 "@types/body-parser": {
3191 "version": "1.19.2",
3192 "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
@@ -2773,6 +3348,12 @@
3348 "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==",
3349 "dev": true
3350 },
3351 + "@types/mocha": {
3352 + "version": "9.0.0",
3353 + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz",
3354 + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==",
3355 + "dev": true
3356 + },
3357 "@types/node": {
3358 "version": "16.11.12",
3359 "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz",
@@ -2801,6 +3382,12 @@
3382 "@types/node": "*"
3383 }
3384 },
3385 + "@ungap/promise-all-settled": {
3386 + "version": "1.1.2",
3387 + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
3388 + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
3389 + "dev": true
3390 + },
3391 "abbrev": {
3392 "version": "1.1.1",
3393 "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -2837,6 +3424,12 @@
3424 "string-width": "^4.1.0"
3425 }
3426 },
3427 + "ansi-colors": {
3428 + "version": "4.1.1",
3429 + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
3430 + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
3431 + "dev": true
3432 + },
3433 "ansi-regex": {
3434 "version": "5.0.1",
3435 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -2873,6 +3466,15 @@
3466 "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
3467 "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
3468 },
3469 + "axios": {
3470 + "version": "0.24.0",
3471 + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
3472 + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
3473 + "dev": true,
3474 + "requires": {
3475 + "follow-redirects": "^1.14.4"
3476 + }
3477 + },
3478 "balanced-match": {
3479 "version": "1.0.2",
3480 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2919,6 +3521,12 @@
3521 "fill-range": "^7.0.1"
3522 }
3523 },
3524 + "browser-stdout": {
3525 + "version": "1.3.1",
3526 + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
3527 + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
3528 + "dev": true
3529 + },
3530 "bytes": {
3531 "version": "3.1.1",
3532 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz",
@@ -3035,6 +3643,17 @@
3643 "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
3644 "dev": true
3645 },
3646 + "cliui": {
3647 + "version": "7.0.4",
3648 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
3649 + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
3650 + "dev": true,
3651 + "requires": {
3652 + "string-width": "^4.2.0",
3653 + "strip-ansi": "^6.0.0",
3654 + "wrap-ansi": "^7.0.0"
3655 + }
3656 + },
3657 "clone-response": {
3658 "version": "1.0.2",
3659 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
@@ -3152,6 +3771,12 @@
3771 "ms": "2.1.2"
3772 }
3773 },
3774 + "decamelize": {
3775 + "version": "4.0.0",
3776 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
3777 + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
3778 + "dev": true
3779 + },
3780 "decompress-response": {
3781 "version": "3.3.0",
3782 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
@@ -3244,6 +3869,12 @@
3869 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
3870 "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM="
3871 },
3872 + "escalade": {
3873 + "version": "3.1.1",
3874 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
3875 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
3876 + "dev": true
3877 + },
3878 "escape-goat": {
3879 "version": "2.1.1",
3880 "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
@@ -3288,11 +3919,29 @@
3919 "to-regex-range": "^5.0.1"
3920 }
3921 },
3922 + "flat": {
3923 + "version": "5.0.2",
3924 + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
3925 + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
3926 + "dev": true
3927 + },
3928 + "follow-redirects": {
3929 + "version": "1.14.6",
3930 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
3931 + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
3932 + "dev": true
3933 + },
3934 "fresh": {
3935 "version": "0.5.2",
3936 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
3937 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
3938 },
3939 + "fs.realpath": {
3940 + "version": "1.0.0",
3941 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
3942 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
3943 + "dev": true
3944 + },
3945 "fsevents": {
3946 "version": "2.3.2",
3947 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -3305,6 +3954,12 @@
3954 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
3955 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
3956 },
3957 + "get-caller-file": {
3958 + "version": "2.0.5",
3959 + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
3960 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
3961 + "dev": true
3962 + },
3963 "get-intrinsic": {
3964 "version": "1.1.1",
3965 "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
@@ -3366,6 +4021,12 @@
4021 "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
4022 "dev": true
4023 },
4024 + "growl": {
4025 + "version": "1.10.5",
4026 + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
4027 + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
4028 + "dev": true
4029 + },
4030 "has": {
4031 "version": "1.0.3",
4032 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -3399,6 +4060,12 @@
4060 "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
4061 "dev": true
4062 },
4063 + "he": {
4064 + "version": "1.2.0",
4065 + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
4066 + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
4067 + "dev": true
4068 + },
4069 "http-assert": {
4070 "version": "1.5.0",
4071 "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz",
@@ -3464,6 +4131,16 @@
4131 "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz",
4132 "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8="
4133 },
4134 + "inflight": {
4135 + "version": "1.0.6",
4136 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
4137 + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
4138 + "dev": true,
4139 + "requires": {
4140 + "once": "^1.3.0",
4141 + "wrappy": "1"
4142 + }
4143 + },
4144 "inherits": {
4145 "version": "2.0.4",
4146 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@@ -3553,18 +4230,36 @@
4230 "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
4231 "dev": true
4232 },
4233 + "is-plain-obj": {
4234 + "version": "2.1.0",
4235 + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
4236 + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
4237 + "dev": true
4238 + },
4239 "is-typedarray": {
4240 "version": "1.0.0",
4241 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
4242 "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
4243 "dev": true
4244 },
4245 + "is-unicode-supported": {
4246 + "version": "0.1.0",
4247 + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
4248 + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
4249 + "dev": true
4250 + },
4251 "is-yarn-global": {
4252 "version": "0.3.0",
4253 "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
4254 "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
4255 "dev": true
4256 },
4257 + "isexe": {
4258 + "version": "2.0.0",
4259 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
4260 + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
4261 + "dev": true
4262 + },
4263 "isstream": {
4264 "version": "0.1.2",
4265 "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -3703,6 +4398,16 @@
4398 "package-json": "^6.3.0"
4399 }
4400 },
4401 + "log-symbols": {
4402 + "version": "4.1.0",
4403 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
4404 + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
4405 + "dev": true,
4406 + "requires": {
4407 + "chalk": "^4.1.0",
4408 + "is-unicode-supported": "^0.1.0"
4409 + }
4410 + },
4411 "lowercase-keys": {
4412 "version": "1.0.1",
4413 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
@@ -3799,11 +4504,179 @@
4504 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
4505 "dev": true
4506 },
4507 + "mocha": {
4508 + "version": "9.1.3",
4509 + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz",
4510 + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==",
4511 + "dev": true,
4512 + "requires": {
4513 + "@ungap/promise-all-settled": "1.1.2",
4514 + "ansi-colors": "4.1.1",
4515 + "browser-stdout": "1.3.1",
4516 + "chokidar": "3.5.2",
4517 + "debug": "4.3.2",
4518 + "diff": "5.0.0",
4519 + "escape-string-regexp": "4.0.0",
4520 + "find-up": "5.0.0",
4521 + "glob": "7.1.7",
4522 + "growl": "1.10.5",
4523 + "he": "1.2.0",
4524 + "js-yaml": "4.1.0",
4525 + "log-symbols": "4.1.0",
4526 + "minimatch": "3.0.4",
4527 + "ms": "2.1.3",
4528 + "nanoid": "3.1.25",
4529 + "serialize-javascript": "6.0.0",
4530 + "strip-json-comments": "3.1.1",
4531 + "supports-color": "8.1.1",
4532 + "which": "2.0.2",
4533 + "workerpool": "6.1.5",
4534 + "yargs": "16.2.0",
4535 + "yargs-parser": "20.2.4",
4536 + "yargs-unparser": "2.0.0"
4537 + },
4538 + "dependencies": {
4539 + "argparse": {
4540 + "version": "2.0.1",
4541 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
4542 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
4543 + "dev": true
4544 + },
4545 + "debug": {
4546 + "version": "4.3.2",
4547 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
4548 + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
4549 + "dev": true,
4550 + "requires": {
4551 + "ms": "2.1.2"
4552 + },
4553 + "dependencies": {
4554 + "ms": {
4555 + "version": "2.1.2",
4556 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
4557 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
4558 + "dev": true
4559 + }
4560 + }
4561 + },
4562 + "diff": {
4563 + "version": "5.0.0",
4564 + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
4565 + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
4566 + "dev": true
4567 + },
4568 + "escape-string-regexp": {
4569 + "version": "4.0.0",
4570 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
4571 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
4572 + "dev": true
4573 + },
4574 + "find-up": {
4575 + "version": "5.0.0",
4576 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
4577 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
4578 + "dev": true,
4579 + "requires": {
4580 + "locate-path": "^6.0.0",
4581 + "path-exists": "^4.0.0"
4582 + }
4583 + },
4584 + "glob": {
4585 + "version": "7.1.7",
4586 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
4587 + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
4588 + "dev": true,
4589 + "requires": {
4590 + "fs.realpath": "^1.0.0",
4591 + "inflight": "^1.0.4",
4592 + "inherits": "2",
4593 + "minimatch": "^3.0.4",
4594 + "once": "^1.3.0",
4595 + "path-is-absolute": "^1.0.0"
4596 + }
4597 + },
4598 + "has-flag": {
4599 + "version": "4.0.0",
4600 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
4601 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
4602 + "dev": true
4603 + },
4604 + "js-yaml": {
4605 + "version": "4.1.0",
4606 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
4607 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
4608 + "dev": true,
4609 + "requires": {
4610 + "argparse": "^2.0.1"
4611 + }
4612 + },
4613 + "locate-path": {
4614 + "version": "6.0.0",
4615 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
4616 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
4617 + "dev": true,
4618 + "requires": {
4619 + "p-locate": "^5.0.0"
4620 + }
4621 + },
4622 + "ms": {
4623 + "version": "2.1.3",
4624 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
4625 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
4626 + "dev": true
4627 + },
4628 + "p-limit": {
4629 + "version": "3.1.0",
4630 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
4631 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
4632 + "dev": true,
4633 + "requires": {
4634 + "yocto-queue": "^0.1.0"
4635 + }
4636 + },
4637 + "p-locate": {
4638 + "version": "5.0.0",
4639 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
4640 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
4641 + "dev": true,
4642 + "requires": {
4643 + "p-limit": "^3.0.2"
4644 + }
4645 + },
4646 + "strip-json-comments": {
4647 + "version": "3.1.1",
4648 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
4649 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
4650 + "dev": true
4651 + },
4652 + "supports-color": {
4653 + "version": "8.1.1",
4654 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
4655 + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
4656 + "dev": true,
4657 + "requires": {
4658 + "has-flag": "^4.0.0"
4659 + }
4660 + },
4661 + "yargs-parser": {
4662 + "version": "20.2.4",
4663 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
4664 + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
4665 + "dev": true
4666 + }
4667 + }
4668 + },
4669 "ms": {
4670 "version": "2.1.2",
4671 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
4672 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
4673 },
4674 + "nanoid": {
4675 + "version": "3.1.25",
4676 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
4677 + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
4678 + "dev": true
4679 + },
4680 "negotiator": {
4681 "version": "0.6.2",
4682 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
@@ -3917,6 +4790,12 @@
4790 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
4791 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
4792 },
4793 + "path-exists": {
4794 + "version": "4.0.0",
4795 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
4796 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
4797 + "dev": true
4798 + },
4799 "path-is-absolute": {
4800 "version": "1.0.1",
4801 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -3976,6 +4855,15 @@
4855 "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
4856 "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
4857 },
4858 + "randombytes": {
4859 + "version": "2.1.0",
4860 + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
4861 + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
4862 + "dev": true,
4863 + "requires": {
4864 + "safe-buffer": "^5.1.0"
4865 + }
4866 + },
4867 "raw-body": {
4868 "version": "2.4.2",
4869 "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz",
@@ -4034,6 +4922,12 @@
4922 "rc": "^1.2.8"
4923 }
4924 },
4925 + "require-directory": {
4926 + "version": "2.1.1",
4927 + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
4928 + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
4929 + "dev": true
4930 + },
4931 "resolve-path": {
4932 "version": "1.4.0",
4933 "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz",
@@ -4126,6 +5020,15 @@
5020 }
5021 }
5022 },
5023 + "serialize-javascript": {
5024 + "version": "6.0.0",
5025 + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
5026 + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
5027 + "dev": true,
5028 + "requires": {
5029 + "randombytes": "^2.1.0"
5030 + }
5031 + },
5032 "setprototypeof": {
5033 "version": "1.2.0",
5034 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -4342,6 +5245,15 @@
5245 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
5246 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
5247 },
5248 + "which": {
5249 + "version": "2.0.2",
5250 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
5251 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
5252 + "dev": true,
5253 + "requires": {
5254 + "isexe": "^2.0.0"
5255 + }
5256 + },
5257 "widest-line": {
5258 "version": "3.1.0",
5259 "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
@@ -4364,6 +5276,12 @@
5276 "stack-trace": "0.0.x"
5277 }
5278 },
5279 + "workerpool": {
5280 + "version": "6.1.5",
5281 + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
5282 + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
5283 + "dev": true
5284 + },
5285 "wrap-ansi": {
5286 "version": "7.0.0",
5287 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -4399,12 +5317,51 @@
5317 "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
5318 "dev": true
5319 },
5320 + "y18n": {
5321 + "version": "5.0.8",
5322 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
5323 + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
5324 + "dev": true
5325 + },
5326 "yallist": {
5327 "version": "4.0.0",
5328 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
5329 "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
5330 "dev": true
5331 },
5332 + "yargs": {
5333 + "version": "16.2.0",
5334 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
5335 + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
5336 + "dev": true,
5337 + "requires": {
5338 + "cliui": "^7.0.2",
5339 + "escalade": "^3.1.1",
5340 + "get-caller-file": "^2.0.5",
5341 + "require-directory": "^2.1.1",
5342 + "string-width": "^4.2.0",
5343 + "y18n": "^5.0.5",
5344 + "yargs-parser": "^20.2.2"
5345 + }
5346 + },
5347 + "yargs-parser": {
5348 + "version": "20.2.9",
5349 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
5350 + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
5351 + "dev": true
5352 + },
5353 + "yargs-unparser": {
5354 + "version": "2.0.0",
5355 + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
5356 + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
5357 + "dev": true,
5358 + "requires": {
5359 + "camelcase": "^6.0.0",
5360 + "decamelize": "^4.0.0",
5361 + "flat": "^5.0.2",
5362 + "is-plain-obj": "^2.1.0"
5363 + }
5364 + },
5365 "ylru": {
5366 "version": "1.2.1",
5367 "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz",
@@ -4415,6 +5372,12 @@
5372 "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
5373 "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
5374 "dev": true
5375 + },
5376 + "yocto-queue": {
5377 + "version": "0.1.0",
5378 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
5379 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
5380 + "dev": true
5381 }
5382 }
5383 }
package.json
+6 -1
@@ -1,7 +1,8 @@
1 {
2 "scripts": {
3 "watch-server": "nodemon --ignore tests/ --watch src -e ts,tsx --exec ts-node src/index.ts",
4 - "start": "node dist"
4 + "start": "node dist",
5 + "test": "mocha -r ts-node/register 'tests/**/*.ts'"
6 },
7 "dependencies": {
8 "@koa/router": "^10.1.1",
@@ -20,7 +21,11 @@
21 "@types/koa-mount": "^4.0.1",
22 "@types/koa-static": "^4.0.2",
23 "@types/mime-types": "^2.1.1",
24 + "@types/mocha": "^9.0.0",
25 "@types/node": "^16.11.12",
26 + "@types/axios": "^0.14.0",
27 + "mocha": "^9.1.3",
28 + "axios": "^0.24.0",
29 "nodemon": "^2.0.15",
30 "ts-node": "^10.4.0",
31 "typescript": "^4.5.2"
src/apis.ts
+1 -1
@@ -1,7 +1,7 @@
1 import glob from 'fast-glob'
2
3 export default {
4 - async files_list(params:any) {
4 + async file_list(params:any) {
5 const res = await glob('.' + (params.path || '/') + '*', {
6 stats: true,
7 dot: true,
src/const.ts new
+8
@@ -0,0 +1,8 @@
1 +export const DEV = process.env.NODE_ENV === 'development' ? 'DEV' : ''
2 +
3 +if (DEV)
4 + console.clear()
5 +
6 +const SPECIAL_URI = '/~/'
7 +export const FRONTEND_URI = SPECIAL_URI + 'front/'
8 +export const API_URI = SPECIAL_URI + 'api/'
src/frontend.ts
+3 -1
@@ -3,19 +3,21 @@ import Koa from 'koa'
3 import MemoMap from './MemoMap'
4 import mime from 'mime-types'
5 import { readFile } from 'fs'
6 -import { DEV, FRONTEND_URI } from '.'
6 +import { DEV, FRONTEND_URI } from './const'
7
8 const FRONTEND = 'frontend/build/'
9
10 export const serveFrontend = DEV ? serveProxyFrontend() : serveStaticFrontend()
11
12 function serveProxyFrontend() {
13 + console.debug('fronted: proxied')
14 return proxy('localhost:3000', {
15 userResDecorator: (res, data) => replaceFrontEndRes(data.toString('utf8'))
16 })
17 }
18
19 function serveStaticFrontend() : Koa.Middleware {
20 + console.debug('fronted: static')
21 const cache = new MemoMap()
22 return async (ctx, next) => {
23 let file = ctx.url
src/index.ts
+6 -19
@@ -4,34 +4,29 @@ import mount from 'koa-mount'
4 import bodyParser from 'koa-bodyparser'
5 import apis from './apis'
6 import { serveFrontend } from './frontend'
7 +import { API_URI, DEV, FRONTEND_URI } from './const'
8
9 const PORT = 80
9 -export const DEV = process.env.NODE_ENV === 'development' ? 'DEV' : ''
10 -const SPECIAL_URI = '/~/'
11 -export const FRONTEND_URI = SPECIAL_URI + 'front/'
12 -const API_URI = SPECIAL_URI + 'api/'
13 -
14 -if (DEV)
15 - console.clear()
10
11 const srv = new Koa()
12 srv.use(async (ctx, next) => {
19 - const r = ctx.request.req
20 - console.debug(r.method, r.url)
13 + console.debug(ctx.request.method, ctx.url) // log all requests
14 + // @ts-ignore
15 + ctx.assert(!ctx.originalUrl.includes('..'), 400, 'cross-dir') // prevent cross-dir
16 await next()
17 })
23 -srv.use(preventCrossDir())
18
19 srv.use(mount(API_URI, new Koa().use(bodyParser()).use(api(apis))))
20
21 const serveFiles = serve('.')
22 +const serveFrontendPrefixed = mount(FRONTEND_URI.slice(0,-1), serveFrontend)
23
24 srv.use(async (ctx, next) => {
25 if (ctx.method === 'GET') {
26 if (ctx.url.endsWith('/'))
27 await serveFrontend(ctx,next)
28 else if (ctx.url.startsWith(FRONTEND_URI))
34 - await mount(FRONTEND_URI, serveFrontend)(ctx,next)
29 + await serveFrontendPrefixed(ctx,next)
30 else
31 await serveFiles(ctx,next)
32 }
@@ -42,14 +37,6 @@ srv.use(async (ctx, next) => {
37 srv.on('error', err => console.error('server error', err))
38 srv.listen(PORT, ()=> console.log('running on port', PORT, DEV, new Date().toLocaleString()))
39
45 -function preventCrossDir() : Koa.Middleware {
46 - return async (ctx, next) => {
47 - // @ts-ignore
48 - ctx.assert(!ctx.originalUrl.includes('..'), 400, 'cross-dir');
49 - await next()
50 - }
51 -}
52 -
40 type ApiHandler = (params?:any, ctx?:any) => any
41 type ApiHandlers = Record<string, ApiHandler>
42
tests/test.ts new
+22
@@ -0,0 +1,22 @@
1 +const axios = require('axios')
2 +
3 +describe('file', () => {
4 + itHttp('md', '/NOTES.md', '##')
5 + itHttp('frontend', '/', '<body>')
6 + itHttp('api.list', '/~/api/file_list', data => Array.isArray(data.list))
7 +})
8 +
9 +type Tester = (x:any) => boolean
10 +
11 +function itHttp(name: string, uri: string, test: string | Tester) {
12 + it(name, () =>
13 + axios.get(uri).then((res: any) => {
14 + if (typeof test === 'string') {
15 + if (!res.data.includes(test))
16 + throw 'bad content: ' + res.data
17 + }
18 + else if (typeof test === 'function')
19 + if (!test(res.data))
20 + throw 'test failed: ' + JSON.stringify(res.data)
21 + }) )
22 +}
\ No newline at end of file