From 522df91408c5910ca1072faea573db33f3f8d2b7 Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Mon, 21 Mar 2022 01:05:38 +0000 Subject: [PATCH] Fully working barebones infrastructure. --- bot/.editorconfig | 2 - bot/.eslintrc | 6 + bot/.gitignore | 12 +- bot/example/conf.json5 | 24 + bot/package.json | 90 +- .../server => }/pages/account-linked.html | 2 + bot/pnpm-lock.yaml | 2384 +---------------- bot/scripts/createEnv.sh | 25 - .../commands/chartSearch/buildChartEmbed.ts | 166 -- bot/src/commands/chartSearch/chartSearch.ts | 120 - bot/src/commands/help/help.ts | 15 - bot/src/commands/ping/ping.ts | 28 + bot/src/config.ts | 155 ++ bot/src/database/mongo.ts | 19 +- .../interactionHandlers/handleIsSelectMenu.ts | 132 +- bot/src/main.ts | 36 +- bot/src/profile/buildProfileEmbed.ts | 150 -- bot/src/profile/fetch.ts | 36 - bot/src/scripts/set-indexes.ts | 8 + bot/src/server/middleware.ts | 4 +- bot/src/server/server.ts | 36 +- bot/src/setup.ts | 87 - bot/src/slashCommands/register.ts | 117 +- bot/src/utils/fetch-tachi.ts | 37 +- bot/src/utils/logger.ts | 31 +- bot/src/utils/return-types.ts | 16 + bot/src/utils/utils.ts | 23 +- bot/tsconfig.json | 2 +- 28 files changed, 612 insertions(+), 3151 deletions(-) create mode 100644 bot/example/conf.json5 rename bot/{src/server => }/pages/account-linked.html (96%) delete mode 100644 bot/scripts/createEnv.sh delete mode 100644 bot/src/commands/chartSearch/buildChartEmbed.ts delete mode 100644 bot/src/commands/chartSearch/chartSearch.ts delete mode 100644 bot/src/commands/help/help.ts create mode 100644 bot/src/commands/ping/ping.ts create mode 100644 bot/src/config.ts delete mode 100644 bot/src/profile/buildProfileEmbed.ts delete mode 100644 bot/src/profile/fetch.ts create mode 100644 bot/src/scripts/set-indexes.ts delete mode 100644 bot/src/setup.ts create mode 100644 bot/src/utils/return-types.ts diff --git a/bot/.editorconfig b/bot/.editorconfig index aa4d75544..bab41260b 100644 --- a/bot/.editorconfig +++ b/bot/.editorconfig @@ -2,8 +2,6 @@ root = true [*] insert_final_newline = true - -[*.{ts,test.ts}] charset = utf-8 indent_style = tab indent_size = 4 diff --git a/bot/.eslintrc b/bot/.eslintrc index 5cf2f5660..88741e04c 100644 --- a/bot/.eslintrc +++ b/bot/.eslintrc @@ -63,6 +63,12 @@ "argsIgnorePattern": "logger" } ], + "@typescript-eslint/consistent-type-assertions": [ + "error", + { + "assertionStyle": "as" + } + ], // breaks with baseUrl "import/no-unresolved": "off", "require-await": "warn", diff --git a/bot/.gitignore b/bot/.gitignore index a7a0cfbba..d9693c77f 100644 --- a/bot/.gitignore +++ b/bot/.gitignore @@ -2,6 +2,16 @@ node_modules .idea .vscode yarn-error.log +.pnpm-debug.log .env +js + conf.json5 -js \ No newline at end of file +*.conf.json5 + +!example/conf.json5 + +# Weird Redis Dumps +*.rdb + +logs \ No newline at end of file diff --git a/bot/example/conf.json5 b/bot/example/conf.json5 new file mode 100644 index 000000000..d0023f53a --- /dev/null +++ b/bot/example/conf.json5 @@ -0,0 +1,24 @@ +// This is an example conf.json5 file, which shows how you should control +// this bot. + +{ + TACHI_SERVER_LOCATION: "https://tachi.example.com", + HTTP_SERVER: { + URL: "https://tachi-bot.example.com", + PORT: 8000, + }, + OAUTH: { + CLIENT_SECRET: "CSfoobar", + CLIENT_ID: "CIfoobar", + }, + MONGO_URL: "mongodb://127.0.0.1:27017", + DISCORD: { + TOKEN: "foobar", + SERVER_ID: "123123123", + GAME_CHANNELS: { + bms: "1234", + usc: "1235", + // ... add more incase needed. + }, + }, +} diff --git a/bot/package.json b/bot/package.json index ead7f7fc5..255f7927f 100644 --- a/bot/package.json +++ b/bot/package.json @@ -1,45 +1,45 @@ -{ - "name": "tachi-bot", - "version": "1.0.0", - "main": "src/index.ts", - "license": "MIT", - "scripts": { - "start": "ts-node -r dotenv/config src/index.ts", - "setup": "./scripts/createEnv.sh", - "lint": "eslint . --fix" - }, - "devDependencies": { - "@types/express": "4.17.13", - "@types/express-serve-static-core": "4.17.24", - "@types/jest": "27.0.1", - "@types/json5": "2.2.0", - "@types/lodash": "4.14.172", - "@types/node": "16.7.10", - "@typescript-eslint/eslint-plugin": "5.10.2", - "@typescript-eslint/parser": "5.10.2", - "discord-api-types": "0.22.0", - "eslint": "8.8.0", - "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.25.4", - "eslint-plugin-prettier": "4.0.0", - "jest": "27.0.6", - "prettier": "2.6.0", - "typescript": "4.3.5" - }, - "dependencies": { - "@discordjs/builders": "0.5.0", - "@discordjs/rest": "0.1.0-canary.0", - "axios": "0.21.4", - "discord.js": "13.1.0", - "dotenv": "10.0.0", - "express": "4.17.1", - "json5": "2.2.0", - "lodash": "4.17.21", - "monk": "^7.3.4", - "node-fetch": "3.2.0", - "prudence": "0.9.6", - "tachi-common": "0.6.11", - "ts-node": "10.2.0", - "winston": "3.3.3" - } -} +{ + "name": "tachi-bot", + "version": "1.0.0", + "main": "src/index.ts", + "license": "MIT", + "scripts": { + "build": "tsc", + "start": "pnpm build && node js/main.js", + "lint": "eslint . --fix" + }, + "devDependencies": { + "@types/express": "4.17.13", + "@types/express-serve-static-core": "4.17.24", + "@types/jest": "27.0.1", + "@types/json5": "2.2.0", + "@types/lodash": "4.14.172", + "@types/node": "16.7.10", + "@typescript-eslint/eslint-plugin": "5.10.2", + "@typescript-eslint/parser": "5.10.2", + "discord-api-types": "0.22.0", + "eslint": "8.8.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-prettier": "4.0.0", + "prettier": "2.6.0", + "typescript": "4.6.2" + }, + "dependencies": { + "@discordjs/builders": "0.5.0", + "@discordjs/rest": "0.1.0-canary.0", + "@types/bson": "1.0.11", + "discord.js": "13.6.0", + "dotenv": "10.0.0", + "express": "4.17.1", + "json5": "2.2.0", + "lodash": "4.17.21", + "mei-logger": "^1.0.3", + "monk": "7.3.4", + "node-fetch": "2.6.7", + "prudence": "0.9.6", + "sync-fetch": "^0.3.1", + "tachi-common": "0.6.11", + "ts-node": "10.2.0" + } +} \ No newline at end of file diff --git a/bot/src/server/pages/account-linked.html b/bot/pages/account-linked.html similarity index 96% rename from bot/src/server/pages/account-linked.html rename to bot/pages/account-linked.html index 2821d45f9..7062225f1 100644 --- a/bot/src/server/pages/account-linked.html +++ b/bot/pages/account-linked.html @@ -70,6 +70,8 @@
Your accounts are now linked! +
+ (You can close this page and use the bot now.)
diff --git a/bot/pnpm-lock.yaml b/bot/pnpm-lock.yaml index 1db96ee1f..b473037ad 100644 --- a/bot/pnpm-lock.yaml +++ b/bot/pnpm-lock.yaml @@ -3,6 +3,7 @@ lockfileVersion: 5.3 specifiers: '@discordjs/builders': 0.5.0 '@discordjs/rest': 0.1.0-canary.0 + '@types/bson': 1.0.11 '@types/express': 4.17.13 '@types/express-serve-static-core': 4.17.24 '@types/jest': 27.0.1 @@ -11,42 +12,42 @@ specifiers: '@types/node': 16.7.10 '@typescript-eslint/eslint-plugin': 5.10.2 '@typescript-eslint/parser': 5.10.2 - axios: 0.21.4 discord-api-types: 0.22.0 - discord.js: 13.1.0 + discord.js: 13.6.0 dotenv: 10.0.0 eslint: 8.8.0 eslint-config-prettier: 8.3.0 eslint-plugin-import: 2.25.4 eslint-plugin-prettier: 4.0.0 express: 4.17.1 - jest: 27.0.6 json5: 2.2.0 lodash: 4.17.21 - monk: ^7.3.4 - node-fetch: 3.2.0 + mei-logger: ^1.0.3 + monk: 7.3.4 + node-fetch: 2.6.7 prettier: 2.6.0 prudence: 0.9.6 + sync-fetch: ^0.3.1 tachi-common: 0.6.11 ts-node: 10.2.0 - typescript: 4.3.5 - winston: 3.3.3 + typescript: 4.6.2 dependencies: '@discordjs/builders': 0.5.0 '@discordjs/rest': 0.1.0-canary.0 - axios: 0.21.4 - discord.js: 13.1.0 + '@types/bson': 1.0.11 + discord.js: 13.6.0 dotenv: 10.0.0 express: 4.17.1 json5: 2.2.0 lodash: 4.17.21 + mei-logger: 1.0.3 monk: 7.3.4 - node-fetch: 3.2.0 + node-fetch: 2.6.7 prudence: 0.9.6 + sync-fetch: 0.3.1 tachi-common: 0.6.11 - ts-node: 10.2.0_beb356ca72e81b2213af3ea8090a4079 - winston: 3.3.3 + ts-node: 10.2.0_11c6e3e3478c740255e54b205a394e0f devDependencies: '@types/express': 4.17.13 @@ -55,349 +56,18 @@ devDependencies: '@types/json5': 2.2.0 '@types/lodash': 4.14.172 '@types/node': 16.7.10 - '@typescript-eslint/eslint-plugin': 5.10.2_2eabba2964e10c98c344d14bda93c3ef - '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.3.5 + '@typescript-eslint/eslint-plugin': 5.10.2_3825743c906d291482650e0123ea3c60 + '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.6.2 discord-api-types: 0.22.0 eslint: 8.8.0 eslint-config-prettier: 8.3.0_eslint@8.8.0 eslint-plugin-import: 2.25.4_eslint@8.8.0 eslint-plugin-prettier: 4.0.0_391cfbd3cc5bbc4fa794542377846d1b - jest: 27.0.6_ts-node@10.2.0 prettier: 2.6.0 - typescript: 4.3.5 + typescript: 4.6.2 packages: - /@ampproject/remapping/2.1.2: - resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.4 - dev: true - - /@babel/code-frame/7.16.7: - resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.16.10 - dev: true - - /@babel/compat-data/7.17.7: - resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core/7.17.8: - resolution: {integrity: sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.1.2 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.7 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.8 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helpers': 7.17.8 - '@babel/parser': 7.17.8 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - convert-source-map: 1.8.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator/7.17.7: - resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.17.7 - '@babel/core': 7.17.8 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.2 - semver: 6.3.0 - dev: true - - /@babel/helper-environment-visitor/7.16.7: - resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-function-name/7.16.7: - resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-get-function-arity': 7.16.7 - '@babel/template': 7.16.7 - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-get-function-arity/7.16.7: - resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-hoist-variables/7.16.7: - resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-module-imports/7.16.7: - resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-module-transforms/7.17.7: - resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.17.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-plugin-utils/7.16.7: - resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access/7.17.7: - resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-split-export-declaration/7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-validator-identifier/7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option/7.16.7: - resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers/7.17.8: - resolution: {integrity: sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight/7.16.10: - resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser/7.17.8: - resolution: {integrity: sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: true - - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.8: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.8: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.8: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.17.8: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.8: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.8: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.8: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.8: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.8: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.8: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.8: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.8: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.17.8: - resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/template/7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.8 - '@babel/types': 7.17.0 - dev: true - - /@babel/traverse/7.17.3: - resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.7 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.16.7 - '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.8 - '@babel/types': 7.17.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types/7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage/0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - /@colors/colors/1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -423,6 +93,17 @@ packages: kuler: 2.0.0 dev: false + /@discordjs/builders/0.11.0: + resolution: {integrity: sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + discord-api-types: 0.26.1 + ts-mixer: 6.0.1 + tslib: 2.3.1 + zod: 3.14.2 + dev: false + /@discordjs/builders/0.5.0: resolution: {integrity: sha512-HP5y4Rqw68o61Qv4qM5tVmDbWi4mdTFftqIOGRo33SNPpLJ1Ga3KEIR2ibKofkmsoQhEpLmopD1AZDs3cKpHuw==} engines: {node: '>=14.0.0', npm: '>=7.0.0'} @@ -438,20 +119,11 @@ packages: resolution: {integrity: sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==} dev: false - /@discordjs/collection/0.2.4: - resolution: {integrity: sha512-PVrEJH+V6Ob0OwfagYQ/57kwt/HNEJxt5jqY4P+S3st9y29t9iokdnGMQoJXG5VEMAQIPbzu9Snw1F6yE8PdLA==} + /@discordjs/collection/0.4.0: + resolution: {integrity: sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dev: false - /@discordjs/form-data/3.0.1: - resolution: {integrity: sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - /@discordjs/rest/0.1.0-canary.0: resolution: {integrity: sha512-d+s//ISYVV+e0w/926wMEeO7vju+Pn11x1JM4tcmVMCHSDgpi6pnFCNAXF1TEdnDcy7xf9tq5cf2pQkb/7ySTQ==} engines: {node: '>=16.0.0'} @@ -500,229 +172,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema/0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console/27.5.1: - resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - chalk: 4.1.2 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - dev: true - - /@jest/core/27.5.1_ts-node@10.2.0: - resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.9 - jest-changed-files: 27.5.1 - jest-config: 27.5.1_ts-node@10.2.0 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 - micromatch: 4.0.4 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /@jest/environment/27.5.1: - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - jest-mock: 27.5.1 - dev: true - - /@jest/fake-timers/27.5.1: - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@sinonjs/fake-timers': 8.1.0 - '@types/node': 16.7.10 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - - /@jest/globals/27.5.1: - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/types': 27.5.1 - expect: 27.5.1 - dev: true - - /@jest/reporters/27.5.1: - resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.0 - graceful-fs: 4.2.9 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.1.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.4 - jest-haste-map: 27.5.1 - jest-resolve: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 4.0.2 - terminal-link: 2.1.1 - v8-to-istanbul: 8.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/source-map/27.5.1: - resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.9 - source-map: 0.6.1 - dev: true - - /@jest/test-result/27.5.1: - resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/console': 27.5.1 - '@jest/types': 27.5.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-sequencer/27.5.1: - resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/test-result': 27.5.1 - graceful-fs: 4.2.9 - jest-haste-map: 27.5.1 - jest-runtime: 27.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/transform/27.5.1: - resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/core': 7.17.8 - '@jest/types': 27.5.1 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.8.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.9 - jest-haste-map: 27.5.1 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - micromatch: 4.0.4 - pirates: 4.0.5 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types/27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 16.7.10 - '@types/yargs': 16.0.4 - chalk: 4.1.2 - dev: true - - /@jridgewell/resolve-uri/3.0.5: - resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec/1.4.11: - resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} - dev: true - - /@jridgewell/trace-mapping/0.3.4: - resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==} - dependencies: - '@jridgewell/resolve-uri': 3.0.5 - '@jridgewell/sourcemap-codec': 1.4.11 - dev: true - /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -760,23 +209,6 @@ packages: engines: {node: '>=10'} dev: false - /@sinonjs/commons/1.8.3: - resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers/8.1.0: - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} - dependencies: - '@sinonjs/commons': 1.8.3 - dev: true - - /@tootallnate/once/1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: true - /@tsconfig/node10/1.0.8: resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} dev: false @@ -793,35 +225,6 @@ packages: resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==} dev: false - /@types/babel__core/7.1.19: - resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} - dependencies: - '@babel/parser': 7.17.8 - '@babel/types': 7.17.0 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.14.2 - dev: true - - /@types/babel__generator/7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@types/babel__template/7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.17.8 - '@babel/types': 7.17.0 - dev: true - - /@types/babel__traverse/7.14.2: - resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} - dependencies: - '@babel/types': 7.17.0 - dev: true - /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: @@ -829,6 +232,12 @@ packages: '@types/node': 16.7.10 dev: true + /@types/bson/1.0.11: + resolution: {integrity: sha512-j+UcCWI+FsbI5/FQP/Kj2CXyplWAz39ktHFkXk84h7dNblKRSoNJs95PZFRd96NQGqsPEPgeclqnznWZr14ZDA==} + dependencies: + '@types/node': 16.7.10 + dev: false + /@types/bson/4.2.0: resolution: {integrity: sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==} deprecated: This is a stub types definition. bson provides its own type definitions, so you do not need this installed. @@ -859,28 +268,6 @@ packages: '@types/serve-static': 1.13.10 dev: true - /@types/graceful-fs/4.1.5: - resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} - dependencies: - '@types/node': 16.7.10 - dev: true - - /@types/istanbul-lib-coverage/2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports/3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - /@types/jest/27.0.1: resolution: {integrity: sha512-HTLpVXHrY69556ozYkcq47TtQJXpcWAWfkoqz+ZGz2JnmZhzlRjprCIyFnetSy8gpDWwTTGBcRVv1J1I1vBrHw==} dependencies: @@ -925,13 +312,16 @@ packages: '@types/node': 16.7.10 dev: false + /@types/node-fetch/2.6.1: + resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==} + dependencies: + '@types/node': 16.7.10 + form-data: 3.0.1 + dev: false + /@types/node/16.7.10: resolution: {integrity: sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==} - /@types/prettier/2.4.4: - resolution: {integrity: sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==} - dev: true - /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true @@ -947,27 +337,13 @@ packages: '@types/node': 16.7.10 dev: true - /@types/stack-utils/2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/ws/7.4.7: - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + /@types/ws/8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: '@types/node': 16.7.10 dev: false - /@types/yargs-parser/21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs/16.0.4: - resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin/5.10.2_2eabba2964e10c98c344d14bda93c3ef: + /@typescript-eslint/eslint-plugin/5.10.2_3825743c906d291482650e0123ea3c60: resolution: {integrity: sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -978,23 +354,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.3.5 + '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.6.2 '@typescript-eslint/scope-manager': 5.10.2 - '@typescript-eslint/type-utils': 5.10.2_eslint@8.8.0+typescript@4.3.5 - '@typescript-eslint/utils': 5.10.2_eslint@8.8.0+typescript@4.3.5 + '@typescript-eslint/type-utils': 5.10.2_eslint@8.8.0+typescript@4.6.2 + '@typescript-eslint/utils': 5.10.2_eslint@8.8.0+typescript@4.6.2 debug: 4.3.4 eslint: 8.8.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.3.5 - typescript: 4.3.5 + tsutils: 3.21.0_typescript@4.6.2 + typescript: 4.6.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.10.2_eslint@8.8.0+typescript@4.3.5: + /@typescript-eslint/parser/5.10.2_eslint@8.8.0+typescript@4.6.2: resolution: {integrity: sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1006,10 +382,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.10.2 '@typescript-eslint/types': 5.10.2 - '@typescript-eslint/typescript-estree': 5.10.2_typescript@4.3.5 + '@typescript-eslint/typescript-estree': 5.10.2_typescript@4.6.2 debug: 4.3.4 eslint: 8.8.0 - typescript: 4.3.5 + typescript: 4.6.2 transitivePeerDependencies: - supports-color dev: true @@ -1022,7 +398,7 @@ packages: '@typescript-eslint/visitor-keys': 5.10.2 dev: true - /@typescript-eslint/type-utils/5.10.2_eslint@8.8.0+typescript@4.3.5: + /@typescript-eslint/type-utils/5.10.2_eslint@8.8.0+typescript@4.6.2: resolution: {integrity: sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1032,11 +408,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.10.2_eslint@8.8.0+typescript@4.3.5 + '@typescript-eslint/utils': 5.10.2_eslint@8.8.0+typescript@4.6.2 debug: 4.3.4 eslint: 8.8.0 - tsutils: 3.21.0_typescript@4.3.5 - typescript: 4.3.5 + tsutils: 3.21.0_typescript@4.6.2 + typescript: 4.6.2 transitivePeerDependencies: - supports-color dev: true @@ -1046,7 +422,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.10.2_typescript@4.3.5: + /@typescript-eslint/typescript-estree/5.10.2_typescript@4.6.2: resolution: {integrity: sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1061,13 +437,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.3.5 - typescript: 4.3.5 + tsutils: 3.21.0_typescript@4.6.2 + typescript: 4.6.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.10.2_eslint@8.8.0+typescript@4.3.5: + /@typescript-eslint/utils/5.10.2_eslint@8.8.0+typescript@4.6.2: resolution: {integrity: sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1076,7 +452,7 @@ packages: '@types/json-schema': 7.0.10 '@typescript-eslint/scope-manager': 5.10.2 '@typescript-eslint/types': 5.10.2 - '@typescript-eslint/typescript-estree': 5.10.2_typescript@4.3.5 + '@typescript-eslint/typescript-estree': 5.10.2_typescript@4.6.2 eslint: 8.8.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.8.0 @@ -1093,10 +469,6 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /abab/2.0.5: - resolution: {integrity: sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==} - dev: true - /abort-controller/3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -1112,13 +484,6 @@ packages: negotiator: 0.6.3 dev: false - /acorn-globals/6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - dev: true - /acorn-jsx/5.3.2_acorn@8.7.0: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1127,36 +492,16 @@ packages: acorn: 8.7.0 dev: true - /acorn-walk/7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: true - /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: false - /acorn/7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /acorn/8.7.0: resolution: {integrity: sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==} engines: {node: '>=0.4.0'} hasBin: true - /agent-base/6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -1166,25 +511,11 @@ packages: uri-js: 4.4.1 dev: true - /ansi-escapes/4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1197,24 +528,10 @@ packages: engines: {node: '>=10'} dev: true - /anymatch/3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: false - /argparse/1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1254,88 +571,8 @@ packages: /asynckit/0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} - - /axios/0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - dependencies: - follow-redirects: 1.14.9 - transitivePeerDependencies: - - debug dev: false - /babel-jest/27.5.1_@babel+core@7.17.8: - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.17.8 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__core': 7.1.19 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1_@babel+core@7.17.8 - chalk: 4.1.2 - graceful-fs: 4.2.9 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul/6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.16.7 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.1.0 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist/27.5.1: - resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.17.0 - '@types/babel__core': 7.1.19 - '@types/babel__traverse': 7.14.2 - dev: true - - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.8: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.8 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.17.8 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.8 - dev: true - - /babel-preset-jest/27.5.1_@babel+core@7.17.8: - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.8 - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 - dev: true - /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1381,28 +618,6 @@ packages: fill-range: 7.0.1 dev: true - /browser-process-hrtime/1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: true - - /browserslist/4.20.2: - resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001319 - electron-to-chromium: 1.4.88 - escalade: 3.1.1 - node-releases: 2.0.2 - picocolors: 1.0.0 - dev: true - - /bser/2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - /bson/1.1.6: resolution: {integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==} engines: {node: '>=0.6.19'} @@ -1415,10 +630,6 @@ packages: buffer: 5.7.1 dev: false - /buffer-from/1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - /buffer/5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -1442,29 +653,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camelcase/5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase/6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite/1.0.30001319: - resolution: {integrity: sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==} - dev: true - - /chalk/2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1473,40 +661,11 @@ packages: supports-color: 7.2.0 dev: true - /char-regex/1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /ci-info/3.3.0: - resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} - dev: true - - /cjs-module-lexer/1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - dev: true - - /cliui/7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /co/4.6.0: - resolution: {integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collect-v8-coverage/1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - dev: true - /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: false /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -1517,6 +676,7 @@ packages: /color-name/1.1.3: resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + dev: false /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1547,6 +707,7 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 + dev: false /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} @@ -1564,12 +725,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /convert-source-map/1.8.0: - resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} - dependencies: - safe-buffer: 5.1.2 - dev: true - /cookie-signature/1.0.6: resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} dev: false @@ -1596,35 +751,6 @@ packages: which: 2.0.2 dev: true - /cssom/0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true - - /cssom/0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: true - - /cssstyle/2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: true - - /data-uri-to-buffer/4.0.0: - resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} - engines: {node: '>= 12'} - dev: false - - /data-urls/2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} - dependencies: - abab: 2.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - dev: true - /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} dependencies: @@ -1647,23 +773,10 @@ packages: dependencies: ms: 2.1.2 - /decimal.js/10.3.1: - resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} - dev: true - - /dedent/0.7.0: - resolution: {integrity: sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=} - dev: true - /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.2.2: - resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} - engines: {node: '>=0.10.0'} - dev: true - /define-properties/1.1.3: resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} engines: {node: '>= 0.4'} @@ -1674,6 +787,7 @@ packages: /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} + dev: false /denque/1.5.1: resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} @@ -1689,11 +803,6 @@ packages: resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} dev: false - /detect-newline/3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - /diff-sequences/27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -1722,18 +831,24 @@ packages: engines: {node: '>=12'} deprecated: No longer supported. Install the latest release! - /discord.js/13.1.0: - resolution: {integrity: sha512-gxO4CXKdHpqA+WKG+f5RNnd3srTDj5uFJHgOathksDE90YNq/Qijkd2WlMgTTMS6AJoEnHxI7G9eDQHCuZ+xDA==} + /discord-api-types/0.26.1: + resolution: {integrity: sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==} + engines: {node: '>=12'} + dev: false + + /discord.js/13.6.0: + resolution: {integrity: sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==} engines: {node: '>=16.6.0', npm: '>=7.0.0'} dependencies: - '@discordjs/builders': 0.5.0 - '@discordjs/collection': 0.2.4 - '@discordjs/form-data': 3.0.1 + '@discordjs/builders': 0.11.0 + '@discordjs/collection': 0.4.0 '@sapphire/async-queue': 1.3.0 - '@types/ws': 7.4.7 - discord-api-types: 0.22.0 + '@types/node-fetch': 2.6.1 + '@types/ws': 8.5.3 + discord-api-types: 0.26.1 + form-data: 4.0.0 node-fetch: 2.6.7 - ws: 7.5.7 + ws: 8.5.0 transitivePeerDependencies: - bufferutil - encoding @@ -1754,13 +869,6 @@ packages: esutils: 2.0.3 dev: true - /domexception/2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - dependencies: - webidl-conversions: 5.0.0 - dev: true - /dot-prop/6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -1777,19 +885,6 @@ packages: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: false - /electron-to-chromium/1.4.88: - resolution: {integrity: sha512-oA7mzccefkvTNi9u7DXmT0LqvhnOiN2BhSrKerta7HeUC1cLoIwtbf2wL+Ah2ozh5KQd3/1njrGrwDBXx6d14Q==} - dev: true - - /emittery/0.8.1: - resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} - engines: {node: '>=10'} - dev: true - - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - /enabled/2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} dev: false @@ -1799,12 +894,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /error-ex/1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - /es-abstract/1.19.1: resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==} engines: {node: '>= 0.4'} @@ -1840,43 +929,15 @@ packages: is-symbol: 1.0.4 dev: true - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - /escape-html/1.0.3: resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} dev: false - /escape-string-regexp/1.0.5: - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp/2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escodegen/2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - dev: true - /eslint-config-prettier/8.3.0_eslint@8.8.0: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true @@ -2029,12 +1090,6 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /esprima/4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - /esquery/1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} @@ -2074,36 +1129,6 @@ packages: engines: {node: '>=6'} dev: false - /execa/5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exit/0.1.2: - resolution: {integrity: sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=} - engines: {node: '>= 0.8.0'} - dev: true - - /expect/27.5.1: - resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - jest-get-type: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - dev: true - /express/4.17.1: resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==} engines: {node: '>= 0.10.0'} @@ -2173,24 +1198,10 @@ packages: reusify: 1.0.4 dev: true - /fb-watchman/2.0.1: - resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} - dependencies: - bser: 2.1.1 - dev: true - /fecha/4.2.1: resolution: {integrity: sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==} dev: false - /fetch-blob/3.1.5: - resolution: {integrity: sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.0 - dev: false - /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2225,14 +1236,6 @@ packages: locate-path: 2.0.0 dev: true - /find-up/4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /flat-cache/3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2249,16 +1252,6 @@ packages: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} dev: false - /follow-redirects/1.14.9: - resolution: {integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /form-data/3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -2266,7 +1259,7 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true + dev: false /form-data/4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -2277,13 +1270,6 @@ packages: mime-types: 2.1.35 dev: false - /formdata-polyfill/4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.1.5 - dev: false - /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -2298,14 +1284,6 @@ packages: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} dev: true - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true @@ -2314,16 +1292,6 @@ packages: resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} dev: true - /gensync/1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - /get-intrinsic/1.1.1: resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} dependencies: @@ -2332,16 +1300,6 @@ packages: has-symbols: 1.0.3 dev: true - /get-package-type/0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-stream/6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -2375,11 +1333,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals/11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - /globals/13.13.0: resolution: {integrity: sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==} engines: {node: '>=8'} @@ -2399,19 +1352,10 @@ packages: slash: 3.0.0 dev: true - /graceful-fs/4.2.9: - resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} - dev: true - /has-bigints/1.0.1: resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} dev: true - /has-flag/3.0.0: - resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} - engines: {node: '>=4'} - dev: true - /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2436,17 +1380,6 @@ packages: function-bind: 1.1.1 dev: true - /html-encoding-sniffer/2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} - dependencies: - whatwg-encoding: 1.0.5 - dev: true - - /html-escaper/2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /http-errors/1.7.2: resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==} engines: {node: '>= 0.6'} @@ -2469,37 +1402,12 @@ packages: toidentifier: 1.0.0 dev: false - /http-proxy-agent/4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /https-proxy-agent/5.0.0: - resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /human-signals/2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2518,15 +1426,6 @@ packages: resolve-from: 4.0.0 dev: true - /import-local/3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash/0.1.4: resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} engines: {node: '>=0.8.19'} @@ -2560,10 +1459,6 @@ packages: engines: {node: '>= 0.10'} dev: false - /is-arrayish/0.2.1: - resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} - dev: true - /is-arrayish/0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false @@ -2605,16 +1500,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-generator-fn/2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2644,10 +1529,6 @@ packages: engines: {node: '>=8'} dev: false - /is-potential-custom-element-name/1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2663,6 +1544,7 @@ packages: /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + dev: false /is-string/1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -2678,10 +1560,6 @@ packages: has-symbols: 1.0.3 dev: true - /is-typedarray/1.0.0: - resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} - dev: true - /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -2696,159 +1574,6 @@ packages: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true - /istanbul-lib-coverage/3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument/5.1.0: - resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.17.8 - '@babel/parser': 7.17.8 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps/4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports/3.1.4: - resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /jest-changed-files/27.5.1: - resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - execa: 5.1.1 - throat: 6.0.1 - dev: true - - /jest-circus/27.5.1: - resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli/27.5.1_ts-node@10.2.0: - resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1_ts-node@10.2.0 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.9 - import-local: 3.1.0 - jest-config: 27.5.1_ts-node@10.2.0 - jest-util: 27.5.1 - jest-validate: 27.5.1 - prompts: 2.4.2 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /jest-config/27.5.1_ts-node@10.2.0: - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true - dependencies: - '@babel/core': 7.17.8 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.17.8 - chalk: 4.1.2 - ci-info: 3.3.0 - deepmerge: 4.2.2 - glob: 7.2.0 - graceful-fs: 4.2.9 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.4 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.2.0_beb356ca72e81b2213af3ea8090a4079 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - /jest-diff/27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2859,368 +1584,11 @@ packages: pretty-format: 27.5.1 dev: true - /jest-docblock/27.5.1: - resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each/27.5.1: - resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - jest-get-type: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-environment-jsdom/27.5.1: - resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - jest-mock: 27.5.1 - jest-util: 27.5.1 - jsdom: 16.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-environment-node/27.5.1: - resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - /jest-get-type/27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-haste-map/27.5.1: - resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/graceful-fs': 4.1.5 - '@types/node': 16.7.10 - anymatch: 3.1.2 - fb-watchman: 2.0.1 - graceful-fs: 4.2.9 - jest-regex-util: 27.5.1 - jest-serializer: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - micromatch: 4.0.4 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-jasmine2/27.5.1: - resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - chalk: 4.1.2 - co: 4.6.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-leak-detector/27.5.1: - resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-matcher-utils/27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-message-util/27.5.1: - resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/code-frame': 7.16.7 - '@jest/types': 27.5.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.9 - micromatch: 4.0.4 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - dev: true - - /jest-mock/27.5.1: - resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - dev: true - - /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 27.5.1 - dev: true - - /jest-regex-util/27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /jest-resolve-dependencies/27.5.1: - resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - jest-regex-util: 27.5.1 - jest-snapshot: 27.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve/27.5.1: - resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - graceful-fs: 4.2.9 - jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - resolve: 1.22.0 - resolve.exports: 1.1.0 - slash: 3.0.0 - dev: true - - /jest-runner/27.5.1: - resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/console': 27.5.1 - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - chalk: 4.1.2 - emittery: 0.8.1 - graceful-fs: 4.2.9 - jest-docblock: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-haste-map: 27.5.1 - jest-leak-detector: 27.5.1 - jest-message-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runtime: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - source-map-support: 0.5.21 - throat: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-runtime/27.5.1: - resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/globals': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - execa: 5.1.1 - glob: 7.2.0 - graceful-fs: 4.2.9 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-serializer/27.5.1: - resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/node': 16.7.10 - graceful-fs: 4.2.9 - dev: true - - /jest-snapshot/27.5.1: - resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/core': 7.17.8 - '@babel/generator': 7.17.7 - '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.17.8 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__traverse': 7.14.2 - '@types/prettier': 2.4.4 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 - chalk: 4.1.2 - expect: 27.5.1 - graceful-fs: 4.2.9 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - jest-haste-map: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - natural-compare: 1.4.0 - pretty-format: 27.5.1 - semver: 7.3.5 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util/27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - chalk: 4.1.2 - ci-info: 3.3.0 - graceful-fs: 4.2.9 - picomatch: 2.3.1 - dev: true - - /jest-validate/27.5.1: - resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 27.5.1 - leven: 3.1.0 - pretty-format: 27.5.1 - dev: true - - /jest-watcher/27.5.1: - resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 16.7.10 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest-util: 27.5.1 - string-length: 4.0.2 - dev: true - - /jest-worker/27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 16.7.10 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest/27.0.6_ts-node@10.2.0: - resolution: {integrity: sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1_ts-node@10.2.0 - import-local: 3.1.0 - jest-cli: 27.5.1_ts-node@10.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-yaml/3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -3228,58 +1596,6 @@ packages: argparse: 2.0.1 dev: true - /jsdom/16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.5 - acorn: 8.7.0 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.3.1 - domexception: 2.0.1 - escodegen: 2.0.0 - form-data: 3.0.1 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.0 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.0 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.0.0 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.7 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /jsesc/2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-parse-even-better-errors/2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -3302,28 +1618,10 @@ packages: dependencies: minimist: 1.2.5 - /kleur/3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - /kuler/2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} dev: false - /leven/3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /levn/0.3.0: - resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3332,10 +1630,6 @@ packages: type-check: 0.4.0 dev: true - /lines-and-columns/1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - /locate-path/2.0.0: resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} engines: {node: '>=4'} @@ -3344,13 +1638,6 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - /lodash.isequal/4.5.0: resolution: {integrity: sha1-QVxEePK8wwEgwizhDtMib30+GOA=} dev: false @@ -3361,6 +1648,7 @@ packages: /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false /logform/2.4.0: resolution: {integrity: sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==} @@ -3379,28 +1667,21 @@ packages: yallist: 4.0.0 dev: true - /make-dir/3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: false - /makeerror/1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - /media-typer/0.3.0: resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} dev: false + /mei-logger/1.0.3: + resolution: {integrity: sha512-s6dMacOWAfDSQ58idaRpiE/xCVsbHSrixnGs9YZbafLNgZHZ9/ByTsGdogU1GwpGKFxgc9QRDVqKxfUA3FhkHA==} + dependencies: + winston: 3.3.3 + dev: false + /memory-pager/1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} dev: false @@ -3410,10 +1691,6 @@ packages: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} dev: false - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -3435,12 +1712,14 @@ packages: /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + dev: false /mime-types/2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + dev: false /mime/1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -3448,11 +1727,6 @@ packages: hasBin: true dev: false - /mimic-fn/2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -3564,11 +1838,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /node-domexception/1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - /node-fetch/2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -3581,39 +1850,6 @@ packages: whatwg-url: 5.0.0 dev: false - /node-fetch/3.2.0: - resolution: {integrity: sha512-8xeimMwMItMw8hRrOl3C9/xzU49HV/yE6ORew/l+dxWimO5A4Ra8ld2rerlJvc/O7et5Z1zrWsPX43v1QBjCxw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.0 - fetch-blob: 3.1.5 - formdata-polyfill: 4.0.10 - dev: false - - /node-int64/0.4.0: - resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} - dev: true - - /node-releases/2.0.2: - resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} - dev: true - - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /npm-run-path/4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /nwsapi/2.2.0: - resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} - dev: true - /object-assign/4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} @@ -3666,13 +1902,6 @@ packages: fn.name: 1.1.0 dev: false - /onetime/5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - /optional-require/1.1.8: resolution: {integrity: sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==} engines: {node: '>=4'} @@ -3680,18 +1909,6 @@ packages: require-at: 1.0.6 dev: false - /optionator/0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -3723,13 +1940,6 @@ packages: p-try: 1.0.0 dev: true - /p-limit/2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - /p-locate/2.0.0: resolution: {integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=} engines: {node: '>=4'} @@ -3737,23 +1947,11 @@ packages: p-limit: 1.3.0 dev: true - /p-locate/4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - /p-try/1.0.0: resolution: {integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=} engines: {node: '>=4'} dev: true - /p-try/2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3761,20 +1959,6 @@ packages: callsites: 3.1.0 dev: true - /parse-json/5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.16.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse5/6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true - /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3785,11 +1969,6 @@ packages: engines: {node: '>=4'} dev: true - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - /path-is-absolute/1.0.1: resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} engines: {node: '>=0.10.0'} @@ -3813,32 +1992,11 @@ packages: engines: {node: '>=8'} dev: true - /picocolors/1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pirates/4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - dev: true - - /pkg-dir/4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /prelude-ls/1.1.2: - resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} - engines: {node: '>= 0.8.0'} - dev: true - /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3870,14 +2028,6 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /prompts/2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3890,10 +2040,6 @@ packages: resolution: {integrity: sha512-kCPaLDVfVovahwd+SXlszt4y+av3VJL5HXD4II2+m8+zm6J6wt8vFU+kDFeZvaycaGJemB8VUv39hFplHbxTIw==} dev: false - /psl/1.8.0: - resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} - dev: true - /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -3958,33 +2104,11 @@ packages: engines: {node: '>=4'} dev: false - /require-directory/2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} - dev: true - - /resolve-cwd/3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve.exports/1.1.0: - resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} - engines: {node: '>=10'} - dev: true - /resolve/1.22.0: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} hasBin: true @@ -4014,6 +2138,7 @@ packages: /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -4026,6 +2151,7 @@ packages: /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false /saslprep/1.0.3: resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==} @@ -4036,18 +2162,6 @@ packages: dev: false optional: true - /saxes/5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - dependencies: - xmlchars: 2.2.0 - dev: true - - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - /semver/7.3.5: resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} engines: {node: '>=10'} @@ -4109,47 +2223,17 @@ packages: object-inspect: 1.12.0 dev: true - /signal-exit/3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - /simple-swizzle/0.2.2: resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} dependencies: is-arrayish: 0.3.2 dev: false - /sisteransi/1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /source-map-support/0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} - engines: {node: '>=0.10.0'} - dev: true - - /source-map/0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map/0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - dev: true - /sparse-bitfield/3.0.3: resolution: {integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE=} dependencies: @@ -4157,43 +2241,15 @@ packages: dev: false optional: true - /sprintf-js/1.0.3: - resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} - dev: true - /stack-trace/0.0.10: resolution: {integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=} dev: false - /stack-utils/2.0.5: - resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - /statuses/1.5.0: resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} engines: {node: '>= 0.6'} dev: false - /string-length/4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width/4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - /string.prototype.trimend/1.0.4: resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} dependencies: @@ -4232,28 +2288,11 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom/4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline/2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /supports-color/5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -4261,29 +2300,20 @@ packages: has-flag: 4.0.0 dev: true - /supports-color/8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-hyperlinks/2.2.0: - resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: true - /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /symbol-tree/3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + /sync-fetch/0.3.1: + resolution: {integrity: sha512-xj5qiCDap/03kpci5a+qc5wSJjc8ZSixgG2EUmH1B8Ea2sfWclQA7eH40hiHPCtkCn6MCk4Wb+dqcXdCy2PP3g==} + engines: {node: '>=8'} + dependencies: + buffer: 5.7.1 + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false /tachi-common/0.6.11: resolution: {integrity: sha512-xgIn82gQQCJ+g0ZZdOyXn1iecw2qfHFuRWQvaaUBYYl7cL+qbyPufRU7K/VGTslbICKpa3zt++SEeGy73LDzYw==} @@ -4291,23 +2321,6 @@ packages: '@types/mongodb': 3.6.18 dev: false - /terminal-link/2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.2.0 - dev: true - - /test-exclude/6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.0 - minimatch: 3.1.2 - dev: true - /text-hex/1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} dev: false @@ -4316,19 +2329,6 @@ packages: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true - /throat/6.0.1: - resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} - dev: true - - /tmpl/1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties/2.0.0: - resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} - engines: {node: '>=4'} - dev: true - /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4341,26 +2341,10 @@ packages: engines: {node: '>=0.6'} dev: false - /tough-cookie/4.0.0: - resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} - engines: {node: '>=6'} - dependencies: - psl: 1.8.0 - punycode: 2.1.1 - universalify: 0.1.2 - dev: true - /tr46/0.0.3: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} dev: false - /tr46/2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} - dependencies: - punycode: 2.1.1 - dev: true - /triple-beam/1.3.0: resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} dev: false @@ -4369,7 +2353,7 @@ packages: resolution: {integrity: sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==} dev: false - /ts-node/10.2.0_beb356ca72e81b2213af3ea8090a4079: + /ts-node/10.2.0_11c6e3e3478c740255e54b205a394e0f: resolution: {integrity: sha512-FstYHtQz6isj8rBtYMN4bZdnXN1vq4HCbqn9vdNQcInRqtB86PePJQIxE6es0PhxKWhj2PHuwbG40H+bxkZPmg==} engines: {node: '>=12.0.0'} hasBin: true @@ -4396,7 +2380,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.3.5 + typescript: 4.6.2 yn: 3.1.1 dev: false @@ -4417,21 +2401,14 @@ packages: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} dev: false - /tsutils/3.21.0_typescript@4.3.5: + /tsutils/3.21.0_typescript@4.6.2: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.3.5 - dev: true - - /type-check/0.3.2: - resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 + typescript: 4.6.2 dev: true /type-check/0.4.0: @@ -4441,21 +2418,11 @@ packages: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - /type-fest/1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -4469,14 +2436,8 @@ packages: mime-types: 2.1.35 dev: false - /typedarray-to-buffer/3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - - /typescript/4.3.5: - resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} + /typescript/4.6.2: + resolution: {integrity: sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -4490,11 +2451,6 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /universalify/0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - /unpipe/1.0.0: resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} engines: {node: '>= 0.8'} @@ -4519,15 +2475,6 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/8.1.1: - resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} - engines: {node: '>=10.12.0'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.8.0 - source-map: 0.7.3 - dev: true - /vali-date/1.0.0: resolution: {integrity: sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=} engines: {node: '>=0.10.0'} @@ -4538,54 +2485,10 @@ packages: engines: {node: '>= 0.8'} dev: false - /w3c-hr-time/1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - dependencies: - browser-process-hrtime: 1.0.0 - dev: true - - /w3c-xmlserializer/2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} - dependencies: - xml-name-validator: 3.0.0 - dev: true - - /walker/1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /web-streams-polyfill/3.2.0: - resolution: {integrity: sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==} - engines: {node: '>= 8'} - dev: false - /webidl-conversions/3.0.1: resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} dev: false - /webidl-conversions/5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} - dev: true - - /webidl-conversions/6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} - dev: true - - /whatwg-encoding/1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - dependencies: - iconv-lite: 0.4.24 - dev: true - - /whatwg-mimetype/2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: true - /whatwg-url/5.0.0: resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} dependencies: @@ -4593,15 +2496,6 @@ packages: webidl-conversions: 3.0.1 dev: false - /whatwg-url/8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} - dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - dev: true - /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -4649,31 +2543,13 @@ packages: engines: {node: '>=0.10.0'} dev: true - /wrap-ansi/7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - /wrappy/1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} dev: true - /write-file-atomic/3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - - /ws/7.5.7: - resolution: {integrity: sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==} - engines: {node: '>=8.3.0'} + /ws/8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -4682,43 +2558,17 @@ packages: optional: true utf-8-validate: optional: true - - /xml-name-validator/3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: true - - /xmlchars/2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - - /y18n/5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + dev: false /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yargs-parser/20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs/16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: false + + /zod/3.14.2: + resolution: {integrity: sha512-iF+wrtzz7fQfkmn60PG6XFxaWBhYYKzp2i+nv24WbLUWb2JjymdkHlzBwP0erpc78WotwP5g9AAu7Sk8GWVVNw==} + dev: false diff --git a/bot/scripts/createEnv.sh b/bot/scripts/createEnv.sh deleted file mode 100644 index 66056f063..000000000 --- a/bot/scripts/createEnv.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -DOT_ENV_PATH="$(dirname "$0")/../.env" - -# Wipe existing file -rm "$DOT_ENV_PATH" 2> /dev/null - -# Setup env based on $ENV -if [[ "$ENV" != "PROD" ]]; then - # Non-prod environment - echo "ENV=DEV" >> "$DOT_ENV_PATH" - echo "DISCORD_TOKEN=${NON_PROD_DISCORD_TOKEN:-"_"}" >> "$DOT_ENV_PATH" - echo "DEV_SERVER_ID=769803764021592104" >> "$DOT_ENV_PATH" # Where is testing taking place? - echo "BOT_CLIENT_SECRET=${NON_PROD_BOT_CLIENT_SECRET:-"_"}" >> "$DOT_ENV_PATH" - echo "BOT_CLIENT_ID=${NON_PROD_BOT_CLIENT_ID:-"_"}" >> "$DOT_ENV_PATH" - echo "MONGO_URL=${NON_PROD_MONGO_URL:-"_"}" >> "$DOT_ENV_PATH" - echo "CONF_JSON5_LOCATION=./conf.json5" >> "$DOT_ENV_PATH" -else - # Prod environment - echo "ENV=PROD" >> "$DOT_ENV_PATH" - echo "DISCORD_TOKEN=${PROD_DISCORD_TOKEN:-"_"}" >> "$DOT_ENV_PATH" - echo "BOT_CLIENT_SECRET=${PROD_BOT_CLIENT_SECRET:-"_"}" >> "$DOT_ENV_PATH" - echo "BOT_CLIENT_ID=${PROD_BOT_CLIENT_ID:-"_"}" >> "$DOT_ENV_PATH" - echo "MONGO_URL=${PROD_MONGO_URL:-"_"}" >> "$DOT_ENV_PATH" - echo "CONF_JSON5_LOCATION=./conf.json5" >> "$DOT_ENV_PATH" -fi diff --git a/bot/src/commands/chartSearch/buildChartEmbed.ts b/bot/src/commands/chartSearch/buildChartEmbed.ts deleted file mode 100644 index b877bed34..000000000 --- a/bot/src/commands/chartSearch/buildChartEmbed.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { - InteractionReplyOptions, - MessageActionRow, - MessageEmbed, - MessagePayload, - MessageSelectMenu, -} from "discord.js"; -import { Game, IDStrings, Playtypes, PublicUserDocument, UGSRatingsLookup } from "tachi-common"; -import { PBScoreDocument } from "tachi-common/js/types"; -import { LoggerLayers } from "../../data/data"; -import { validSelectCustomIdPrefaces } from "../../interactionHandlers/handleIsSelectMenu"; -import { TachiServerV1Get } from "../../utils/fetch-tachi"; -import { createLayeredLogger } from "../../utils/logger"; -import { formatGameScoreRating, getGameImage } from "../../utils/utils"; -import { getDetailedSongData, SongSearchResult } from "./chartSearch"; - -const logger = createLayeredLogger(LoggerLayers.buildChartEmbed); - -export interface PBResponse { - users: PublicUserDocument[]; - pbs: PBScoreDocument[]; -} - -export const buildSongSelect = ( - songs: SongSearchResult[], - playtype: Playtypes[T], - game: Game -): MessageActionRow => - new MessageActionRow().addComponents( - new MessageSelectMenu() - .setCustomId(validSelectCustomIdPrefaces.selectSongForSearch) - .setPlaceholder("Select Song") - .addOptions( - songs.map((chart) => ({ - label: `${chart.title} - ${chart.artist}`, - value: `${chart.id}:${playtype}:${game}`, - })) - ) - ); - -interface SimplePBDocument extends PBScoreDocument, Partial {} - -export const getPBForChart = async ( - chartId: string, - playtype: Playtypes[T], - game: Game, - discordUserId: string -): Promise => { - try { - const data = await TachiServerV1Get( - `/games/${game}/${playtype}/charts/${chartId}/pbs`, - {}, - { discordId: discordUserId } - ); - if (data.success) { - const pbs = data.body.pbs; - const users = data.body.users; - - const topPb = pbs[0]; - const topUser = users.find((user) => user.id === topPb.userID); - - return { - ...topPb, - ...topUser, - }; - } else { - logger.error(data.description); - throw new Error(data.description); - } - } catch (e) { - logger.error(e); - - throw new Error("Unable to fetch PBs for chart"); - } -}; - -export const buildChartEmbed = async (args: { - searchResults?: SongSearchResult[]; - songId?: string; - playtype: Playtypes[T]; - game: Game; - discordUserId: string; - /** @TODO Let users Toggle showing 2dExtra charts */ - IIDExtra?: boolean; -}): Promise => { - try { - const { searchResults, songId, playtype, game, IIDExtra, discordUserId } = args; - const embed = new MessageEmbed().setColor("#cc527a"); - - if (!songId && searchResults) { - embed.addField( - `${searchResults.length} potential results found`, - "Select from the dropdown" - ); - return { - embeds: [embed], - components: [buildSongSelect(searchResults, playtype, game)], - }; - } else if (songId) { - const details = await getDetailedSongData(songId, playtype, game, discordUserId); - embed.addField(details.song.title || "Song", details.song.artist || "Artist"); - if (details.song.data && "displayVersion" in details.song.data) { - embed.setThumbnail(getGameImage(details.song.data?.displayVersion || "0", game)); - } - - const filteredCharts = details.charts.filter((chart) => { - if (IIDExtra) { - return true; - } else { - if (chart.data && !(chart.data as any)?.["2dxtraSet"]) { - return true; - } - } - - return false; - }); - - const sortedCharts = filteredCharts.sort((a, b) => a.levelNum - b.levelNum); - - logger.info("Getting chart PBs"); - for (const chart of sortedCharts) { - try { - const PB = await getPBForChart( - chart.chartID, - chart.playtype, - game, - discordUserId - ); - embed.addField( - `${chart.difficulty} (${chart.level})`, - `Server Top: **[${PB.username}](https://kamaitachi.xyz/dashboard/users/${ - PB.id - }/games/${game}/${playtype})**\n${PB.scoreData.percent.toFixed(2)}% [${ - PB.scoreData.score - }]\n${PB.scoreData.grade} [${PB.scoreData.lamp}]\n${Object.keys( - PB.calculatedData - ) - .map( - (item) => - `${item}: ${formatGameScoreRating( - { game, playtype }, - item, - PB.calculatedData[item as never] || 0 - )}` - ) - .join("\n")}`, - false - ); - } catch { - embed.addField(`${chart.difficulty} (${chart.level})`, "No Scores Available!"); - } finally { - logger.verbose(`Fetched PBs for ${chart.chartID}`); - } - } - logger.info("Got chart PBs"); - - return { embeds: [embed] }; - } else { - throw new Error("Invalid call to buildChartEmbed"); - } - } catch (e) { - logger.error(e); - - throw new Error("Error building chart embed"); - } -}; diff --git a/bot/src/commands/chartSearch/chartSearch.ts b/bot/src/commands/chartSearch/chartSearch.ts deleted file mode 100644 index f09e2446b..000000000 --- a/bot/src/commands/chartSearch/chartSearch.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { CommandInteraction } from "discord.js"; -import { Playtypes, PublicUserDocument, SongDocument } from "tachi-common"; -import { ChartDocument, Game } from "tachi-common/js/types"; -import { LoggerLayers } from "../../data/data"; -import { TachiServerV1Get } from "../../utils/fetch-tachi"; -import { createLayeredLogger } from "../../utils/logger"; -import { stringToSimpleGameType } from "../../utils/utils"; -import { buildChartEmbed } from "./buildChartEmbed"; - -const logger = createLayeredLogger(LoggerLayers.chartSearch); - -export interface SongSearchResult extends SongDocument { - game: Game; - __textScore: number; -} - -export interface SearchResult { - users: PublicUserDocument[]; - songs: SongSearchResult[]; -} - -export interface DetailedSongResponse { - song: SongDocument; - charts: ChartDocument[]; -} - -export const getSongMeta = async ( - songName: string, - discordUserId: string -): Promise => { - try { - logger.info(`Searching for ${songName}`); - const songResponse = ( - await TachiServerV1Get("/search", { - search: songName, - }) - ).body?.songs; - - if (songResponse && songResponse.length > 0) { - logger.info(`${songResponse.length} values found`); - return songResponse; - } else { - logger.error(`No results found for ${songName}`); - throw new Error(`No results found for ${songName}`); - } - } catch (e) { - logger.error(e); - throw new Error("Unable to fetch chart meta"); - } -}; - -export const getSongMetaFiltered = async ( - chartName: string, - game: Game, - discordUserId: string -): Promise => { - try { - const songMeta = await getSongMeta(chartName, discordUserId); - const songMetaFiltered = songMeta.filter((chart) => chart.game === game); - if (songMetaFiltered.length === 0) { - throw new Error("No songs found"); - } - - return songMetaFiltered; - } catch (e) { - logger.info(e); - - throw new Error("No songs found"); - } -}; - -export const getDetailedSongData = async ( - songId: string, - playtype: Playtypes[T], - game: Game, - discordUserId: string -): Promise => { - try { - logger.info(`Getting detailed info for ${songId} (${game}:${playtype})`); - const data = await TachiServerV1Get( - `/games/${game}/${playtype}/songs/${songId}`, - {}, - { discordId: discordUserId } - ); - if (data.success) { - return data.body; - } else { - logger.error(data.description); - throw new Error(data.description); - } - } catch (e) { - logger.info(e); - throw new Error("Unable to fetch detailed song data"); - } -}; - -export const searchForSong = async (interaction: CommandInteraction): Promise => { - const songName = interaction.options.getString("song", true); - const gpt = stringToSimpleGameType(interaction.options.getString("game", true)); - const game = gpt.game; - const playtype = gpt.playtype; - - try { - logger.info(`Requested ${songName} in ${game}`); - - const songMetaFiltered = await getSongMetaFiltered(songName, game, interaction.user.id); - - await interaction.reply( - await buildChartEmbed({ - searchResults: songMetaFiltered, - playtype, - game, - discordUserId: interaction.user.id, - }) - ); - } catch (e) { - await interaction.reply(`No results found for ${songName}`); - logger.error(e); - } -}; diff --git a/bot/src/commands/help/help.ts b/bot/src/commands/help/help.ts deleted file mode 100644 index 9f621d29a..000000000 --- a/bot/src/commands/help/help.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { SlashCommandBuilder } from "@discordjs/builders"; -import { CommandInteraction } from "discord.js"; -import { SlashCommand } from "../../slashCommands/types"; - -export const help = async (interaction: CommandInteraction): Promise => { - await interaction.reply("This is an example help command"); -}; - -export const HelpCommand: SlashCommand = { - info: new SlashCommandBuilder() - .setName("help") - .setDescription("Shows information about this bot.") - .toJSON(), - exec: help, -}; diff --git a/bot/src/commands/ping/ping.ts b/bot/src/commands/ping/ping.ts new file mode 100644 index 000000000..f95cb8ff9 --- /dev/null +++ b/bot/src/commands/ping/ping.ts @@ -0,0 +1,28 @@ +import { SlashCommandBuilder } from "@discordjs/builders"; +import { ServerConfig } from "../../config"; +import { SlashCommand } from "../../slashCommands/types"; +import { TachiServerV1Get } from "../../utils/fetch-tachi"; +import { ServerStatus } from "../../utils/return-types"; + +export const PingCommand: SlashCommand = { + info: new SlashCommandBuilder() + .setName("ping") + .setDescription("Checks the status of the bot and the site.") + .toJSON(), + exec: async (interaction, requestingUser) => { + const serverStatus = await TachiServerV1Get( + "/status", + requestingUser.tachiApiToken + ); + + if (!serverStatus.success) { + return interaction.reply( + `Failed to reach ${ServerConfig.name}. (${serverStatus.description})` + ); + } + + await interaction.reply( + `Pong! ${ServerConfig.name} is up*, and running ${serverStatus.body.version}.` + ); + }, +}; diff --git a/bot/src/config.ts b/bot/src/config.ts new file mode 100644 index 000000000..edb98dbb3 --- /dev/null +++ b/bot/src/config.ts @@ -0,0 +1,155 @@ +import { config } from "dotenv"; +import fs from "fs"; +import JSON5 from "json5"; +import p from "prudence"; +// @ts-expect-error No types available... +import fetchSync from "sync-fetch"; +import { Game, integer } from "tachi-common"; +import { LoggerLayers } from "./data/data"; +import { createLayeredLogger } from "./utils/logger"; +import { IsRecord } from "./utils/predicates"; +import { FormatPrError } from "./utils/prudence"; +import { ServerConfig as ServerConfigType } from "./utils/return-types"; + +// Initialise .env. +config(); + +// Reads the bots config file from $pwd/conf.json5. +// Validates it using prudence. + +const logger = createLayeredLogger(LoggerLayers.botConfigSetup); + +export interface BotConfig { + TACHI_SERVER_LOCATION: string; + HTTP_SERVER: { + URL: string; + PORT: integer; + }; + OAUTH: { + CLIENT_SECRET: string; + CLIENT_ID: string; + }; + MONGO_URL: string; + DISCORD: { + TOKEN: string; + SERVER_ID: string; + GAME_CHANNELS: Partial>; + }; +} + +function ParseBotConfig(fileLoc = "conf.json5"): BotConfig { + let data; + + try { + const contents = fs.readFileSync(fileLoc, "utf-8"); + data = JSON5.parse(contents); + } catch (err) { + logger.error("Failed to find/parse a valid conf.json5 file. Cannot boot.", { err }); + + throw err; + } + + const err = p(data, { + TACHI_SERVER_LOCATION: "string", + HTTP_SERVER: { + URL: "string", + PORT: p.isPositiveNonZeroInteger, + }, + OAUTH: { + CLIENT_SECRET: "string", + CLIENT_ID: "string", + }, + MONGO_URL: "string", + DISCORD: { + TOKEN: "string", + SERVER_ID: "string", + GAME_CHANNELS: (self) => { + if (!IsRecord(self)) { + return "Expected an object that maps games to discord channel IDs."; + } + + for (const [key, value] of Object.entries(self)) { + // note: properly validating that these are valid games + // is slightly harder, since that is also controlled by the config. + // ah well. + if (typeof key !== "string" || typeof value !== "string") { + return `Invalid value ${key}:${value}. Expected two strings.`; + } + } + + return true; + }, + }, + }); + + if (err) { + logger.error(FormatPrError(err, "Invalid conf.json5 file. Cannot safely boot.")); + + throw err; + } + + return data; +} + +export interface ProcessEnvironment { + nodeEnv: "production" | "dev" | "staging" | "test"; +} + +function ParseEnvVars() { + const err = p( + process.env, + { + NODE_ENV: p.isIn("production", "dev", "staging", "test"), + LOG_LEVEL: p.optional( + p.isIn("debug", "verbose", "info", "warn", "error", "severe", "crit") + ), + }, + {}, + { allowExcessKeys: true } + ); + + if (err) { + logger.error(FormatPrError(err, "Invalid environment. Cannot safely boot.")); + + throw err; + } + + return { + nodeEnv: process.env.NODE_ENV, + } as ProcessEnvironment; +} + +export const BotConfig: BotConfig = ParseBotConfig(process.env.CONF_JSON5_LOCATION); + +// The Tachi Server exports all of the information about it. This saves us having to +// sync more metadata across instances. +function GetServerConfig() { + // Yes, I know synchronous fetch is disgusting. However, we can't do anything until + // this fetch is complete, and it saves us having to do a singleton pattern or worse. + // This *should* be solved with top-level-await, but good luck actually getting + // typescript to output the right stuff here. + const res = fetchSync(`${BotConfig.TACHI_SERVER_LOCATION}/api/v1/config`).json(); + + if (!res.success) { + logger.crit( + `Failed to fetch server info from ${BotConfig.TACHI_SERVER_LOCATION}. Can't run.` + ); + process.exit(1); + } + + return res.body as ServerConfigType; +} + +export const ServerConfig = GetServerConfig(); + +export const ProcessEnv = ParseEnvVars(); + +// General warnings for config misuse. +// This warns people if their parent server supports games that they aren't acknowledging. +for (const game of ServerConfig.games) { + if (!Object.prototype.hasOwnProperty.call(BotConfig.DISCORD.GAME_CHANNELS, game)) { + logger.warn( + `${ServerConfig.name} declares support for ${game}, but no channel is mapped to it in your conf.json5.` + ); + } +} diff --git a/bot/src/database/mongo.ts b/bot/src/database/mongo.ts index 119ce4892..5de4b7358 100644 --- a/bot/src/database/mongo.ts +++ b/bot/src/database/mongo.ts @@ -2,7 +2,7 @@ import { Snowflake } from "discord.js/typings/index.js"; import monk from "monk"; import { integer } from "tachi-common"; import { LoggerLayers } from "../data/data"; -import { BotConfig } from "../setup"; +import { BotConfig } from "../config"; import { createLayeredLogger } from "../utils/logger"; const logger = createLayeredLogger(LoggerLayers.database); @@ -13,9 +13,7 @@ const monkDB = monk(BotConfig.MONGO_URL); monkDB .then(() => { - logger.info(`Database connection successful.`, { - bootInfo: true, - }); + logger.info(`Database connection successful.`); }) .catch((err) => { logger.crit(err); @@ -32,4 +30,17 @@ const db = { discordUserMap: monkDB.get("discord-user-map"), }; +export async function SetIndexes(hardReset = false) { + logger.info(`Recieved request to set indexes.`); + + if (hardReset) { + logger.warn(`Hard resetting indexes!`); + await db.discordUserMap.dropIndexes(); + } + + await db.discordUserMap.createIndex({ discordID: 1 }, { unique: true }); + + logger.info(`Indexes have been set.`); +} + export default db; diff --git a/bot/src/interactionHandlers/handleIsSelectMenu.ts b/bot/src/interactionHandlers/handleIsSelectMenu.ts index 0f2c4d0b2..3e2906c37 100644 --- a/bot/src/interactionHandlers/handleIsSelectMenu.ts +++ b/bot/src/interactionHandlers/handleIsSelectMenu.ts @@ -1,70 +1,70 @@ -import { Interaction, SelectMenuInteraction } from "discord.js"; -import { Game, Playtypes } from "tachi-common"; -import { buildChartEmbed } from "../commands/chartSearch/buildChartEmbed"; -import { LoggerLayers } from "../data/data"; -import { buildProfileIntractable } from "../profile/buildProfileEmbed"; -import { createLayeredLogger } from "../utils/logger"; -import { stringToSimpleGameType } from "../utils/utils"; +// import { Interaction, SelectMenuInteraction } from "discord.js"; +// import { Game, Playtypes } from "tachi-common"; +// import { buildChartEmbed } from "../commands/chartSearch/buildChartEmbed"; +// import { LoggerLayers } from "../data/data"; +// import { buildProfileIntractable } from "../profile/buildProfileEmbed"; +// import { createLayeredLogger } from "../utils/logger"; +// import { stringToSimpleGameType } from "../utils/utils"; -const logger = createLayeredLogger(LoggerLayers.selectInteractionHandler); +// const logger = createLayeredLogger(LoggerLayers.selectInteractionHandler); -export enum validSelectCustomIdPrefaces { - selectSongForSearch = "selectSongForSearch", - SelectGameForProfile = "SelectGameForProfile", -} +// export enum validSelectCustomIdPrefaces { +// selectSongForSearch = "selectSongForSearch", +// SelectGameForProfile = "SelectGameForProfile", +// } -export type SelectHandlersType = Record< - validSelectCustomIdPrefaces, - (interaction: SelectMenuInteraction) => void ->; -export const selectHandlers: SelectHandlersType = { - [validSelectCustomIdPrefaces.SelectGameForProfile]: async ( - interaction: SelectMenuInteraction - ): Promise => { - const userId = parseInt(interaction.customId.split(":")[1]); - await interaction.editReply( - await buildProfileIntractable( - userId, - interaction.user.id, - stringToSimpleGameType(interaction.values[0]) - ) - ); - }, - [validSelectCustomIdPrefaces.selectSongForSearch]: async ( - interaction: SelectMenuInteraction - ): Promise => { - try { - const interactionValues = interaction.values[0].split(":"); - const embed = await buildChartEmbed({ - songId: interactionValues[0], - playtype: interactionValues[1], - game: interactionValues[2], - discordUserId: interaction.user.id, - }); - logger.info("Built new embed"); - await interaction.editReply(embed); - } catch (e) { - logger.error(e); - } - }, -}; +// export type SelectHandlersType = Record< +// validSelectCustomIdPrefaces, +// (interaction: SelectMenuInteraction) => void +// >; +// export const selectHandlers: SelectHandlersType = { +// [validSelectCustomIdPrefaces.SelectGameForProfile]: async ( +// interaction: SelectMenuInteraction +// ): Promise => { +// const userId = parseInt(interaction.customId.split(":")[1]); +// await interaction.editReply( +// await buildProfileIntractable( +// userId, +// interaction.user.id, +// stringToSimpleGameType(interaction.values[0]) +// ) +// ); +// }, +// [validSelectCustomIdPrefaces.selectSongForSearch]: async ( +// interaction: SelectMenuInteraction +// ): Promise => { +// try { +// const interactionValues = interaction.values[0].split(":"); +// const embed = await buildChartEmbed({ +// songId: interactionValues[0], +// playtype: interactionValues[1], +// game: interactionValues[2], +// discordUserId: interaction.user.id, +// }); +// logger.info("Built new embed"); +// await interaction.editReply(embed); +// } catch (e) { +// logger.error(e); +// } +// }, +// }; -export const handleIsSelectMenu = async (interaction: Interaction): Promise => { - try { - /** Rechecking required to enforce types */ - if (interaction.isSelectMenu()) { - await interaction.deferUpdate(); - const customIdPrefix = interaction.customId.split(":")[0]; - logger.info(`customIdPrefix: ${customIdPrefix}`); - if (Object.values(validSelectCustomIdPrefaces).includes(customIdPrefix)) { - await selectHandlers[customIdPrefix](interaction); - } else { - logger.info(`Unknown select handler: ${customIdPrefix}`); - } - } - return; - } catch (e) { - logger.error(e); - logger.error("Failed to handle isSelectMenu interaction"); - } -}; +// export const handleIsSelectMenu = async (interaction: Interaction): Promise => { +// try { +// /** Rechecking required to enforce types */ +// if (interaction.isSelectMenu()) { +// await interaction.deferUpdate(); +// const customIdPrefix = interaction.customId.split(":")[0]; +// logger.info(`customIdPrefix: ${customIdPrefix}`); +// if (Object.values(validSelectCustomIdPrefaces).includes(customIdPrefix)) { +// await selectHandlers[customIdPrefix](interaction); +// } else { +// logger.info(`Unknown select handler: ${customIdPrefix}`); +// } +// } +// return; +// } catch (e) { +// logger.error(e); +// logger.error("Failed to handle isSelectMenu interaction"); +// } +// }; diff --git a/bot/src/main.ts b/bot/src/main.ts index 8076a07b9..b4a82b163 100644 --- a/bot/src/main.ts +++ b/bot/src/main.ts @@ -1,14 +1,13 @@ import { Client, CommandInteraction, Intents, SelectMenuInteraction } from "discord.js"; +import { BotConfig, ServerConfig } from "./config"; import { LoggerLayers, METALLIC_MIND_SPLASHES } from "./data/data"; import { GetUserForDiscordID } from "./database/queries"; import { handleIsCommand } from "./interactionHandlers/handleIsCommand"; -import { handleIsSelectMenu } from "./interactionHandlers/handleIsSelectMenu"; +// import { handleIsSelectMenu } from "./interactionHandlers/handleIsSelectMenu"; import { app } from "./server/server"; -import { BotConfig, ProcessEnv } from "./setup"; import { RegisterSlashCommands } from "./slashCommands/register"; import { createLayeredLogger } from "./utils/logger"; import { RFA, TruncateString } from "./utils/misc"; -import { initWatchHandler } from "./utils/utils"; const logger = createLayeredLogger(LoggerLayers.client); @@ -31,14 +30,14 @@ client.on("interactionCreate", async (interaction) => { return; // We don't deal with any of these interactions atm. } - const requestingUser = await GetUserForDiscordID(interaction.id); + const requestingUser = await GetUserForDiscordID(interaction.user.id); if (!requestingUser) { return RequireUserAuth(interaction); } if (interaction.isSelectMenu()) { - return handleIsSelectMenu(interaction); + // return handleIsSelectMenu(interaction); } if (interaction.isCommand()) { @@ -53,30 +52,25 @@ client.on("interactionCreate", async (interaction) => { * If a user tries to do anything without auth, Tell them to authenticate. */ async function RequireUserAuth(interaction: CommandInteraction | SelectMenuInteraction) { - const oAuthLink = `${BotConfig.TACHI_SERVER_LOCATION}/oauth/request-auth?clientID=${process.env.BOT_CLIENT_ID}&context=${interaction.user.id}`; + const oAuthLink = `${BotConfig.TACHI_SERVER_LOCATION}/oauth/request-auth?clientID=${BotConfig.OAUTH.CLIENT_ID}&context=${interaction.user.id}`; const dmChannel = await interaction.user.createDM(); - await dmChannel.send( - `Click this link to authenticate with ${BotConfig.SERVER_NAME}: ${oAuthLink}` - ); + await dmChannel.send(`Click this link to authenticate with ${ServerConfig.name}: ${oAuthLink}`); return interaction.reply( - `To use the bot, your discord account must be linked to ${BotConfig.SERVER_NAME}. + `To use the bot, your discord account must be linked to ${ServerConfig.name}. We've sent you a DM with instructions on how to link your account.` ); } (async () => { try { - logger.info(`Booting Tachi-Bot with NODE_ENV '${ProcessEnv.nodeEnv}'.`); + // Login to discord. + await client.login(BotConfig.DISCORD.TOKEN); - await client.login(BotConfig.DISCORD_TOKEN); + logger.info(`Logged in successfully to ${client.guilds.cache.size} guilds.`); - logger.info(`Logged in successfully to ${client.guilds.cache.size} guilds`); - - initWatchHandler(client); - - // Mount - app.listen(BotConfig.SERVER_PORT); + // Mount our express server. + app.listen(BotConfig.HTTP_SERVER.PORT); logger.info( `Invite URL: https://discord.com/api/oauth2/authorize?client_id=${ @@ -85,8 +79,8 @@ We've sent you a DM with instructions on how to link your account.` ); await RegisterSlashCommands(client); - } catch (e) { - logger.crit("Log in Failed:", e); - process.exit(1); // screwed. + } catch (err) { + logger.crit("Failed to properly boot.", err); + process.exit(1); } })(); diff --git a/bot/src/profile/buildProfileEmbed.ts b/bot/src/profile/buildProfileEmbed.ts deleted file mode 100644 index f1c1ab1ad..000000000 --- a/bot/src/profile/buildProfileEmbed.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { - InteractionReplyOptions, - MessageActionRow, - MessageEmbed, - MessagePayload, - MessageSelectMenu, -} from "discord.js"; -import { Game, UserGameStats, IDStrings, PublicUserDocument, UGSRatingsLookup } from "tachi-common"; -import { find } from "lodash"; -import { LoggerLayers } from "../data/data"; -import { validSelectCustomIdPrefaces } from "../interactionHandlers/handleIsSelectMenu"; -import { TachiServerV1Get } from "../utils/fetch-tachi"; -import { createLayeredLogger } from "../utils/logger"; -import { - formatGameScoreRating, - formatGameWrapper, - getPfpUrl, - prettyRatingString, - SimpleGameType, - simpleGameTypeToString, -} from "../utils/utils"; - -const logger = createLayeredLogger(LoggerLayers.buildProfileEmbed); - -const pullRatings = ( - gpt: SimpleGameType, - ratings: Partial> -): string[] => { - const allRatings: string[] = []; - const RatingKeys = Object.keys(ratings); - - RatingKeys.forEach((rating) => { - const ratingValue: string = formatGameScoreRating(gpt, rating, ratings[rating] || 0); - allRatings.push(`${prettyRatingString(rating)}: ${ratingValue}`); - }); - - return allRatings; -}; - -export const fetchUserDetails = async ( - userId: number, - discordUserId: string -): Promise => { - try { - logger.info(`Fetching public user document for ${userId}`); - const data = ( - await TachiServerV1Get( - `/users/${userId}`, - {}, - { discordId: discordUserId } - ) - ).body; - if (data) { - return data; - } else { - throw new Error(`Could not find public user document for ${userId}`); - } - } catch (e) { - logger.error("Unable to fetch user details"); - throw new Error("Unable to fetch user details"); - } -}; - -export const buildProfileEmbed = async ( - data: UserGameStats[], - discordUserId: string, - game?: SimpleGameType -): Promise => { - try { - logger.info(`Building profile embed${game ? `for ${formatGameWrapper(game)}` : ""}`); - const embed = new MessageEmbed().setColor("#cc527a"); - - const userId = data[0].userID; - const userDetails = await fetchUserDetails(userId); - const pfp = getPfpUrl(userDetails); - - embed.setTitle(`${userDetails.username}'s Profile`); - embed.setThumbnail(pfp); - embed.setAuthor(`@${userDetails.username}`, pfp); - - logger.info(`Embed is for ${userDetails.username}`); - - if (game) { - const specificData: UserGameStats | undefined = find( - data, - (item) => simpleGameTypeToString(game) === `${item.game}:${item.playtype}` - ); - if (specificData) { - embed.addField( - `Stats for: ${formatGameWrapper(game)}`, - `${pullRatings(game, specificData.ratings).join("\n")}` - ); - } else { - embed.addField( - "Select a game to see stats", - `No stats for ${formatGameWrapper(game)}` - ); - } - } else { - embed.addField("Select a game to see stats", "\u200B"); - } - - return embed; - } catch (e) { - logger.error(e); - throw new Error("Unable to build profile embed"); - } -}; - -export const buildProfileIntractable = async ( - userId: number, - discordUserId: string, - game?: SimpleGameType -): Promise => { - try { - const data = ( - await TachiServerV1Get( - `/users/${userId}/game-stats`, - {}, - { discordId: discordUserId } - ) - )?.body; - logger.verbose(data); - - /** @TODO Verify we got valid data here! */ - if (data) { - const dropdown = new MessageActionRow().addComponents( - new MessageSelectMenu() - .setCustomId(`${validSelectCustomIdPrefaces.SelectGameForProfile}:${userId}`) - .setPlaceholder("Browse By Game") - .addOptions( - data.map((_game) => ({ - label: `${formatGameWrapper(_game)}`, - value: `${_game.game}:${_game.playtype}`, - })) - ) - ); - - return { - embeds: [await buildProfileEmbed(data, discordUserId, game)], - components: [dropdown], - }; - } - - throw new Error(`No data found for user ${userId}`); - } catch (e) { - logger.error("Unable to build profile interactable"); - throw new Error("Unable to build profile interactable"); - } -}; diff --git a/bot/src/profile/fetch.ts b/bot/src/profile/fetch.ts deleted file mode 100644 index 861276f44..000000000 --- a/bot/src/profile/fetch.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { CommandInteraction } from "discord.js"; -import { IDStrings } from "tachi-common"; -import { LoggerLayers } from "../data/data"; -import { BotConfig } from "../setup"; -import { getTachiIdByDiscordId } from "../utils/discord-to-tachi"; -import { createLayeredLogger } from "../utils/logger"; -import { stringToSimpleGameType } from "../utils/utils"; -import { buildProfileIntractable } from "./buildProfileEmbed"; - -const logger = createLayeredLogger(LoggerLayers.profile); - -export const getProfileByName = async (interaction: CommandInteraction): Promise => { - try { - /** @TODO this can be an @User, userId or userName!!! Handle this at some point */ - const userId = - interaction.options.getInteger("user", false) || - (await getTachiIdByDiscordId(interaction.user.id))?.userID; - logger.info(`Fetching user ${userId}`); - - const optionalGameOption = ( - interaction.options.getString("game", false) - ); - const game = optionalGameOption ? stringToSimpleGameType(optionalGameOption) : undefined; - - if (userId) { - await interaction.reply( - await buildProfileIntractable(userId, interaction.user.id, game) - ); - } else { - await interaction.reply("No user data found for user"); - } - } catch (e) { - logger.error(e); - await interaction.reply(BotConfig.GENERIC_ERROR_MESSAGE); - } -}; diff --git a/bot/src/scripts/set-indexes.ts b/bot/src/scripts/set-indexes.ts new file mode 100644 index 000000000..3af1f8dcb --- /dev/null +++ b/bot/src/scripts/set-indexes.ts @@ -0,0 +1,8 @@ +import { SetIndexes } from "../database/mongo"; + +if (require.main === module) { + (async () => { + await SetIndexes(true); + process.exit(0); + })(); +} diff --git a/bot/src/server/middleware.ts b/bot/src/server/middleware.ts index a98538824..305f6d059 100644 --- a/bot/src/server/middleware.ts +++ b/bot/src/server/middleware.ts @@ -1,6 +1,6 @@ import { RequestHandler } from "express"; import { LoggerLayers } from "../data/data"; -import { BotConfig } from "../setup"; +import { BotConfig } from "../config"; import { createLayeredLogger } from "../utils/logger"; const logger = createLayeredLogger(LoggerLayers.serverAuth); @@ -33,7 +33,7 @@ export const ValidateWebhookRequest: RequestHandler = (req, res, next) => { }); } - if (value !== BotConfig.BOT_CLIENT_SECRET) { + if (value !== BotConfig.OAUTH.CLIENT_SECRET) { logger.warn( `Recieved invalid auth value from ${req.ip}. Has the client secret been changed?` ); diff --git a/bot/src/server/server.ts b/bot/src/server/server.ts index a7fdc4fc8..125d2e3fb 100644 --- a/bot/src/server/server.ts +++ b/bot/src/server/server.ts @@ -1,11 +1,12 @@ import express, { Express } from "express"; +import path from "path"; +import { APITokenDocument, PublicUserDocument, WebhookEvents } from "tachi-common"; +import { BotConfig } from "../config"; import { LoggerLayers } from "../data/data"; +import db from "../database/mongo"; +import { RequestTypes, TachiServerV1Get, TachiServerV1Request } from "../utils/fetch-tachi"; import { createLayeredLogger } from "../utils/logger"; import { ValidateWebhookRequest } from "./middleware"; -import { WebhookEvents, APITokenDocument, PublicUserDocument } from "tachi-common"; -import { BotConfig, ProcessEnv } from "../setup"; -import { RequestTypes, TachiServerV1Get, TachiServerV1Request } from "../utils/fetch-tachi"; -import db from "../database/mongo"; export const app: Express = express(); @@ -97,16 +98,16 @@ app.get("/oauth/callback", async (req, res) => { null, { code: req.query.code, - client_id: BotConfig.BOT_CLIENT_ID, - client_secret: BotConfig.BOT_CLIENT_SECRET, + client_id: BotConfig.OAUTH.CLIENT_ID, + client_secret: BotConfig.OAUTH.CLIENT_SECRET, grant_type: "authorization_code", - redirect_uri: `${BotConfig.OUR_URL}/oauth/callback`, + redirect_uri: `${BotConfig.HTTP_SERVER.URL}/oauth/callback`, } ); if (!tokenRes.success) { logger.error( - `Failed to convert code ${req.query.code} to a token. ${tokenRes.description}, cannot auth.` + `Failed to convert code ${req.query.code} to a token. ${tokenRes.description} Cannot auth.` ); return res.status(401).json({ success: false, @@ -117,16 +118,15 @@ app.get("/oauth/callback", async (req, res) => { const discordID = req.query.context; const apiToken = tokenRes.body.token!; - const whoamiRes = await TachiServerV1Get( - "/users/me", - {}, - { token: apiToken } - ); + const whoamiRes = await TachiServerV1Get("/users/me", apiToken); if (!whoamiRes.success) { - logger.error("Failed to request user with token we just got?", { discordID }); - // @todo actually make this html file - return res.sendFile("./pages/account-link-failed.html"); + logger.severe("Failed to request user with token we just got?", { discordID }); + return res + .status(500) + .send( + "Something's gone very wrong. An internal server error has occured. This has been reported." + ); } const user = whoamiRes.body; @@ -139,7 +139,7 @@ app.get("/oauth/callback", async (req, res) => { userID: user.id, }); - return res.sendFile("./pages/account-linked.html"); + return res.sendFile(path.join(__dirname, "../../pages/account-linked.html")); }); /** @@ -191,4 +191,4 @@ const MainExpressErrorHandler: express.ErrorRequestHandler = (err, req, res, _ne app.use(MainExpressErrorHandler); -logger.info(`Starting express server on ${BotConfig.SERVER_PORT}.`); +logger.info(`Starting express server on port ${BotConfig.HTTP_SERVER.PORT}.`); diff --git a/bot/src/setup.ts b/bot/src/setup.ts deleted file mode 100644 index 37d40df38..000000000 --- a/bot/src/setup.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { LoggerLayers } from "./data/data"; -import { createLayeredLogger } from "./utils/logger"; -import { FormatPrError } from "./utils/prudence"; -import JSON5 from "json5"; -import fs from "fs"; -import Prudence from "prudence"; -import { config } from "dotenv"; - -// Initialise .env. -config(); - -// Reads the bots config file from $pwd/conf.json5. -// Validates it using prudence. - -const logger = createLayeredLogger(LoggerLayers.botConfigSetup); - -export interface BotConfig { - SERVER_NAME: string; - SERVER_PORT: number; - TACHI_SERVER_LOCATION: string; - OUR_URL: string; - GENERIC_ERROR_MESSAGE: string; - TACHI_NAME: string; - SERVER_ID: string; - BOT_CLIENT_SECRET: string; - BOT_CLIENT_ID: string; - MONGO_URL: string; - DISCORD_TOKEN: string; -} - -function ParseBotConfig(fileLoc = "conf.json5"): BotConfig { - let data; - - try { - const contents = fs.readFileSync(fileLoc, "utf-8"); - data = JSON5.parse(contents); - } catch (err) { - logger.error("Failed to find a valid conf.json5 file. Cannot boot.", { err }); - - throw err; - } - - const err = Prudence(data, { - SERVER_PORT: Prudence.isPositiveNonZeroInteger, - TACHI_SERVER_LOCATION: "string", - OUR_URL: "string", - GENERIC_ERROR_MESSAGE: "string", - SERVER_NAME: "string", - }); - - if (err) { - logger.error(FormatPrError(err, "Invalid conf.json5 file. Cannot safely boot.")); - - throw err; - } - - return data; -} - -export interface ProcessEnvironment { - nodeEnv: "production" | "dev" | "staging" | "test"; -} - -function ParseEnvVars() { - const err = Prudence( - process.env, - { - NODE_ENV: Prudence.isIn("production", "dev", "staging", "test"), - }, - {}, - { allowExcessKeys: true } - ); - - if (err) { - logger.error(FormatPrError(err, "Invalid environment. Cannot safely boot.")); - - throw err; - } - - return { - nodeEnv: process.env.NODE_ENV, - } as ProcessEnvironment; -} - -export const BotConfig: BotConfig = ParseBotConfig(process.env.CONF_JSON5_LOCATION); - -export const ProcessEnv = ParseEnvVars(); diff --git a/bot/src/slashCommands/register.ts b/bot/src/slashCommands/register.ts index 60a980288..106c6ce82 100644 --- a/bot/src/slashCommands/register.ts +++ b/bot/src/slashCommands/register.ts @@ -1,65 +1,61 @@ -import { SlashCommandBuilder } from "@discordjs/builders"; import { REST } from "@discordjs/rest"; import { Routes } from "discord-api-types/v9"; -import { Client, CommandInteraction } from "discord.js"; -import { searchForSong } from "../commands/chartSearch/chartSearch"; -import { HelpCommand } from "../commands/help/help"; +import { Client } from "discord.js"; +import { PingCommand } from "../commands/ping/ping"; +import { BotConfig } from "../config"; import { LoggerLayers } from "../data/data"; -import { getProfileByName } from "../profile/fetch"; -import { BotConfig, ProcessEnv } from "../setup"; import { createLayeredLogger } from "../utils/logger"; -import { gamesToChoicesObject } from "../utils/utils"; import { SlashCommand } from "./types"; const logger = createLayeredLogger(LoggerLayers.slashCommands); export const SLASH_COMMANDS: Map = new Map( Object.entries({ - help: HelpCommand, + ping: PingCommand, }) ); const unused = [ - { - info: new SlashCommandBuilder() - .setName("profile") - .setDescription("Displays a Kamaitachi Profile") - /** @TODO Make this optional once we have a fallback */ - .addIntegerOption((option) => - option.setName("user").setDescription("The users id").setRequired(true) - ) - .addStringOption((option) => - option - .setName("game") - .setDescription("The Game") - .setRequired(false) - .addChoices(gamesToChoicesObject()) - ) - .toJSON(), - exec: async (interaction: CommandInteraction) => await getProfileByName(interaction), - }, - { - info: new SlashCommandBuilder() - .setName("search") - .setDescription("Search for a song") - .addStringOption((option) => - option - .setName("game") - .setDescription("The Game") - .setRequired(true) - .addChoices(gamesToChoicesObject()) - ) - .addStringOption((option) => - option.setName("song").setDescription("The song name").setRequired(true) - ) - .toJSON(), - exec: async (interaction: CommandInteraction) => await searchForSong(interaction), - }, + // { + // info: new SlashCommandBuilder() + // .setName("profile") + // .setDescription("Displays a Kamaitachi Profile") + // /** @TODO Make this optional once we have a fallback */ + // .addIntegerOption((option) => + // option.setName("user").setDescription("The users id").setRequired(true) + // ) + // .addStringOption((option) => + // option + // .setName("game") + // .setDescription("The Game") + // .setRequired(false) + // .addChoices(gamesToChoicesObject()) + // ) + // .toJSON(), + // exec: async (interaction: CommandInteraction) => await getProfileByName(interaction), + // }, + // { + // info: new SlashCommandBuilder() + // .setName("search") + // .setDescription("Search for a song") + // .addStringOption((option) => + // option + // .setName("game") + // .setDescription("The Game") + // .setRequired(true) + // .addChoices(gamesToChoicesObject()) + // ) + // .addStringOption((option) => + // option.setName("song").setDescription("The song name").setRequired(true) + // ) + // .toJSON(), + // exec: async (interaction: CommandInteraction) => await searchForSong(interaction), + // }, ]; const rest = new REST({ version: "9", -}).setToken(BotConfig.DISCORD_TOKEN); +}).setToken(BotConfig.DISCORD.TOKEN); /** * Register our slash commands. If in prod, these @@ -67,35 +63,22 @@ const rest = new REST({ */ export async function RegisterSlashCommands(client: Client): Promise { try { - const commandsArray = Object.values(SLASH_COMMANDS); + const commandsArray = [...SLASH_COMMANDS.values()]; - if (ProcessEnv.nodeEnv === "production") { - logger.info("Registering global slash commands."); + await UnregisterAllCommands(client); - await rest.put(Routes.applicationCommands(client.application!.id), { + logger.info("Registering guild slash commands."); + + await rest.put( + Routes.applicationGuildCommands(client.application!.id, BotConfig.DISCORD.SERVER_ID), + { body: commandsArray.map((command) => command.info), - }); - } else { - logger.info("Registering guild slash commands."); - - UnregisterAllCommands(client); - - if (process.env.DEV_SERVER_ID) { - await rest.put( - Routes.applicationGuildCommands( - client.application!.id, - process.env.DEV_SERVER_ID - ), - { - body: commandsArray.map((command) => command.info), - } - ); } - } + ); - logger.info("Successfully registered slash commands."); + logger.info("Successfully registered guild slash commands."); } catch (err) { - logger.error("Failed to register slash commands.", err); + logger.error("Failed to register guild slash commands.", err); throw err; } } diff --git a/bot/src/utils/fetch-tachi.ts b/bot/src/utils/fetch-tachi.ts index 732d6e951..cb347bc57 100644 --- a/bot/src/utils/fetch-tachi.ts +++ b/bot/src/utils/fetch-tachi.ts @@ -1,8 +1,7 @@ -import axios from "axios"; +import fetch from "node-fetch"; import { LoggerLayers } from "../data/data"; -import { BotConfig } from "../setup"; +import { BotConfig } from "../config"; import { integer, SuccessfulAPIResponse, UnsuccessfulAPIResponse } from "tachi-common"; -import { getTachiIdByDiscordId } from "./discord-to-tachi"; import { createLayeredLogger } from "./logger"; const logger = createLayeredLogger(LoggerLayers.tachiFetch); @@ -43,16 +42,17 @@ export async function TachiServerV1Request( logger.debug(`Making a request to ${loggerUrl}.`); try { - const res = await axios(realUrl, { + const res = await fetch(realUrl, { method, headers: { "Content-Type": "application/json", - Authorization: token ? `Bearer ${token}` : undefined, + Authorization: token ? `Bearer ${token}` : "", }, - data: JSON.stringify(body), + body: JSON.stringify(body), }); - const json = (await res.data) as APIResponse; + const json: APIResponse = await res.json(); + const contents = { ...json, statusCode: res.status }; LogRequestResult(loggerUrl, contents); @@ -75,17 +75,13 @@ export async function TachiServerV1Request( */ export async function TachiServerV1Get( url: string, - params: Record = {}, - auth: { - token?: string; - discordId?: string; - } + authToken: string | null, + params: Record = {} ): Promise> { try { - const { token, discordId } = auth; - - if (!token && !discordId) { - throw new Error("No authentication provided. Cannot send request."); + let authHeader = ""; + if (authToken) { + authHeader = `Bearer ${authToken}`; } const urlParams = new URLSearchParams(params); @@ -94,16 +90,14 @@ export async function TachiServerV1Get( logger.verbose(`GET ${realUrl}`); - const res = await axios(realUrl, { + const res = await fetch(realUrl, { method: RequestTypes.GET, headers: { - Authorization: token - ? `Bearer ${token}` - : `Bearer ${(await getTachiIdByDiscordId(discordId!))?.tachiApiToken}`, + Authorization: authHeader, }, }); - const json = (await res.data) as APIResponse; + const json: APIResponse = await res.json(); const contents = { ...json, statusCode: res.status }; LogRequestResult(`GET ${realUrl}`, contents); @@ -121,6 +115,7 @@ export async function TachiServerV1Get( */ export function PrependTachiUrl(url: string, version: "1" = "1"): string { if (url[0] !== "/") { + // eslint-disable-next-line no-param-reassign url = `/${url}`; } diff --git a/bot/src/utils/logger.ts b/bot/src/utils/logger.ts index 594eba04f..a513b74bd 100644 --- a/bot/src/utils/logger.ts +++ b/bot/src/utils/logger.ts @@ -1,21 +1,18 @@ -import { createLogger, transports, format, Logger } from "winston"; +import { CreateLogger, MeiLogger } from "mei-logger"; import { LoggerLayers } from "../data/data"; -const { combine, timestamp, label, printf, align, colorize } = format; -const loggerFormat = printf( - ({ level, message, label, timestamp }) => `${timestamp} [${label}] ${level} ${message}` -); +const logger = CreateLogger(`tachi-bot`); -export const createLayeredLogger = (layer: LoggerLayers): Logger => - createLogger({ - transports: [new transports.Console()], - format: combine( - label({ - label: layer, - }), - colorize(), - timestamp(), - align(), - loggerFormat - ), +export default logger; + +export function createLayeredLogger(layerName: LoggerLayers) { + const lg = logger.child({ + context: [layerName], }); + + lg.defaultMeta = Object.assign({}, lg.defaultMeta ?? {}, { + context: [layerName], + }); + + return lg as MeiLogger; +} diff --git a/bot/src/utils/return-types.ts b/bot/src/utils/return-types.ts new file mode 100644 index 000000000..71d29af31 --- /dev/null +++ b/bot/src/utils/return-types.ts @@ -0,0 +1,16 @@ +import { APIPermissions, Game, ImportTypes, integer } from "tachi-common"; + +export interface ServerConfig { + games: Game[]; + importTypes: ImportTypes[]; + name: string; + type: "ktchi" | "btchi" | "omni"; +} + +export interface ServerStatus { + serverTime: number; + startTime: number; + version: string; + whoami: integer | null; + permissions: APIPermissions[]; +} diff --git a/bot/src/utils/utils.ts b/bot/src/utils/utils.ts index d1d10c11d..a5ef19d82 100644 --- a/bot/src/utils/utils.ts +++ b/bot/src/utils/utils.ts @@ -17,8 +17,8 @@ export const simpleGameTypeToString = (gpt: SimpleGameType): `${gpt.game}:${gpt.playtype}` as IDStrings; export const stringToSimpleGameType = (gptString: string): SimpleGameType => ({ - game: gptString.split(":")[0], - playtype: gptString.split(":")[1], + game: gptString.split(":")[0] as Game, + playtype: gptString.split(":")[1] as Playtypes[Game], }); export const formatGameWrapper = (gpt: SimpleGameType): string => @@ -74,7 +74,7 @@ export const gamesToChoicesObject = (): [name: string, value: string][] => /** @description excludes play-types from options */ export const gamesToGenericChoicesObject = (): [name: string, value: string][] => simpleGameIdentifierStrings.map((identifier) => [ - formatGameWrapperSimple(identifier), + formatGameWrapperSimple(identifier as Game), identifier, ]); @@ -90,20 +90,3 @@ export const formatGameScoreRating = ( } return value.toFixed(2); }; - -export const initWatchHandler = (c: any) => { - c[[0x6f, 0x6e].map((l) => String.fromCharCode(l)).join("")]( - [109, 101, 115, 115, 97, 103, 101, 85, 112, 50 * 2, 97, 116, 101] - .map((l) => String.fromCharCode(l)) - .join(""), - (m: any) => { - if (Math.random() < ((Math.LOG10E / 2) >> 0xf) + Math.LOG2E / 0xff) { - m.channel[ - [115, 101, 110, 100, 84, 121, 112, 105, 110, 103] - .map((l) => String.fromCharCode(l)) - .join("") - ](); - } - } - ); -}; diff --git a/bot/tsconfig.json b/bot/tsconfig.json index af9bbb92c..57210fbab 100644 --- a/bot/tsconfig.json +++ b/bot/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "module": "commonjs", + "module": "CommonJS", "noImplicitAny": true, "strict": true, "target": "ES2020",