├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── LICENSE.md ├── README.md ├── config ├── bot.json └── keys.template ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── src ├── index.ts ├── shard.ts └── util │ ├── isInterface.ts │ └── logger.ts ├── tsconfig.json └── windows_ez_start.bat /.eslintignore: -------------------------------------------------------------------------------- 1 | build/ -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "ecmaVersion": 2021 4 | }, 5 | "env": { 6 | "es6": true, 7 | "node": true, 8 | "es2021": true 9 | }, 10 | "parser": "@typescript-eslint/parser", 11 | "plugins": [ 12 | "@typescript-eslint", 13 | "import" 14 | ], 15 | "extends": [ 16 | "eslint:recommended", 17 | "plugin:@typescript-eslint/eslint-recommended", 18 | "plugin:@typescript-eslint/recommended" 19 | ], 20 | "rules": { 21 | "no-console": "off", 22 | "indent": [ 23 | "warn", 24 | 2, 25 | { 26 | "SwitchCase": 1 27 | } 28 | ], 29 | "quotes": [ 30 | "warn", 31 | "backtick" 32 | ], 33 | "semi": "off", 34 | "space-before-blocks": [ 35 | "warn", 36 | { 37 | "functions": "always", 38 | "keywords": "always", 39 | "classes": "always" 40 | } 41 | ], 42 | "prefer-const": [ 43 | "warn", 44 | { 45 | "destructuring": "any", 46 | "ignoreReadBeforeAssign": false 47 | } 48 | ], 49 | "no-unused-vars": "off", 50 | "no-var": "error", 51 | "no-empty": "off", 52 | "eqeqeq": "error", 53 | "no-use-before-define": [ 54 | "error", 55 | { 56 | "functions": false, 57 | "classes": false 58 | } 59 | ], 60 | "@typescript-eslint/no-unused-vars": "warn", 61 | "@typescript-eslint/semi": "warn" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/node 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 4 | 5 | # Typescript built files 6 | build/ 7 | 8 | .vscode/ 9 | 10 | ### Node ### 11 | # Logs 12 | logs 13 | *.log 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | lerna-debug.log* 18 | .pnpm-debug.log* 19 | 20 | # Diagnostic reports (https://nodejs.org/api/report.html) 21 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 22 | 23 | # Runtime data 24 | pids 25 | *.pid 26 | *.seed 27 | *.pid.lock 28 | 29 | # Directory for instrumented libs generated by jscoverage/JSCover 30 | lib-cov 31 | 32 | # Coverage directory used by tools like istanbul 33 | coverage 34 | *.lcov 35 | 36 | # nyc test coverage 37 | .nyc_output 38 | 39 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 40 | .grunt 41 | 42 | # Bower dependency directory (https://bower.io/) 43 | bower_components 44 | 45 | # node-waf configuration 46 | .lock-wscript 47 | 48 | # Compiled binary addons (https://nodejs.org/api/addons.html) 49 | build/Release 50 | 51 | # Dependency directories 52 | node_modules/ 53 | jspm_packages/ 54 | 55 | # Snowpack dependency directory (https://snowpack.dev/) 56 | web_modules/ 57 | 58 | # TypeScript cache 59 | *.tsbuildinfo 60 | 61 | # Optional npm cache directory 62 | .npm 63 | 64 | # Optional eslint cache 65 | .eslintcache 66 | 67 | # Optional stylelint cache 68 | .stylelintcache 69 | 70 | # Microbundle cache 71 | .rpt2_cache/ 72 | .rts2_cache_cjs/ 73 | .rts2_cache_es/ 74 | .rts2_cache_umd/ 75 | 76 | # Optional REPL history 77 | .node_repl_history 78 | 79 | # Output of 'npm pack' 80 | *.tgz 81 | 82 | # Yarn Integrity file 83 | .yarn-integrity 84 | 85 | # dotenv environment variable files 86 | .env 87 | .env.development.local 88 | .env.test.local 89 | .env.production.local 90 | .env.local 91 | 92 | # parcel-bundler cache (https://parceljs.org/) 93 | .cache 94 | .parcel-cache 95 | 96 | # Next.js build output 97 | .next 98 | out 99 | 100 | # Nuxt.js build / generate output 101 | .nuxt 102 | dist 103 | 104 | # Gatsby files 105 | .cache/ 106 | # Comment in the public line in if your project uses Gatsby and not Next.js 107 | # https://nextjs.org/blog/next-9-1#public-directory-support 108 | # public 109 | 110 | # vuepress build output 111 | .vuepress/dist 112 | 113 | # vuepress v2.x temp and cache directory 114 | .temp 115 | 116 | # Docusaurus cache and generated files 117 | .docusaurus 118 | 119 | # Serverless directories 120 | .serverless/ 121 | 122 | # FuseBox cache 123 | .fusebox/ 124 | 125 | # DynamoDB Local files 126 | .dynamodb/ 127 | 128 | # TernJS port file 129 | .tern-port 130 | 131 | # Stores VSCode versions used for testing VSCode extensions 132 | .vscode-test 133 | 134 | # yarn v2 135 | .yarn/cache 136 | .yarn/unplugged 137 | .yarn/build-state.yml 138 | .yarn/install-state.gz 139 | .pnp.* 140 | 141 | ### Node Patch ### 142 | # Serverless Webpack directories 143 | .webpack/ 144 | 145 | # Optional stylelint cache 146 | 147 | # SvelteKit build / generate output 148 | .svelte-kit 149 | 150 | # End of https://www.toptal.com/developers/gitignore/api/node 151 | 152 | 153 | # Vector: Auto-generated Folders 154 | data 155 | .local 156 | 157 | # Vector: Private Files 158 | config/keys.json -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2022] [Kyle Edwards] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Vector

4 |

A Discord bot for advanced moderation & server management

5 | Discord 6 | 7 |
8 |

This project has been shelved.

9 |

More information: https://github.com/JackDotJS/vector-bot/issues/15

10 |
11 | 12 |
13 | -------------------------------------------------------------------------------- /config/bot.json: -------------------------------------------------------------------------------- 1 | { 2 | "loginLimit": { 3 | "warning": 5, 4 | "shutdown": 30, 5 | "absolute": 999 6 | } 7 | } -------------------------------------------------------------------------------- /config/keys.template: -------------------------------------------------------------------------------- 1 | { 2 | "discord": "" 3 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vector-bot", 3 | "version": "3.0.0", 4 | "description": "A Discord bot for advanced moderation & server management", 5 | "main": "build/index.js", 6 | "scripts": { 7 | "build": "tsc", 8 | "start": "node build/src/index.js", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+ssh://git@github.com/JackDotJS/vector-bot.git" 14 | }, 15 | "author": "JackDotJS", 16 | "license": "MIT", 17 | "bugs": { 18 | "url": "https://github.com/JackDotJS/vector-bot/issues" 19 | }, 20 | "homepage": "https://github.com/JackDotJS/vector-bot#readme", 21 | "devDependencies": { 22 | "@types/luxon": "^2.3.2", 23 | "@types/node": "^18.0.0", 24 | "@typescript-eslint/eslint-plugin": "^5.27.0", 25 | "@typescript-eslint/parser": "^5.27.0", 26 | "eslint": "^8.17.0", 27 | "eslint-plugin-import": "^2.26.0", 28 | "typescript": "^4.7.4" 29 | }, 30 | "dependencies": { 31 | "chalk": "4.x.x", 32 | "compressing": "^1.6.0", 33 | "discord.js": "^13.8.1", 34 | "luxon": "^2.4.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@types/luxon': ^2.3.2 5 | '@types/node': ^18.0.0 6 | '@typescript-eslint/eslint-plugin': ^5.27.0 7 | '@typescript-eslint/parser': ^5.27.0 8 | chalk: 4.x.x 9 | compressing: ^1.6.0 10 | discord.js: ^13.8.1 11 | eslint: ^8.17.0 12 | eslint-plugin-import: ^2.26.0 13 | luxon: ^2.4.0 14 | typescript: ^4.7.4 15 | 16 | dependencies: 17 | chalk: 4.1.2 18 | compressing: 1.6.0 19 | discord.js: 13.8.1 20 | luxon: 2.4.0 21 | 22 | devDependencies: 23 | '@types/luxon': 2.3.2 24 | '@types/node': 18.0.0 25 | '@typescript-eslint/eslint-plugin': 5.27.0_55jjgj7njb4nbofoh2bh457ivy 26 | '@typescript-eslint/parser': 5.27.0_n4lrrl552kqf5nk4rgej5xdcha 27 | eslint: 8.17.0 28 | eslint-plugin-import: 2.26.0_er3f6f6cekbq4lwnvn7afiwhn4 29 | typescript: 4.7.4 30 | 31 | packages: 32 | 33 | /@discordjs/builders/0.14.0: 34 | resolution: {integrity: sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==} 35 | engines: {node: '>=16.9.0'} 36 | dependencies: 37 | '@sapphire/shapeshift': 3.3.1 38 | '@sindresorhus/is': 4.6.0 39 | discord-api-types: 0.33.5 40 | fast-deep-equal: 3.1.3 41 | ts-mixer: 6.0.1 42 | tslib: 2.4.0 43 | dev: false 44 | 45 | /@discordjs/collection/0.7.0: 46 | resolution: {integrity: sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==} 47 | engines: {node: '>=16.9.0'} 48 | dev: false 49 | 50 | /@eslint/eslintrc/1.3.0: 51 | resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} 52 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 53 | dependencies: 54 | ajv: 6.12.6 55 | debug: 4.3.4 56 | espree: 9.3.2 57 | globals: 13.15.0 58 | ignore: 5.2.0 59 | import-fresh: 3.3.0 60 | js-yaml: 4.1.0 61 | minimatch: 3.1.2 62 | strip-json-comments: 3.1.1 63 | transitivePeerDependencies: 64 | - supports-color 65 | dev: true 66 | 67 | /@humanwhocodes/config-array/0.9.5: 68 | resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} 69 | engines: {node: '>=10.10.0'} 70 | dependencies: 71 | '@humanwhocodes/object-schema': 1.2.1 72 | debug: 4.3.4 73 | minimatch: 3.1.2 74 | transitivePeerDependencies: 75 | - supports-color 76 | dev: true 77 | 78 | /@humanwhocodes/object-schema/1.2.1: 79 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 80 | dev: true 81 | 82 | /@nodelib/fs.scandir/2.1.5: 83 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 84 | engines: {node: '>= 8'} 85 | dependencies: 86 | '@nodelib/fs.stat': 2.0.5 87 | run-parallel: 1.2.0 88 | dev: true 89 | 90 | /@nodelib/fs.stat/2.0.5: 91 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 92 | engines: {node: '>= 8'} 93 | dev: true 94 | 95 | /@nodelib/fs.walk/1.2.8: 96 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 97 | engines: {node: '>= 8'} 98 | dependencies: 99 | '@nodelib/fs.scandir': 2.1.5 100 | fastq: 1.13.0 101 | dev: true 102 | 103 | /@sapphire/async-queue/1.3.1: 104 | resolution: {integrity: sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==} 105 | engines: {node: '>=v14.0.0', npm: '>=7.0.0'} 106 | dev: false 107 | 108 | /@sapphire/shapeshift/3.3.1: 109 | resolution: {integrity: sha512-PB2e5JHWIMRz9HiN/sIWcNIzXjYvzc3OmeRHYICXreKhetDYf4Zufypr8A48Z/XZLzbMqIka6uoR+2dH58nksg==} 110 | engines: {node: '>=v14.0.0', npm: '>=7.0.0'} 111 | dev: false 112 | 113 | /@sindresorhus/is/4.6.0: 114 | resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} 115 | engines: {node: '>=10'} 116 | dev: false 117 | 118 | /@types/json-schema/7.0.11: 119 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 120 | dev: true 121 | 122 | /@types/json5/0.0.29: 123 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 124 | dev: true 125 | 126 | /@types/luxon/2.3.2: 127 | resolution: {integrity: sha512-WOehptuhKIXukSUUkRgGbj2c997Uv/iUgYgII8U7XLJqq9W2oF0kQ6frEznRQbdurioz+L/cdaIm4GutTQfgmA==} 128 | dev: true 129 | 130 | /@types/node-fetch/2.6.1: 131 | resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==} 132 | dependencies: 133 | '@types/node': 18.0.0 134 | form-data: 3.0.1 135 | dev: false 136 | 137 | /@types/node/18.0.0: 138 | resolution: {integrity: sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==} 139 | 140 | /@types/ws/8.5.3: 141 | resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} 142 | dependencies: 143 | '@types/node': 18.0.0 144 | dev: false 145 | 146 | /@typescript-eslint/eslint-plugin/5.27.0_55jjgj7njb4nbofoh2bh457ivy: 147 | resolution: {integrity: sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ==} 148 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 149 | peerDependencies: 150 | '@typescript-eslint/parser': ^5.0.0 151 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 152 | typescript: '*' 153 | peerDependenciesMeta: 154 | typescript: 155 | optional: true 156 | dependencies: 157 | '@typescript-eslint/parser': 5.27.0_n4lrrl552kqf5nk4rgej5xdcha 158 | '@typescript-eslint/scope-manager': 5.27.0 159 | '@typescript-eslint/type-utils': 5.27.0_n4lrrl552kqf5nk4rgej5xdcha 160 | '@typescript-eslint/utils': 5.27.0_n4lrrl552kqf5nk4rgej5xdcha 161 | debug: 4.3.4 162 | eslint: 8.17.0 163 | functional-red-black-tree: 1.0.1 164 | ignore: 5.2.0 165 | regexpp: 3.2.0 166 | semver: 7.3.7 167 | tsutils: 3.21.0_typescript@4.7.4 168 | typescript: 4.7.4 169 | transitivePeerDependencies: 170 | - supports-color 171 | dev: true 172 | 173 | /@typescript-eslint/parser/5.27.0_n4lrrl552kqf5nk4rgej5xdcha: 174 | resolution: {integrity: sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA==} 175 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 176 | peerDependencies: 177 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 178 | typescript: '*' 179 | peerDependenciesMeta: 180 | typescript: 181 | optional: true 182 | dependencies: 183 | '@typescript-eslint/scope-manager': 5.27.0 184 | '@typescript-eslint/types': 5.27.0 185 | '@typescript-eslint/typescript-estree': 5.27.0_typescript@4.7.4 186 | debug: 4.3.4 187 | eslint: 8.17.0 188 | typescript: 4.7.4 189 | transitivePeerDependencies: 190 | - supports-color 191 | dev: true 192 | 193 | /@typescript-eslint/scope-manager/5.27.0: 194 | resolution: {integrity: sha512-VnykheBQ/sHd1Vt0LJ1JLrMH1GzHO+SzX6VTXuStISIsvRiurue/eRkTqSrG0CexHQgKG8shyJfR4o5VYioB9g==} 195 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 196 | dependencies: 197 | '@typescript-eslint/types': 5.27.0 198 | '@typescript-eslint/visitor-keys': 5.27.0 199 | dev: true 200 | 201 | /@typescript-eslint/type-utils/5.27.0_n4lrrl552kqf5nk4rgej5xdcha: 202 | resolution: {integrity: sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g==} 203 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 204 | peerDependencies: 205 | eslint: '*' 206 | typescript: '*' 207 | peerDependenciesMeta: 208 | typescript: 209 | optional: true 210 | dependencies: 211 | '@typescript-eslint/utils': 5.27.0_n4lrrl552kqf5nk4rgej5xdcha 212 | debug: 4.3.4 213 | eslint: 8.17.0 214 | tsutils: 3.21.0_typescript@4.7.4 215 | typescript: 4.7.4 216 | transitivePeerDependencies: 217 | - supports-color 218 | dev: true 219 | 220 | /@typescript-eslint/types/5.27.0: 221 | resolution: {integrity: sha512-lY6C7oGm9a/GWhmUDOs3xAVRz4ty/XKlQ2fOLr8GAIryGn0+UBOoJDWyHer3UgrHkenorwvBnphhP+zPmzmw0A==} 222 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 223 | dev: true 224 | 225 | /@typescript-eslint/typescript-estree/5.27.0_typescript@4.7.4: 226 | resolution: {integrity: sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ==} 227 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 228 | peerDependencies: 229 | typescript: '*' 230 | peerDependenciesMeta: 231 | typescript: 232 | optional: true 233 | dependencies: 234 | '@typescript-eslint/types': 5.27.0 235 | '@typescript-eslint/visitor-keys': 5.27.0 236 | debug: 4.3.4 237 | globby: 11.1.0 238 | is-glob: 4.0.3 239 | semver: 7.3.7 240 | tsutils: 3.21.0_typescript@4.7.4 241 | typescript: 4.7.4 242 | transitivePeerDependencies: 243 | - supports-color 244 | dev: true 245 | 246 | /@typescript-eslint/utils/5.27.0_n4lrrl552kqf5nk4rgej5xdcha: 247 | resolution: {integrity: sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA==} 248 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 249 | peerDependencies: 250 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 251 | dependencies: 252 | '@types/json-schema': 7.0.11 253 | '@typescript-eslint/scope-manager': 5.27.0 254 | '@typescript-eslint/types': 5.27.0 255 | '@typescript-eslint/typescript-estree': 5.27.0_typescript@4.7.4 256 | eslint: 8.17.0 257 | eslint-scope: 5.1.1 258 | eslint-utils: 3.0.0_eslint@8.17.0 259 | transitivePeerDependencies: 260 | - supports-color 261 | - typescript 262 | dev: true 263 | 264 | /@typescript-eslint/visitor-keys/5.27.0: 265 | resolution: {integrity: sha512-46cYrteA2MrIAjv9ai44OQDUoCZyHeGIc4lsjCUX2WT6r4C+kidz1bNiR4017wHOPUythYeH+Sc7/cFP97KEAA==} 266 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 267 | dependencies: 268 | '@typescript-eslint/types': 5.27.0 269 | eslint-visitor-keys: 3.3.0 270 | dev: true 271 | 272 | /acorn-jsx/5.3.2_acorn@8.7.1: 273 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 274 | peerDependencies: 275 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 276 | dependencies: 277 | acorn: 8.7.1 278 | dev: true 279 | 280 | /acorn/8.7.1: 281 | resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==} 282 | engines: {node: '>=0.4.0'} 283 | hasBin: true 284 | dev: true 285 | 286 | /ajv/6.12.6: 287 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 288 | dependencies: 289 | fast-deep-equal: 3.1.3 290 | fast-json-stable-stringify: 2.1.0 291 | json-schema-traverse: 0.4.1 292 | uri-js: 4.4.1 293 | dev: true 294 | 295 | /ansi-regex/5.0.1: 296 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 297 | engines: {node: '>=8'} 298 | dev: true 299 | 300 | /ansi-styles/4.3.0: 301 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 302 | engines: {node: '>=8'} 303 | dependencies: 304 | color-convert: 2.0.1 305 | 306 | /argparse/2.0.1: 307 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 308 | dev: true 309 | 310 | /array-includes/3.1.5: 311 | resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} 312 | engines: {node: '>= 0.4'} 313 | dependencies: 314 | call-bind: 1.0.2 315 | define-properties: 1.1.4 316 | es-abstract: 1.20.1 317 | get-intrinsic: 1.1.1 318 | is-string: 1.0.7 319 | dev: true 320 | 321 | /array-union/2.1.0: 322 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 323 | engines: {node: '>=8'} 324 | dev: true 325 | 326 | /array.prototype.flat/1.3.0: 327 | resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} 328 | engines: {node: '>= 0.4'} 329 | dependencies: 330 | call-bind: 1.0.2 331 | define-properties: 1.1.4 332 | es-abstract: 1.20.1 333 | es-shim-unscopables: 1.0.0 334 | dev: true 335 | 336 | /asynckit/0.4.0: 337 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 338 | dev: false 339 | 340 | /balanced-match/1.0.2: 341 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 342 | dev: true 343 | 344 | /bl/1.2.3: 345 | resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} 346 | dependencies: 347 | readable-stream: 2.3.7 348 | safe-buffer: 5.2.1 349 | dev: false 350 | 351 | /brace-expansion/1.1.11: 352 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 353 | dependencies: 354 | balanced-match: 1.0.2 355 | concat-map: 0.0.1 356 | dev: true 357 | 358 | /braces/3.0.2: 359 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 360 | engines: {node: '>=8'} 361 | dependencies: 362 | fill-range: 7.0.1 363 | dev: true 364 | 365 | /buffer-alloc-unsafe/1.1.0: 366 | resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} 367 | dev: false 368 | 369 | /buffer-alloc/1.2.0: 370 | resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} 371 | dependencies: 372 | buffer-alloc-unsafe: 1.1.0 373 | buffer-fill: 1.0.0 374 | dev: false 375 | 376 | /buffer-crc32/0.2.13: 377 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 378 | dev: false 379 | 380 | /buffer-fill/1.0.0: 381 | resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} 382 | dev: false 383 | 384 | /call-bind/1.0.2: 385 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 386 | dependencies: 387 | function-bind: 1.1.1 388 | get-intrinsic: 1.1.1 389 | dev: true 390 | 391 | /callsites/3.1.0: 392 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 393 | engines: {node: '>=6'} 394 | dev: true 395 | 396 | /chalk/4.1.2: 397 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 398 | engines: {node: '>=10'} 399 | dependencies: 400 | ansi-styles: 4.3.0 401 | supports-color: 7.2.0 402 | 403 | /color-convert/2.0.1: 404 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 405 | engines: {node: '>=7.0.0'} 406 | dependencies: 407 | color-name: 1.1.4 408 | 409 | /color-name/1.1.4: 410 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 411 | 412 | /combined-stream/1.0.8: 413 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 414 | engines: {node: '>= 0.8'} 415 | dependencies: 416 | delayed-stream: 1.0.0 417 | dev: false 418 | 419 | /compressing/1.6.0: 420 | resolution: {integrity: sha512-tWI4kJAbYLqoL+YHlMf9+EvIb9LA0WUm49C17KBMVa+JxpCfvHdiXqhE6lepFTuCghu0hDRZNd0Q+bGZvFDHAQ==} 421 | engines: {node: '>= 4.0.0'} 422 | dependencies: 423 | flushwritable: 1.0.0 424 | get-ready: 1.0.0 425 | iconv-lite: 0.5.2 426 | mkdirp: 0.5.6 427 | pump: 3.0.0 428 | streamifier: 0.1.1 429 | tar-stream: 1.6.2 430 | yauzl: 2.10.0 431 | yazl: 2.5.1 432 | dev: false 433 | 434 | /concat-map/0.0.1: 435 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 436 | dev: true 437 | 438 | /core-util-is/1.0.3: 439 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 440 | dev: false 441 | 442 | /cross-spawn/7.0.3: 443 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 444 | engines: {node: '>= 8'} 445 | dependencies: 446 | path-key: 3.1.1 447 | shebang-command: 2.0.0 448 | which: 2.0.2 449 | dev: true 450 | 451 | /debug/2.6.9: 452 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 453 | peerDependencies: 454 | supports-color: '*' 455 | peerDependenciesMeta: 456 | supports-color: 457 | optional: true 458 | dependencies: 459 | ms: 2.0.0 460 | dev: true 461 | 462 | /debug/3.2.7: 463 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 464 | peerDependencies: 465 | supports-color: '*' 466 | peerDependenciesMeta: 467 | supports-color: 468 | optional: true 469 | dependencies: 470 | ms: 2.1.3 471 | dev: true 472 | 473 | /debug/4.3.4: 474 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 475 | engines: {node: '>=6.0'} 476 | peerDependencies: 477 | supports-color: '*' 478 | peerDependenciesMeta: 479 | supports-color: 480 | optional: true 481 | dependencies: 482 | ms: 2.1.2 483 | dev: true 484 | 485 | /deep-is/0.1.4: 486 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 487 | dev: true 488 | 489 | /define-properties/1.1.4: 490 | resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} 491 | engines: {node: '>= 0.4'} 492 | dependencies: 493 | has-property-descriptors: 1.0.0 494 | object-keys: 1.1.1 495 | dev: true 496 | 497 | /delayed-stream/1.0.0: 498 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 499 | engines: {node: '>=0.4.0'} 500 | dev: false 501 | 502 | /dir-glob/3.0.1: 503 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 504 | engines: {node: '>=8'} 505 | dependencies: 506 | path-type: 4.0.0 507 | dev: true 508 | 509 | /discord-api-types/0.33.5: 510 | resolution: {integrity: sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==} 511 | dev: false 512 | 513 | /discord.js/13.8.1: 514 | resolution: {integrity: sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==} 515 | engines: {node: '>=16.6.0', npm: '>=7.0.0'} 516 | dependencies: 517 | '@discordjs/builders': 0.14.0 518 | '@discordjs/collection': 0.7.0 519 | '@sapphire/async-queue': 1.3.1 520 | '@types/node-fetch': 2.6.1 521 | '@types/ws': 8.5.3 522 | discord-api-types: 0.33.5 523 | form-data: 4.0.0 524 | node-fetch: 2.6.7 525 | ws: 8.7.0 526 | transitivePeerDependencies: 527 | - bufferutil 528 | - encoding 529 | - utf-8-validate 530 | dev: false 531 | 532 | /doctrine/2.1.0: 533 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 534 | engines: {node: '>=0.10.0'} 535 | dependencies: 536 | esutils: 2.0.3 537 | dev: true 538 | 539 | /doctrine/3.0.0: 540 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 541 | engines: {node: '>=6.0.0'} 542 | dependencies: 543 | esutils: 2.0.3 544 | dev: true 545 | 546 | /end-of-stream/1.4.4: 547 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 548 | dependencies: 549 | once: 1.4.0 550 | dev: false 551 | 552 | /es-abstract/1.20.1: 553 | resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} 554 | engines: {node: '>= 0.4'} 555 | dependencies: 556 | call-bind: 1.0.2 557 | es-to-primitive: 1.2.1 558 | function-bind: 1.1.1 559 | function.prototype.name: 1.1.5 560 | get-intrinsic: 1.1.1 561 | get-symbol-description: 1.0.0 562 | has: 1.0.3 563 | has-property-descriptors: 1.0.0 564 | has-symbols: 1.0.3 565 | internal-slot: 1.0.3 566 | is-callable: 1.2.4 567 | is-negative-zero: 2.0.2 568 | is-regex: 1.1.4 569 | is-shared-array-buffer: 1.0.2 570 | is-string: 1.0.7 571 | is-weakref: 1.0.2 572 | object-inspect: 1.12.2 573 | object-keys: 1.1.1 574 | object.assign: 4.1.2 575 | regexp.prototype.flags: 1.4.3 576 | string.prototype.trimend: 1.0.5 577 | string.prototype.trimstart: 1.0.5 578 | unbox-primitive: 1.0.2 579 | dev: true 580 | 581 | /es-shim-unscopables/1.0.0: 582 | resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} 583 | dependencies: 584 | has: 1.0.3 585 | dev: true 586 | 587 | /es-to-primitive/1.2.1: 588 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 589 | engines: {node: '>= 0.4'} 590 | dependencies: 591 | is-callable: 1.2.4 592 | is-date-object: 1.0.5 593 | is-symbol: 1.0.4 594 | dev: true 595 | 596 | /escape-string-regexp/4.0.0: 597 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 598 | engines: {node: '>=10'} 599 | dev: true 600 | 601 | /eslint-import-resolver-node/0.3.6: 602 | resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} 603 | dependencies: 604 | debug: 3.2.7 605 | resolve: 1.22.0 606 | transitivePeerDependencies: 607 | - supports-color 608 | dev: true 609 | 610 | /eslint-module-utils/2.7.3_nd4nb6nccnlbwilvit6hlaep3q: 611 | resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} 612 | engines: {node: '>=4'} 613 | peerDependencies: 614 | '@typescript-eslint/parser': '*' 615 | eslint-import-resolver-node: '*' 616 | eslint-import-resolver-typescript: '*' 617 | eslint-import-resolver-webpack: '*' 618 | peerDependenciesMeta: 619 | '@typescript-eslint/parser': 620 | optional: true 621 | eslint-import-resolver-node: 622 | optional: true 623 | eslint-import-resolver-typescript: 624 | optional: true 625 | eslint-import-resolver-webpack: 626 | optional: true 627 | dependencies: 628 | '@typescript-eslint/parser': 5.27.0_n4lrrl552kqf5nk4rgej5xdcha 629 | debug: 3.2.7 630 | eslint-import-resolver-node: 0.3.6 631 | find-up: 2.1.0 632 | transitivePeerDependencies: 633 | - supports-color 634 | dev: true 635 | 636 | /eslint-plugin-import/2.26.0_er3f6f6cekbq4lwnvn7afiwhn4: 637 | resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} 638 | engines: {node: '>=4'} 639 | peerDependencies: 640 | '@typescript-eslint/parser': '*' 641 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 642 | peerDependenciesMeta: 643 | '@typescript-eslint/parser': 644 | optional: true 645 | dependencies: 646 | '@typescript-eslint/parser': 5.27.0_n4lrrl552kqf5nk4rgej5xdcha 647 | array-includes: 3.1.5 648 | array.prototype.flat: 1.3.0 649 | debug: 2.6.9 650 | doctrine: 2.1.0 651 | eslint: 8.17.0 652 | eslint-import-resolver-node: 0.3.6 653 | eslint-module-utils: 2.7.3_nd4nb6nccnlbwilvit6hlaep3q 654 | has: 1.0.3 655 | is-core-module: 2.9.0 656 | is-glob: 4.0.3 657 | minimatch: 3.1.2 658 | object.values: 1.1.5 659 | resolve: 1.22.0 660 | tsconfig-paths: 3.14.1 661 | transitivePeerDependencies: 662 | - eslint-import-resolver-typescript 663 | - eslint-import-resolver-webpack 664 | - supports-color 665 | dev: true 666 | 667 | /eslint-scope/5.1.1: 668 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 669 | engines: {node: '>=8.0.0'} 670 | dependencies: 671 | esrecurse: 4.3.0 672 | estraverse: 4.3.0 673 | dev: true 674 | 675 | /eslint-scope/7.1.1: 676 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 677 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 678 | dependencies: 679 | esrecurse: 4.3.0 680 | estraverse: 5.3.0 681 | dev: true 682 | 683 | /eslint-utils/3.0.0_eslint@8.17.0: 684 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 685 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 686 | peerDependencies: 687 | eslint: '>=5' 688 | dependencies: 689 | eslint: 8.17.0 690 | eslint-visitor-keys: 2.1.0 691 | dev: true 692 | 693 | /eslint-visitor-keys/2.1.0: 694 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 695 | engines: {node: '>=10'} 696 | dev: true 697 | 698 | /eslint-visitor-keys/3.3.0: 699 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 700 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 701 | dev: true 702 | 703 | /eslint/8.17.0: 704 | resolution: {integrity: sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==} 705 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 706 | hasBin: true 707 | dependencies: 708 | '@eslint/eslintrc': 1.3.0 709 | '@humanwhocodes/config-array': 0.9.5 710 | ajv: 6.12.6 711 | chalk: 4.1.2 712 | cross-spawn: 7.0.3 713 | debug: 4.3.4 714 | doctrine: 3.0.0 715 | escape-string-regexp: 4.0.0 716 | eslint-scope: 7.1.1 717 | eslint-utils: 3.0.0_eslint@8.17.0 718 | eslint-visitor-keys: 3.3.0 719 | espree: 9.3.2 720 | esquery: 1.4.0 721 | esutils: 2.0.3 722 | fast-deep-equal: 3.1.3 723 | file-entry-cache: 6.0.1 724 | functional-red-black-tree: 1.0.1 725 | glob-parent: 6.0.2 726 | globals: 13.15.0 727 | ignore: 5.2.0 728 | import-fresh: 3.3.0 729 | imurmurhash: 0.1.4 730 | is-glob: 4.0.3 731 | js-yaml: 4.1.0 732 | json-stable-stringify-without-jsonify: 1.0.1 733 | levn: 0.4.1 734 | lodash.merge: 4.6.2 735 | minimatch: 3.1.2 736 | natural-compare: 1.4.0 737 | optionator: 0.9.1 738 | regexpp: 3.2.0 739 | strip-ansi: 6.0.1 740 | strip-json-comments: 3.1.1 741 | text-table: 0.2.0 742 | v8-compile-cache: 2.3.0 743 | transitivePeerDependencies: 744 | - supports-color 745 | dev: true 746 | 747 | /espree/9.3.2: 748 | resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} 749 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 750 | dependencies: 751 | acorn: 8.7.1 752 | acorn-jsx: 5.3.2_acorn@8.7.1 753 | eslint-visitor-keys: 3.3.0 754 | dev: true 755 | 756 | /esquery/1.4.0: 757 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 758 | engines: {node: '>=0.10'} 759 | dependencies: 760 | estraverse: 5.3.0 761 | dev: true 762 | 763 | /esrecurse/4.3.0: 764 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 765 | engines: {node: '>=4.0'} 766 | dependencies: 767 | estraverse: 5.3.0 768 | dev: true 769 | 770 | /estraverse/4.3.0: 771 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 772 | engines: {node: '>=4.0'} 773 | dev: true 774 | 775 | /estraverse/5.3.0: 776 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 777 | engines: {node: '>=4.0'} 778 | dev: true 779 | 780 | /esutils/2.0.3: 781 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 782 | engines: {node: '>=0.10.0'} 783 | dev: true 784 | 785 | /fast-deep-equal/3.1.3: 786 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 787 | 788 | /fast-glob/3.2.11: 789 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 790 | engines: {node: '>=8.6.0'} 791 | dependencies: 792 | '@nodelib/fs.stat': 2.0.5 793 | '@nodelib/fs.walk': 1.2.8 794 | glob-parent: 5.1.2 795 | merge2: 1.4.1 796 | micromatch: 4.0.5 797 | dev: true 798 | 799 | /fast-json-stable-stringify/2.1.0: 800 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 801 | dev: true 802 | 803 | /fast-levenshtein/2.0.6: 804 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 805 | dev: true 806 | 807 | /fastq/1.13.0: 808 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 809 | dependencies: 810 | reusify: 1.0.4 811 | dev: true 812 | 813 | /fd-slicer/1.1.0: 814 | resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} 815 | dependencies: 816 | pend: 1.2.0 817 | dev: false 818 | 819 | /file-entry-cache/6.0.1: 820 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 821 | engines: {node: ^10.12.0 || >=12.0.0} 822 | dependencies: 823 | flat-cache: 3.0.4 824 | dev: true 825 | 826 | /fill-range/7.0.1: 827 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 828 | engines: {node: '>=8'} 829 | dependencies: 830 | to-regex-range: 5.0.1 831 | dev: true 832 | 833 | /find-up/2.1.0: 834 | resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} 835 | engines: {node: '>=4'} 836 | dependencies: 837 | locate-path: 2.0.0 838 | dev: true 839 | 840 | /flat-cache/3.0.4: 841 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 842 | engines: {node: ^10.12.0 || >=12.0.0} 843 | dependencies: 844 | flatted: 3.2.5 845 | rimraf: 3.0.2 846 | dev: true 847 | 848 | /flatted/3.2.5: 849 | resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} 850 | dev: true 851 | 852 | /flushwritable/1.0.0: 853 | resolution: {integrity: sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==} 854 | dev: false 855 | 856 | /form-data/3.0.1: 857 | resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} 858 | engines: {node: '>= 6'} 859 | dependencies: 860 | asynckit: 0.4.0 861 | combined-stream: 1.0.8 862 | mime-types: 2.1.35 863 | dev: false 864 | 865 | /form-data/4.0.0: 866 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 867 | engines: {node: '>= 6'} 868 | dependencies: 869 | asynckit: 0.4.0 870 | combined-stream: 1.0.8 871 | mime-types: 2.1.35 872 | dev: false 873 | 874 | /fs-constants/1.0.0: 875 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 876 | dev: false 877 | 878 | /fs.realpath/1.0.0: 879 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 880 | dev: true 881 | 882 | /function-bind/1.1.1: 883 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 884 | dev: true 885 | 886 | /function.prototype.name/1.1.5: 887 | resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 888 | engines: {node: '>= 0.4'} 889 | dependencies: 890 | call-bind: 1.0.2 891 | define-properties: 1.1.4 892 | es-abstract: 1.20.1 893 | functions-have-names: 1.2.3 894 | dev: true 895 | 896 | /functional-red-black-tree/1.0.1: 897 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 898 | dev: true 899 | 900 | /functions-have-names/1.2.3: 901 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 902 | dev: true 903 | 904 | /get-intrinsic/1.1.1: 905 | resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} 906 | dependencies: 907 | function-bind: 1.1.1 908 | has: 1.0.3 909 | has-symbols: 1.0.3 910 | dev: true 911 | 912 | /get-ready/1.0.0: 913 | resolution: {integrity: sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==} 914 | dev: false 915 | 916 | /get-symbol-description/1.0.0: 917 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 918 | engines: {node: '>= 0.4'} 919 | dependencies: 920 | call-bind: 1.0.2 921 | get-intrinsic: 1.1.1 922 | dev: true 923 | 924 | /glob-parent/5.1.2: 925 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 926 | engines: {node: '>= 6'} 927 | dependencies: 928 | is-glob: 4.0.3 929 | dev: true 930 | 931 | /glob-parent/6.0.2: 932 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 933 | engines: {node: '>=10.13.0'} 934 | dependencies: 935 | is-glob: 4.0.3 936 | dev: true 937 | 938 | /glob/7.2.3: 939 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 940 | dependencies: 941 | fs.realpath: 1.0.0 942 | inflight: 1.0.6 943 | inherits: 2.0.4 944 | minimatch: 3.1.2 945 | once: 1.4.0 946 | path-is-absolute: 1.0.1 947 | dev: true 948 | 949 | /globals/13.15.0: 950 | resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} 951 | engines: {node: '>=8'} 952 | dependencies: 953 | type-fest: 0.20.2 954 | dev: true 955 | 956 | /globby/11.1.0: 957 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 958 | engines: {node: '>=10'} 959 | dependencies: 960 | array-union: 2.1.0 961 | dir-glob: 3.0.1 962 | fast-glob: 3.2.11 963 | ignore: 5.2.0 964 | merge2: 1.4.1 965 | slash: 3.0.0 966 | dev: true 967 | 968 | /has-bigints/1.0.2: 969 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 970 | dev: true 971 | 972 | /has-flag/4.0.0: 973 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 974 | engines: {node: '>=8'} 975 | 976 | /has-property-descriptors/1.0.0: 977 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} 978 | dependencies: 979 | get-intrinsic: 1.1.1 980 | dev: true 981 | 982 | /has-symbols/1.0.3: 983 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 984 | engines: {node: '>= 0.4'} 985 | dev: true 986 | 987 | /has-tostringtag/1.0.0: 988 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 989 | engines: {node: '>= 0.4'} 990 | dependencies: 991 | has-symbols: 1.0.3 992 | dev: true 993 | 994 | /has/1.0.3: 995 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 996 | engines: {node: '>= 0.4.0'} 997 | dependencies: 998 | function-bind: 1.1.1 999 | dev: true 1000 | 1001 | /iconv-lite/0.5.2: 1002 | resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} 1003 | engines: {node: '>=0.10.0'} 1004 | dependencies: 1005 | safer-buffer: 2.1.2 1006 | dev: false 1007 | 1008 | /ignore/5.2.0: 1009 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 1010 | engines: {node: '>= 4'} 1011 | dev: true 1012 | 1013 | /import-fresh/3.3.0: 1014 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1015 | engines: {node: '>=6'} 1016 | dependencies: 1017 | parent-module: 1.0.1 1018 | resolve-from: 4.0.0 1019 | dev: true 1020 | 1021 | /imurmurhash/0.1.4: 1022 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1023 | engines: {node: '>=0.8.19'} 1024 | dev: true 1025 | 1026 | /inflight/1.0.6: 1027 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1028 | dependencies: 1029 | once: 1.4.0 1030 | wrappy: 1.0.2 1031 | dev: true 1032 | 1033 | /inherits/2.0.4: 1034 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1035 | 1036 | /internal-slot/1.0.3: 1037 | resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} 1038 | engines: {node: '>= 0.4'} 1039 | dependencies: 1040 | get-intrinsic: 1.1.1 1041 | has: 1.0.3 1042 | side-channel: 1.0.4 1043 | dev: true 1044 | 1045 | /is-bigint/1.0.4: 1046 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1047 | dependencies: 1048 | has-bigints: 1.0.2 1049 | dev: true 1050 | 1051 | /is-boolean-object/1.1.2: 1052 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1053 | engines: {node: '>= 0.4'} 1054 | dependencies: 1055 | call-bind: 1.0.2 1056 | has-tostringtag: 1.0.0 1057 | dev: true 1058 | 1059 | /is-callable/1.2.4: 1060 | resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} 1061 | engines: {node: '>= 0.4'} 1062 | dev: true 1063 | 1064 | /is-core-module/2.9.0: 1065 | resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} 1066 | dependencies: 1067 | has: 1.0.3 1068 | dev: true 1069 | 1070 | /is-date-object/1.0.5: 1071 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1072 | engines: {node: '>= 0.4'} 1073 | dependencies: 1074 | has-tostringtag: 1.0.0 1075 | dev: true 1076 | 1077 | /is-extglob/2.1.1: 1078 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1079 | engines: {node: '>=0.10.0'} 1080 | dev: true 1081 | 1082 | /is-glob/4.0.3: 1083 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1084 | engines: {node: '>=0.10.0'} 1085 | dependencies: 1086 | is-extglob: 2.1.1 1087 | dev: true 1088 | 1089 | /is-negative-zero/2.0.2: 1090 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 1091 | engines: {node: '>= 0.4'} 1092 | dev: true 1093 | 1094 | /is-number-object/1.0.7: 1095 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1096 | engines: {node: '>= 0.4'} 1097 | dependencies: 1098 | has-tostringtag: 1.0.0 1099 | dev: true 1100 | 1101 | /is-number/7.0.0: 1102 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1103 | engines: {node: '>=0.12.0'} 1104 | dev: true 1105 | 1106 | /is-regex/1.1.4: 1107 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1108 | engines: {node: '>= 0.4'} 1109 | dependencies: 1110 | call-bind: 1.0.2 1111 | has-tostringtag: 1.0.0 1112 | dev: true 1113 | 1114 | /is-shared-array-buffer/1.0.2: 1115 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1116 | dependencies: 1117 | call-bind: 1.0.2 1118 | dev: true 1119 | 1120 | /is-string/1.0.7: 1121 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1122 | engines: {node: '>= 0.4'} 1123 | dependencies: 1124 | has-tostringtag: 1.0.0 1125 | dev: true 1126 | 1127 | /is-symbol/1.0.4: 1128 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1129 | engines: {node: '>= 0.4'} 1130 | dependencies: 1131 | has-symbols: 1.0.3 1132 | dev: true 1133 | 1134 | /is-weakref/1.0.2: 1135 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1136 | dependencies: 1137 | call-bind: 1.0.2 1138 | dev: true 1139 | 1140 | /isarray/1.0.0: 1141 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1142 | dev: false 1143 | 1144 | /isexe/2.0.0: 1145 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1146 | dev: true 1147 | 1148 | /js-yaml/4.1.0: 1149 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1150 | hasBin: true 1151 | dependencies: 1152 | argparse: 2.0.1 1153 | dev: true 1154 | 1155 | /json-schema-traverse/0.4.1: 1156 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1157 | dev: true 1158 | 1159 | /json-stable-stringify-without-jsonify/1.0.1: 1160 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1161 | dev: true 1162 | 1163 | /json5/1.0.1: 1164 | resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} 1165 | hasBin: true 1166 | dependencies: 1167 | minimist: 1.2.6 1168 | dev: true 1169 | 1170 | /levn/0.4.1: 1171 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1172 | engines: {node: '>= 0.8.0'} 1173 | dependencies: 1174 | prelude-ls: 1.2.1 1175 | type-check: 0.4.0 1176 | dev: true 1177 | 1178 | /locate-path/2.0.0: 1179 | resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} 1180 | engines: {node: '>=4'} 1181 | dependencies: 1182 | p-locate: 2.0.0 1183 | path-exists: 3.0.0 1184 | dev: true 1185 | 1186 | /lodash.merge/4.6.2: 1187 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1188 | dev: true 1189 | 1190 | /lru-cache/6.0.0: 1191 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1192 | engines: {node: '>=10'} 1193 | dependencies: 1194 | yallist: 4.0.0 1195 | dev: true 1196 | 1197 | /luxon/2.4.0: 1198 | resolution: {integrity: sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA==} 1199 | engines: {node: '>=12'} 1200 | dev: false 1201 | 1202 | /merge2/1.4.1: 1203 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1204 | engines: {node: '>= 8'} 1205 | dev: true 1206 | 1207 | /micromatch/4.0.5: 1208 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1209 | engines: {node: '>=8.6'} 1210 | dependencies: 1211 | braces: 3.0.2 1212 | picomatch: 2.3.1 1213 | dev: true 1214 | 1215 | /mime-db/1.52.0: 1216 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1217 | engines: {node: '>= 0.6'} 1218 | dev: false 1219 | 1220 | /mime-types/2.1.35: 1221 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1222 | engines: {node: '>= 0.6'} 1223 | dependencies: 1224 | mime-db: 1.52.0 1225 | dev: false 1226 | 1227 | /minimatch/3.1.2: 1228 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1229 | dependencies: 1230 | brace-expansion: 1.1.11 1231 | dev: true 1232 | 1233 | /minimist/1.2.6: 1234 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} 1235 | 1236 | /mkdirp/0.5.6: 1237 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1238 | hasBin: true 1239 | dependencies: 1240 | minimist: 1.2.6 1241 | dev: false 1242 | 1243 | /ms/2.0.0: 1244 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1245 | dev: true 1246 | 1247 | /ms/2.1.2: 1248 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1249 | dev: true 1250 | 1251 | /ms/2.1.3: 1252 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1253 | dev: true 1254 | 1255 | /natural-compare/1.4.0: 1256 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1257 | dev: true 1258 | 1259 | /node-fetch/2.6.7: 1260 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 1261 | engines: {node: 4.x || >=6.0.0} 1262 | peerDependencies: 1263 | encoding: ^0.1.0 1264 | peerDependenciesMeta: 1265 | encoding: 1266 | optional: true 1267 | dependencies: 1268 | whatwg-url: 5.0.0 1269 | dev: false 1270 | 1271 | /object-inspect/1.12.2: 1272 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1273 | dev: true 1274 | 1275 | /object-keys/1.1.1: 1276 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1277 | engines: {node: '>= 0.4'} 1278 | dev: true 1279 | 1280 | /object.assign/4.1.2: 1281 | resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} 1282 | engines: {node: '>= 0.4'} 1283 | dependencies: 1284 | call-bind: 1.0.2 1285 | define-properties: 1.1.4 1286 | has-symbols: 1.0.3 1287 | object-keys: 1.1.1 1288 | dev: true 1289 | 1290 | /object.values/1.1.5: 1291 | resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} 1292 | engines: {node: '>= 0.4'} 1293 | dependencies: 1294 | call-bind: 1.0.2 1295 | define-properties: 1.1.4 1296 | es-abstract: 1.20.1 1297 | dev: true 1298 | 1299 | /once/1.4.0: 1300 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1301 | dependencies: 1302 | wrappy: 1.0.2 1303 | 1304 | /optionator/0.9.1: 1305 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1306 | engines: {node: '>= 0.8.0'} 1307 | dependencies: 1308 | deep-is: 0.1.4 1309 | fast-levenshtein: 2.0.6 1310 | levn: 0.4.1 1311 | prelude-ls: 1.2.1 1312 | type-check: 0.4.0 1313 | word-wrap: 1.2.3 1314 | dev: true 1315 | 1316 | /p-limit/1.3.0: 1317 | resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} 1318 | engines: {node: '>=4'} 1319 | dependencies: 1320 | p-try: 1.0.0 1321 | dev: true 1322 | 1323 | /p-locate/2.0.0: 1324 | resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} 1325 | engines: {node: '>=4'} 1326 | dependencies: 1327 | p-limit: 1.3.0 1328 | dev: true 1329 | 1330 | /p-try/1.0.0: 1331 | resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} 1332 | engines: {node: '>=4'} 1333 | dev: true 1334 | 1335 | /parent-module/1.0.1: 1336 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1337 | engines: {node: '>=6'} 1338 | dependencies: 1339 | callsites: 3.1.0 1340 | dev: true 1341 | 1342 | /path-exists/3.0.0: 1343 | resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} 1344 | engines: {node: '>=4'} 1345 | dev: true 1346 | 1347 | /path-is-absolute/1.0.1: 1348 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1349 | engines: {node: '>=0.10.0'} 1350 | dev: true 1351 | 1352 | /path-key/3.1.1: 1353 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1354 | engines: {node: '>=8'} 1355 | dev: true 1356 | 1357 | /path-parse/1.0.7: 1358 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1359 | dev: true 1360 | 1361 | /path-type/4.0.0: 1362 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1363 | engines: {node: '>=8'} 1364 | dev: true 1365 | 1366 | /pend/1.2.0: 1367 | resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 1368 | dev: false 1369 | 1370 | /picomatch/2.3.1: 1371 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1372 | engines: {node: '>=8.6'} 1373 | dev: true 1374 | 1375 | /prelude-ls/1.2.1: 1376 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1377 | engines: {node: '>= 0.8.0'} 1378 | dev: true 1379 | 1380 | /process-nextick-args/2.0.1: 1381 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1382 | dev: false 1383 | 1384 | /pump/3.0.0: 1385 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1386 | dependencies: 1387 | end-of-stream: 1.4.4 1388 | once: 1.4.0 1389 | dev: false 1390 | 1391 | /punycode/2.1.1: 1392 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 1393 | engines: {node: '>=6'} 1394 | dev: true 1395 | 1396 | /queue-microtask/1.2.3: 1397 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1398 | dev: true 1399 | 1400 | /readable-stream/2.3.7: 1401 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1402 | dependencies: 1403 | core-util-is: 1.0.3 1404 | inherits: 2.0.4 1405 | isarray: 1.0.0 1406 | process-nextick-args: 2.0.1 1407 | safe-buffer: 5.1.2 1408 | string_decoder: 1.1.1 1409 | util-deprecate: 1.0.2 1410 | dev: false 1411 | 1412 | /regexp.prototype.flags/1.4.3: 1413 | resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} 1414 | engines: {node: '>= 0.4'} 1415 | dependencies: 1416 | call-bind: 1.0.2 1417 | define-properties: 1.1.4 1418 | functions-have-names: 1.2.3 1419 | dev: true 1420 | 1421 | /regexpp/3.2.0: 1422 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 1423 | engines: {node: '>=8'} 1424 | dev: true 1425 | 1426 | /resolve-from/4.0.0: 1427 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1428 | engines: {node: '>=4'} 1429 | dev: true 1430 | 1431 | /resolve/1.22.0: 1432 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} 1433 | hasBin: true 1434 | dependencies: 1435 | is-core-module: 2.9.0 1436 | path-parse: 1.0.7 1437 | supports-preserve-symlinks-flag: 1.0.0 1438 | dev: true 1439 | 1440 | /reusify/1.0.4: 1441 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1442 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1443 | dev: true 1444 | 1445 | /rimraf/3.0.2: 1446 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1447 | hasBin: true 1448 | dependencies: 1449 | glob: 7.2.3 1450 | dev: true 1451 | 1452 | /run-parallel/1.2.0: 1453 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1454 | dependencies: 1455 | queue-microtask: 1.2.3 1456 | dev: true 1457 | 1458 | /safe-buffer/5.1.2: 1459 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1460 | dev: false 1461 | 1462 | /safe-buffer/5.2.1: 1463 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1464 | dev: false 1465 | 1466 | /safer-buffer/2.1.2: 1467 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1468 | dev: false 1469 | 1470 | /semver/7.3.7: 1471 | resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} 1472 | engines: {node: '>=10'} 1473 | hasBin: true 1474 | dependencies: 1475 | lru-cache: 6.0.0 1476 | dev: true 1477 | 1478 | /shebang-command/2.0.0: 1479 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1480 | engines: {node: '>=8'} 1481 | dependencies: 1482 | shebang-regex: 3.0.0 1483 | dev: true 1484 | 1485 | /shebang-regex/3.0.0: 1486 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1487 | engines: {node: '>=8'} 1488 | dev: true 1489 | 1490 | /side-channel/1.0.4: 1491 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1492 | dependencies: 1493 | call-bind: 1.0.2 1494 | get-intrinsic: 1.1.1 1495 | object-inspect: 1.12.2 1496 | dev: true 1497 | 1498 | /slash/3.0.0: 1499 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1500 | engines: {node: '>=8'} 1501 | dev: true 1502 | 1503 | /streamifier/0.1.1: 1504 | resolution: {integrity: sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==} 1505 | engines: {node: '>=0.10'} 1506 | dev: false 1507 | 1508 | /string.prototype.trimend/1.0.5: 1509 | resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} 1510 | dependencies: 1511 | call-bind: 1.0.2 1512 | define-properties: 1.1.4 1513 | es-abstract: 1.20.1 1514 | dev: true 1515 | 1516 | /string.prototype.trimstart/1.0.5: 1517 | resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} 1518 | dependencies: 1519 | call-bind: 1.0.2 1520 | define-properties: 1.1.4 1521 | es-abstract: 1.20.1 1522 | dev: true 1523 | 1524 | /string_decoder/1.1.1: 1525 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1526 | dependencies: 1527 | safe-buffer: 5.1.2 1528 | dev: false 1529 | 1530 | /strip-ansi/6.0.1: 1531 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1532 | engines: {node: '>=8'} 1533 | dependencies: 1534 | ansi-regex: 5.0.1 1535 | dev: true 1536 | 1537 | /strip-bom/3.0.0: 1538 | resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=} 1539 | engines: {node: '>=4'} 1540 | dev: true 1541 | 1542 | /strip-json-comments/3.1.1: 1543 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1544 | engines: {node: '>=8'} 1545 | dev: true 1546 | 1547 | /supports-color/7.2.0: 1548 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1549 | engines: {node: '>=8'} 1550 | dependencies: 1551 | has-flag: 4.0.0 1552 | 1553 | /supports-preserve-symlinks-flag/1.0.0: 1554 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1555 | engines: {node: '>= 0.4'} 1556 | dev: true 1557 | 1558 | /tar-stream/1.6.2: 1559 | resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} 1560 | engines: {node: '>= 0.8.0'} 1561 | dependencies: 1562 | bl: 1.2.3 1563 | buffer-alloc: 1.2.0 1564 | end-of-stream: 1.4.4 1565 | fs-constants: 1.0.0 1566 | readable-stream: 2.3.7 1567 | to-buffer: 1.1.1 1568 | xtend: 4.0.2 1569 | dev: false 1570 | 1571 | /text-table/0.2.0: 1572 | resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} 1573 | dev: true 1574 | 1575 | /to-buffer/1.1.1: 1576 | resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} 1577 | dev: false 1578 | 1579 | /to-regex-range/5.0.1: 1580 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1581 | engines: {node: '>=8.0'} 1582 | dependencies: 1583 | is-number: 7.0.0 1584 | dev: true 1585 | 1586 | /tr46/0.0.3: 1587 | resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} 1588 | dev: false 1589 | 1590 | /ts-mixer/6.0.1: 1591 | resolution: {integrity: sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==} 1592 | dev: false 1593 | 1594 | /tsconfig-paths/3.14.1: 1595 | resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} 1596 | dependencies: 1597 | '@types/json5': 0.0.29 1598 | json5: 1.0.1 1599 | minimist: 1.2.6 1600 | strip-bom: 3.0.0 1601 | dev: true 1602 | 1603 | /tslib/1.14.1: 1604 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1605 | dev: true 1606 | 1607 | /tslib/2.4.0: 1608 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 1609 | dev: false 1610 | 1611 | /tsutils/3.21.0_typescript@4.7.4: 1612 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 1613 | engines: {node: '>= 6'} 1614 | peerDependencies: 1615 | 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' 1616 | dependencies: 1617 | tslib: 1.14.1 1618 | typescript: 4.7.4 1619 | dev: true 1620 | 1621 | /type-check/0.4.0: 1622 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1623 | engines: {node: '>= 0.8.0'} 1624 | dependencies: 1625 | prelude-ls: 1.2.1 1626 | dev: true 1627 | 1628 | /type-fest/0.20.2: 1629 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1630 | engines: {node: '>=10'} 1631 | dev: true 1632 | 1633 | /typescript/4.7.4: 1634 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} 1635 | engines: {node: '>=4.2.0'} 1636 | hasBin: true 1637 | dev: true 1638 | 1639 | /unbox-primitive/1.0.2: 1640 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 1641 | dependencies: 1642 | call-bind: 1.0.2 1643 | has-bigints: 1.0.2 1644 | has-symbols: 1.0.3 1645 | which-boxed-primitive: 1.0.2 1646 | dev: true 1647 | 1648 | /uri-js/4.4.1: 1649 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1650 | dependencies: 1651 | punycode: 2.1.1 1652 | dev: true 1653 | 1654 | /util-deprecate/1.0.2: 1655 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1656 | dev: false 1657 | 1658 | /v8-compile-cache/2.3.0: 1659 | resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} 1660 | dev: true 1661 | 1662 | /webidl-conversions/3.0.1: 1663 | resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} 1664 | dev: false 1665 | 1666 | /whatwg-url/5.0.0: 1667 | resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} 1668 | dependencies: 1669 | tr46: 0.0.3 1670 | webidl-conversions: 3.0.1 1671 | dev: false 1672 | 1673 | /which-boxed-primitive/1.0.2: 1674 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 1675 | dependencies: 1676 | is-bigint: 1.0.4 1677 | is-boolean-object: 1.1.2 1678 | is-number-object: 1.0.7 1679 | is-string: 1.0.7 1680 | is-symbol: 1.0.4 1681 | dev: true 1682 | 1683 | /which/2.0.2: 1684 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1685 | engines: {node: '>= 8'} 1686 | hasBin: true 1687 | dependencies: 1688 | isexe: 2.0.0 1689 | dev: true 1690 | 1691 | /word-wrap/1.2.3: 1692 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 1693 | engines: {node: '>=0.10.0'} 1694 | dev: true 1695 | 1696 | /wrappy/1.0.2: 1697 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1698 | 1699 | /ws/8.7.0: 1700 | resolution: {integrity: sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==} 1701 | engines: {node: '>=10.0.0'} 1702 | peerDependencies: 1703 | bufferutil: ^4.0.1 1704 | utf-8-validate: ^5.0.2 1705 | peerDependenciesMeta: 1706 | bufferutil: 1707 | optional: true 1708 | utf-8-validate: 1709 | optional: true 1710 | dev: false 1711 | 1712 | /xtend/4.0.2: 1713 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1714 | engines: {node: '>=0.4'} 1715 | dev: false 1716 | 1717 | /yallist/4.0.0: 1718 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1719 | dev: true 1720 | 1721 | /yauzl/2.10.0: 1722 | resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} 1723 | dependencies: 1724 | buffer-crc32: 0.2.13 1725 | fd-slicer: 1.1.0 1726 | dev: false 1727 | 1728 | /yazl/2.5.1: 1729 | resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} 1730 | dependencies: 1731 | buffer-crc32: 0.2.13 1732 | dev: false 1733 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * VECTOR :: INITIALIZATION AND SHARD MANAGEMENT 3 | */ 4 | 5 | import * as fs from 'fs'; 6 | // import * as util from 'util'; 7 | import { ShardingManager } from 'discord.js'; 8 | import * as pkg from '../package.json'; 9 | import * as cfg from '../config/bot.json'; 10 | import isInterface from './util/isInterface'; 11 | import Logger, { LoggingLevel } from './util/logger'; 12 | import keys from '../config/keys.json'; 13 | 14 | process.title = `Vector Bot ${pkg.version}`; 15 | 16 | const debugMode = process.argv.includes(`--debug`) || process.argv.includes(`-d`); 17 | let logins = 1; 18 | 19 | // create directories that may or may not exist because Git(TM) 20 | const mkdirs = [ 21 | `./.local`, 22 | `./data/archive`, 23 | `./logs/crash`, 24 | `./logs/archive`, 25 | `./logs/all` 26 | ]; 27 | 28 | for (const item of mkdirs) { 29 | if (!fs.existsSync(item)) { 30 | fs.mkdirSync(item, { recursive: true }); 31 | } 32 | } 33 | 34 | Logger.compressLogs(); // Compress the log files before instantiating a new Logger class as to clean up any files from a previous session 35 | 36 | // check login count, to prevent API spam in the case of a boot loop 37 | interface ErrorWithCode extends Error { 38 | code?: string 39 | } 40 | 41 | try { 42 | // try making file if it does not exist 43 | const data = { 44 | logins: 1, 45 | time: new Date().getTime() 46 | }; 47 | 48 | fs.writeFileSync(`./data/resets`, JSON.stringify(data), { encoding: `utf8`, flag: `ax` }); 49 | } catch (e: unknown) { 50 | 51 | if (isInterface(e, `code`)) { 52 | if (e.code !== `EEXIST`) { 53 | throw e; 54 | } 55 | } 56 | 57 | const oldData = fs.readFileSync(`./data/resets`, { encoding: `utf8` }); 58 | 59 | let json = { 60 | logins: 0, 61 | time: 0 62 | }; 63 | 64 | // Attempt to parse as JSON. 65 | // If the JSON data is corrupt, it'll be up to the user to fix it. 66 | // Simply overwriting with default values could cause problems down the line. 67 | json = JSON.parse(oldData); 68 | 69 | // if it's been more than an hour, reset the login count 70 | const now = new Date().getTime(); 71 | if (now - json.time > (1000 * 60 * 60)) { 72 | json.logins = 0; 73 | json.time = now; 74 | } 75 | 76 | json.logins++; 77 | 78 | logins = json.logins; 79 | 80 | fs.writeFileSync(`./data/resets`, JSON.stringify(json), { encoding: `utf8` }); 81 | } 82 | 83 | const logger = new Logger({ loginCount: logins }); 84 | 85 | // check login count before proceeding 86 | if (debugMode) { 87 | if (logins === cfg.loginLimit.absolute) { 88 | logger.fatal(`too many resets`); 89 | process.exit(1); 90 | } 91 | } else { 92 | if (logins > cfg.loginLimit.warning) { 93 | logger.warn(`lots of resets`); 94 | } 95 | 96 | if (logins > cfg.loginLimit.shutdown) { 97 | logger.fatal(`too many resets`); 98 | process.exit(1); 99 | } 100 | } 101 | 102 | // we did it reddit 103 | logger.verbose(`:)`); 104 | 105 | interface ShardMessage { 106 | type: LoggingLevel, 107 | content: string 108 | } 109 | 110 | const options = { 111 | token: keys.discord, 112 | shardArgs: [debugMode.toString()] 113 | }; 114 | 115 | const shardManager = new ShardingManager(`./build/src/shard.js`, options); 116 | 117 | shardManager.on(`shardCreate`, shard => { 118 | logger.log(`Launched shard ${shard.id}`); 119 | 120 | shard.on(`message`, (message: ShardMessage) => { 121 | switch (message.type) { 122 | case `log`: { 123 | logger.log(`[Shard ${shard.id}] ${message.content}`); 124 | break; 125 | } 126 | case `warn`: { 127 | logger.warn(`[Shard ${shard.id}] ${message.content}`); 128 | break; 129 | } 130 | case `error`: { 131 | logger.error(`[Shard ${shard.id}] ${message.content}`); 132 | break; 133 | } 134 | case `fatal`: { 135 | logger.fatal(`[Shard ${shard.id}] ${message.content}`); 136 | break; 137 | } 138 | case `verbose`: { 139 | logger.verbose(`[Shard ${shard.id}] ${message.content}`); 140 | break; 141 | } 142 | default: { 143 | logger.warn(`[Master] Unexpected message from shard ${shard.id}: ${message}`); 144 | break; 145 | } 146 | } 147 | }); 148 | }); 149 | 150 | shardManager.spawn(); 151 | -------------------------------------------------------------------------------- /src/shard.ts: -------------------------------------------------------------------------------- 1 | import { Client, Intents } from 'discord.js'; 2 | import Logger from './util/logger'; 3 | import keys from '../config/keys.json'; 4 | 5 | export const logger = new Logger(); 6 | 7 | // const debugMode = process.argv.includes(`--debug`) || process.argv.includes(`-d`); 8 | 9 | const client = new Client({ 10 | intents: [ 11 | Intents.FLAGS.GUILDS, 12 | Intents.FLAGS.GUILD_MEMBERS, 13 | Intents.FLAGS.GUILD_MESSAGES, 14 | Intents.FLAGS.DIRECT_MESSAGES 15 | ] 16 | }); 17 | 18 | client.login(keys.discord) 19 | .then(() => { 20 | logger.log(`Successfully logged in as ${client.user?.tag}! Shard: [${client.shard?.ids.map(s => s + 1).join(`, `)}/${client.shard?.count}]`); 21 | process.title = `Vector Shard ${client.shard?.ids.map(s => s + 1).join(`, `)}/${client.shard?.count}`; 22 | }) 23 | .catch(error => { 24 | logger.fatal(`Unexpected error when logging into Discord:\n${error}`); 25 | process.exit(1); 26 | }); -------------------------------------------------------------------------------- /src/util/isInterface.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ 2 | /* eslint-disable @typescript-eslint/no-explicit-any */ 3 | 4 | /** 5 | * Type guard for unknown objects to see if they are actually a specific interface 6 | * @param obj Object to check 7 | * @param property Property that exists on T 8 | */ 9 | export default function isInterface(obj: any, property: keyof T): obj is T { 10 | return property in obj; 11 | } 12 | -------------------------------------------------------------------------------- /src/util/logger.ts: -------------------------------------------------------------------------------- 1 | // Logger class for easy and aesthetically pleasing console logging 2 | 3 | import chalk from "chalk"; 4 | import { DateTime } from "luxon"; 5 | import { inspect } from "util"; 6 | import { PathLike } from "fs"; 7 | import { appendFile, readdir, rm, stat, access, mkdir, rename } from "fs/promises"; 8 | import { zip } from "compressing"; 9 | 10 | const defaultFilePath: PathLike = `logs`; 11 | 12 | export type LoggingLevel = `log` | `warn` | `error` | `fatal` | `verbose`; 13 | 14 | // https://cdn.discordapp.com/attachments/275344239850946561/990825655082049586/unknown.png 15 | type strange = string; 16 | 17 | interface LoggerOptions { 18 | loginCount?: number, 19 | writeToFile?: boolean, 20 | filePath?: strange 21 | } 22 | 23 | export default class Logger { 24 | 25 | private readonly writeToFile = true; // Write to log files by default 26 | private readonly filePath: PathLike = defaultFilePath; 27 | private loginCount?: number; 28 | 29 | constructor(options?: LoggerOptions) { 30 | if (options?.writeToFile) { 31 | this.writeToFile = options.writeToFile; 32 | } 33 | 34 | if (options?.filePath) { 35 | this.filePath = options.filePath; 36 | } 37 | 38 | if (options?.loginCount) { 39 | if (process.send) 40 | throw new Error(`Cannot set login count when running as a shard`); 41 | 42 | this.loginCount = options.loginCount; 43 | } 44 | 45 | if (!process.send && !this.loginCount) 46 | throw new Error(`Must set login count when not running as a shard`); 47 | 48 | } 49 | 50 | /** 51 | * generic, everyday logging. 52 | */ 53 | public log(info: string): void { 54 | if (process.send) { 55 | process.send({ type: `log`, content: info }); 56 | return; 57 | } 58 | 59 | this.appendToLog(`log`, info); 60 | return console.log(`${this.getTimestamp()} ${chalk.blue(`info:`)} ${info} `); 61 | } 62 | 63 | /** 64 | * for things that *could* be a problem but *should* be fine..? 65 | */ 66 | public warn(info: string): void { 67 | if (process.send) { 68 | process.send({ type: `warn`, content: info }); 69 | return; 70 | } 71 | 72 | this.appendToLog(`warn`, info); 73 | return console.warn(`${this.getTimestamp()} ${chalk.yellow(`warn:`)} ${info} `); 74 | } 75 | 76 | /** 77 | * generic, everyday erroring 78 | */ 79 | public error(info: Error | string): void { 80 | if (process.send) { 81 | process.send({ type: `error`, content: info }); 82 | return; 83 | } 84 | 85 | if (info instanceof Error) { 86 | info = (info.stack ?? info.message) 87 | .split(`\n`) 88 | .join(`\n${this.getTimestamp()} ${chalk.red(`error:`)}`); 89 | } 90 | 91 | this.appendToLog(`error`, info); 92 | console.error(`${this.getTimestamp()} ${chalk.red(`error:`)} ${info}`); 93 | } 94 | 95 | /** 96 | * for when there's an unexpected error that we haven't sent to logger.error 97 | */ 98 | public fatal(info: Error | string): void { 99 | if (process.send) { 100 | process.send({ type: `fatal`, content: info }); 101 | return; 102 | } 103 | 104 | if (info instanceof Error) { 105 | info = (info.stack ?? info.message) 106 | .split(`\n`) 107 | .join(`\n${this.getTimestamp()} ${chalk.bgRed.white(`FATAL:`)}`); 108 | } 109 | 110 | this.appendToLog(`fatal`, info); 111 | console.error(`${this.getTimestamp()} ${chalk.bgRed.white(`FATAL:`)} ${chalk.red(info)}`); 112 | } 113 | 114 | /** 115 | * SPAM SPAM SPAM SPAM SPAM 116 | */ 117 | public verbose(info: unknown): void { 118 | if (typeof info === `object`) 119 | info = inspect(info, { depth: 0, colors: true }); 120 | 121 | if (process.send) { 122 | process.send({ type: `verbose`, content: info }); 123 | return; 124 | } 125 | 126 | if (info instanceof Error) 127 | info = (info.stack ?? info.message) 128 | .split(`\n`) 129 | .join(`\n${this.getTimestamp()} ${chalk.grey(`verbose:`)}`); 130 | 131 | return console.log(`${this.getTimestamp()} ${chalk.gray(`verbose:`)} ${chalk.gray(info)} `); 132 | } 133 | 134 | private async appendToLog(level: LoggingLevel, content: string): Promise { 135 | if (!this.writeToFile) return; 136 | 137 | const contentTimestamp = DateTime.utc().toFormat(`yyyy-MM-dd HH:mm:ss.SSS`); 138 | const toWrite = `${contentTimestamp} ${level.toUpperCase()} ${content}\n`; 139 | const fileTimestamp = DateTime.utc().toFormat(`yyyy-MM-dd`); 140 | await appendFile(`./${this.filePath}/${fileTimestamp}.${this.loginCount}.log`, toWrite); 141 | } 142 | 143 | // This is static so we can call it even before the logger is initialized if we want. 144 | public static async compressLogs(filePath?: PathLike): Promise { 145 | if (!filePath) 146 | filePath = defaultFilePath; 147 | 148 | const date = new Date(); 149 | const currentYear = date.getUTCFullYear(); 150 | const currentMonth = date.getUTCMonth() + 1; // month is 0-indexed annoyingly 151 | const currentDay = date.getUTCDate(); 152 | 153 | try { 154 | await access(`${filePath}/archive/${currentYear}/${currentMonth}/`); 155 | } catch (e) { 156 | await mkdir(`${filePath}/archive/${currentYear}/${currentMonth}/`, { recursive: true }); 157 | } 158 | 159 | const minimumFileSize = 250; // bytes 160 | // 250 (give or take) is the minimum number of bytes for these zip files from what I've seen. 161 | // That's just the login information with no extra data. If we compress the log file, 162 | // the resulting zip file is actually bigger because of the additional zip header data. 163 | // This can add up if the bot goes through a bunch of restarts with no additional data. 164 | 165 | const files = await readdir(filePath); 166 | for (const file of files) { 167 | const fileStats = await stat(`${filePath}/${file}`); 168 | if (fileStats.isDirectory()) // File is a directory, skip to next iteration. 169 | continue; 170 | 171 | const restartNumber = file.match(/(?<=\d\.)\d+(?=\.log)/i)?.[0] ?? `0`; 172 | 173 | if (fileStats.size <= minimumFileSize) { 174 | // File is too small to be worth compressing, just move it to the archive folder. 175 | await rename(`./${filePath}/${file}`, `./${filePath}/archive/${currentYear}/${currentMonth}/${currentDay}.${restartNumber}.log`); 176 | } else { 177 | zip.compressFile(`./${filePath}/${file}`, `./${filePath}/archive/${currentYear}/${currentMonth}/${currentDay}.${restartNumber}.zip`); 178 | rm(`./${filePath}/${file}`); 179 | } 180 | 181 | } 182 | } 183 | 184 | private getTimestamp(): string { 185 | return chalk.grey(DateTime.utc().toFormat(`[yyyy-MM-dd HH:mm:ss.SSS]`)); 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildOptions": { 3 | "verbose": true 4 | }, 5 | "compilerOptions": { 6 | "outDir": "./build", 7 | "allowJs": true, 8 | "target": "es2020", 9 | "module": "commonjs", 10 | "strict": true, 11 | "moduleResolution": "node", 12 | "noImplicitReturns": true, 13 | "allowSyntheticDefaultImports": true, 14 | "esModuleInterop": true, 15 | "resolveJsonModule": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "lib": ["esnext"], 18 | "incremental": true, 19 | "noImplicitOverride": true, 20 | "skipLibCheck": true 21 | }, 22 | "include": ["./src/**/*"], 23 | } 24 | -------------------------------------------------------------------------------- /windows_ez_start.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | call npm run build 3 | call npm run start -- --debug 4 | pause --------------------------------------------------------------------------------