From 94aec32cd884160b48993635195c3158651b7ea4 Mon Sep 17 00:00:00 2001 From: Nathaniel Moschkin Date: Sun, 29 Oct 2023 14:47:42 -0400 Subject: [PATCH] Re-apply discord.js-upgrade --- package-lock.json | 4314 +++++++++++++++++++++--------- package.json | 14 +- src/commands/associate.ts | 6 +- src/commands/behold.ts | 8 +- src/commands/best.ts | 10 +- src/commands/cheapestfffe.ts | 131 +- src/commands/crewneed.ts | 72 +- src/commands/dilemma.ts | 117 +- src/commands/farm.ts | 28 +- src/commands/gauntlet.ts | 4 +- src/commands/meme.ts | 8 +- src/commands/offers.ts | 66 +- src/commands/profile.ts | 198 +- src/commands/search.ts | 6 +- src/commands/stats.ts | 67 +- src/data/DCData.ts | 32 +- src/datacore/archetype.ts | 62 + src/datacore/boss.ts | 375 +++ src/datacore/bridge.ts | 78 + src/datacore/collectionfilter.ts | 101 + src/datacore/crew.ts | 209 ++ src/datacore/equipment.ts | 68 + src/datacore/events.ts | 37 + src/datacore/game-elements.ts | 199 ++ src/datacore/gauntlets.ts | 145 + src/datacore/missions.ts | 215 ++ src/datacore/player.ts | 1665 ++++++++++++ src/datacore/ship.ts | 117 + src/datacore/shuttle.ts | 71 + src/datacore/traits.ts | 329 +++ src/datacore/voyage.ts | 88 + src/datacore/worker.ts | 161 ++ src/index.ts | 27 +- src/utils/beholdcalc.ts | 60 +- src/utils/config.ts | 2 +- src/utils/crew.ts | 12 +- src/utils/definitions.d.ts | 43 +- src/utils/discord.ts | 80 +- src/utils/events.ts | 226 ++ src/utils/profile.ts | 24 +- tsconfig.json | 44 +- 41 files changed, 7955 insertions(+), 1564 deletions(-) create mode 100644 src/datacore/archetype.ts create mode 100644 src/datacore/boss.ts create mode 100644 src/datacore/bridge.ts create mode 100644 src/datacore/collectionfilter.ts create mode 100644 src/datacore/crew.ts create mode 100644 src/datacore/equipment.ts create mode 100644 src/datacore/events.ts create mode 100644 src/datacore/game-elements.ts create mode 100644 src/datacore/gauntlets.ts create mode 100644 src/datacore/missions.ts create mode 100644 src/datacore/player.ts create mode 100644 src/datacore/ship.ts create mode 100644 src/datacore/shuttle.ts create mode 100644 src/datacore/traits.ts create mode 100644 src/datacore/voyage.ts create mode 100644 src/datacore/worker.ts create mode 100644 src/utils/events.ts diff --git a/package-lock.json b/package-lock.json index 0aaabf1..44560d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "datacore-bot", "version": "0.1.0", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -11,16 +11,17 @@ "dependencies": { "as-table": "^1.0.55", "chokidar": "^3.4.0", - "discord-api-types": "^0.18.1", - "discord.js": "git+https://github.com/discordjs/discord.js.git#f8703e3e59839d7380795ecf719d5bac691860a4", + "discord-api-types": "^0.37.60", + "discord.js": "^14.13.0", "dotenv": "^8.2.0", "fuse.js": "^6.2.0", + "js-levenshtein": "^1.1.6", "node-cache": "^5.1.1", "node-fetch": "^2.6.1", "pg": "^8.3.3", "reflect-metadata": "^0.1.13", - "sequelize": "^6.3.3", - "sequelize-typescript": "^2.0.0-beta.0", + "sequelize": "^6.5.0", + "sequelize-typescript": "^2.0.0", "sqlite3": "^5.0.0", "winston": "^3.2.1", "winston-daily-rotate-file": "^4.5.0", @@ -28,131 +29,348 @@ }, "devDependencies": { "@types/bluebird": "^3.5.32", - "@types/node": "^14.14.10", + "@types/js-levenshtein": "^1.1.1", + "@types/node": "^14.18.63", "@types/node-fetch": "^2.5.7", "@types/validator": "^13.1.0", "@types/ws": "^7.4.4", "@types/yargs": "^15.0.5", - "typescript": "^4.1.2" + "typescript": "^5.2.2" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" } }, "node_modules/@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, + "node_modules/@discordjs/builders": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.5.tgz", + "integrity": "sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg==", + "dependencies": { + "@discordjs/formatters": "^0.3.2", + "@discordjs/util": "^1.0.1", + "@sapphire/shapeshift": "^3.9.2", + "discord-api-types": "0.37.50", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.6.1" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + }, "node_modules/@discordjs/collection": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", - "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==", - "deprecated": "no longer supported" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "engines": { + "node": ">=16.11.0" + } }, - "node_modules/@discordjs/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/@discordjs/formatters": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.2.tgz", + "integrity": "sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "discord-api-types": "0.37.50" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/formatters/node_modules/discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + }, + "node_modules/@discordjs/rest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.0.1.tgz", + "integrity": "sha512-/eWAdDRvwX/rIE2tuQUmKaxmWeHmGealttIzGzlYfI4+a7y9b6ZoMp8BG/jaohs8D8iEnCNYaZiOFLVFLQb8Zg==", + "dependencies": { + "@discordjs/collection": "^1.5.3", + "@discordjs/util": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.5.1", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.50", + "magic-bytes.js": "^1.0.15", + "tslib": "^2.6.1", + "undici": "5.22.1" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + }, + "node_modules/@discordjs/util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.1.tgz", + "integrity": "sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA==", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.1.tgz", + "integrity": "sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g==", + "dependencies": { + "@discordjs/collection": "^1.5.3", + "@discordjs/rest": "^2.0.1", + "@discordjs/util": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.5", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.50", + "tslib": "^2.6.1", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/ws/node_modules/@types/ws": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@discordjs/ws/node_modules/discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.2.tgz", + "integrity": "sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" }, + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, "engines": { "node": ">= 6" } }, "node_modules/@types/bluebird": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.32.tgz", - "integrity": "sha512-dIOxFfI0C+jz89g6lQ+TqhGgPQ0MxSnh/E4xuC0blhFtyW269+mPG5QeLgbdwst/LvdP8o1y0o/Gz5EHXLec/g==" + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.39.tgz", + "integrity": "sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA==" + }, + "node_modules/@types/js-levenshtein": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", + "integrity": "sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==", + "dev": true }, "node_modules/@types/node": { - "version": "14.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", - "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==" + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/@types/node-fetch": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", - "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", "dev": true, "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" } }, + "node_modules/@types/triple-beam": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", + "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" + }, "node_modules/@types/validator": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.1.0.tgz", - "integrity": "sha512-gHUHI6pJaANIO2r6WcbT7+WMgbL9GZooR4tWpuBOETpDIqFNxwaJluE+6rj6VGYe8k6OkfhbHz2Fkm8kl06Igw==" + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "node_modules/@types/ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-d/7W23JAXPodQNbOZNXvl2K+bqAQrCMwlh/nuQsPSQk6Fq0opHoPrUw43aHsvSbIiQPr8Of2hkFbnz1XBFVyZQ==", + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.16", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.16.tgz", + "integrity": "sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", "dev": true }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz", + "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { - "event-target-shim": "^5.0.0" + "debug": "4" }, "engines": { - "node": ">=6.5" + "node": ">= 6.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "optional": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "humanize-ms": "^1.2.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/ansi-styles": { @@ -188,12 +406,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -203,44 +421,20 @@ } }, "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/are-we-there-yet/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/as-table": { @@ -251,89 +445,30 @@ "printable-characters": "^1.0.42" } }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "optional": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "optional": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, - "node_modules/block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "optional": true, - "dependencies": { - "inherits": "~2.0.0" - }, - "engines": { - "node": "0.4 || >=0.5.8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -362,6 +497,46 @@ "node": ">=4" } }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -370,36 +545,48 @@ "node": ">=6" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "optional": true - }, "node_modules/chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.1.2" + "fsevents": "~2.3.2" } }, "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true, + "engines": { + "node": ">=6" + } }, "node_modules/cliui": { "version": "6.0.0", @@ -411,69 +598,21 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { "node": ">=0.8" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -487,31 +626,31 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" } }, "node_modules/colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dependencies": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -519,6 +658,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -529,34 +669,17 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -572,23 +695,16 @@ "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { "node": ">=0.10.0" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -596,69 +712,71 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/discord-api-types": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.18.1.tgz", - "integrity": "sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg==", - "deprecated": "No longer supported. Install the latest release (0.20.2)", - "engines": { - "node": ">=12" - } + "version": "0.37.60", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.60.tgz", + "integrity": "sha512-5BELXTsv7becqVHrD81nZrqT4oEyXXWBwbsO/kwDDu6X3u19VV1tYDB5I5vaVAK+c1chcDeheI9zACBLm41LiQ==" }, "node_modules/discord.js": { - "version": "13.0.0-dev", - "resolved": "git+ssh://git@github.com/discordjs/discord.js.git#f8703e3e59839d7380795ecf719d5bac691860a4", - "integrity": "sha512-1ZlAbCSvcwE1+1o+isS3RkmjOrbd3SZszevjpeiFn1K1xWHTbUcmMyHKF9IIjoFKR9CUsJYOxKapxnPP2PziVw==", - "license": "Apache-2.0", - "dependencies": { - "@discordjs/collection": "^0.1.6", - "@discordjs/form-data": "^3.0.1", - "abort-controller": "^3.0.0", - "node-fetch": "^2.6.1", - "prism-media": "^1.2.9", - "tweetnacl": "^1.0.3", - "ws": "^7.4.5" + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.13.0.tgz", + "integrity": "sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA==", + "dependencies": { + "@discordjs/builders": "^1.6.5", + "@discordjs/collection": "^1.5.3", + "@discordjs/formatters": "^0.3.2", + "@discordjs/rest": "^2.0.1", + "@discordjs/util": "^1.0.1", + "@discordjs/ws": "^1.0.1", + "@sapphire/snowflake": "^3.5.1", + "@types/ws": "^8.5.5", + "discord-api-types": "0.37.50", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.6.1", + "undici": "5.22.1", + "ws": "^8.13.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.11.0" } }, - "node_modules/dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "engines": { - "node": ">=8" + "node_modules/discord.js/node_modules/@types/ws": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "optional": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" } }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -669,57 +787,46 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, "engines": { "node": ">=6" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ], + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "optional": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "optional": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "optional": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/file-stream-rotator": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz", - "integrity": "sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", "dependencies": { - "moment": "^2.11.2" + "moment": "^2.29.1" } }, "node_modules/fill-range": { @@ -750,19 +857,10 @@ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "optional": true, - "engines": { - "node": "*" - } - }, "node_modules/form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -774,23 +872,25 @@ } }, "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dependencies": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -800,42 +900,31 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, "node_modules/fuse.js": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.4.3.tgz", - "integrity": "sha512-JNgngolukIrqwayWnvy6NLH63hmwKPhm63o0uyBg51jPD0j09IvAzlV1rTXfAsgxpghI7khAo6Mv+EmvjDWXig==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", + "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", "engines": { "node": ">=10" } }, "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "dependencies": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" } }, "node_modules/get-caller-file": { @@ -846,19 +935,10 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -869,6 +949,9 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { @@ -883,77 +966,97 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "optional": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "optional": true, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "optional": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "ms": "^2.0.0" } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dependencies": { - "minimatch": "^3.0.4" + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "optional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true, + "engines": { + "node": ">=8" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, "node_modules/inflection": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==", "engines": [ "node >= 0.4.0" ] @@ -961,7 +1064,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -972,10 +1075,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true }, "node_modules/is-arrayish": { "version": "0.3.2", @@ -996,26 +1100,23 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1023,6 +1124,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1032,73 +1139,28 @@ } }, "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "optional": true - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "optional": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "optional": true - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "optional": true }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "optional": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "optional": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "optional": true - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "optional": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/kuler": { @@ -1122,41 +1184,114 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, "node_modules/logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", "dependencies": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-bytes.js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz", + "integrity": "sha512-wJkXvutRbNWcc37tt5j1HyOK1nosspdh3dj6LUYYAvF6JYNqs53IfRvK9oEpcwiDA1NdoIi64yAMfdivPeVAyw==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1164,53 +1299,119 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, "dependencies": { - "minipass": "^2.9.0" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dependencies": { - "minimist": "^1.2.5" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } }, "node_modules/moment-timezone": { - "version": "0.5.32", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", - "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", "dependencies": { - "moment": ">= 2.9.0" + "moment": "^2.29.4" }, "engines": { "node": "*" @@ -1221,34 +1422,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/needle": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", - "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "optional": true, "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node": ">= 0.6" } }, "node_modules/node-addon-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", - "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" }, "node_modules/node-cache": { "version": "5.1.2", @@ -1262,116 +1448,107 @@ } }, "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "optional": true, "dependencies": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 10.12.0" } }, - "node_modules/node-gyp/node_modules/semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", - "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", - "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-pre-gyp/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/node-pre-gyp/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-pre-gyp/node_modules/tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" }, "engines": { - "node": ">=4.5" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "optional": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/normalize-path": { @@ -1382,69 +1559,29 @@ "node": ">=0.10.0" } }, - "node_modules/npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "node_modules/npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "optional": true, - "engines": { - "node": "*" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", "engines": { "node": ">= 6" } @@ -1452,7 +1589,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -1465,31 +1602,6 @@ "fn.name": "1.x.x" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -1515,6 +1627,21 @@ "node": ">=8" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -1539,35 +1666,32 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "optional": true - }, "node_modules/pg": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.5.1.tgz", - "integrity": "sha512-9wm3yX9lCfjvA98ybCyw2pADUivyNWT/yIP4ZcDVpMN0og70BUWYEGXPCTAQdGTAqnytfRADb7NERrY1qxhIqw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "^2.4.0", - "pg-pool": "^3.2.2", - "pg-protocol": "^1.4.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, "engines": { "node": ">= 8.0.0" }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, "peerDependencies": { - "pg-native": ">=2.0.0" + "pg-native": ">=3.0.1" }, "peerDependenciesMeta": { "pg-native": { @@ -1575,10 +1699,16 @@ } } }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, "node_modules/pg-connection-string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.4.0.tgz", - "integrity": "sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -1589,17 +1719,17 @@ } }, "node_modules/pg-pool": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.2.tgz", - "integrity": "sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz", - "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -1617,17 +1747,17 @@ } }, "node_modules/pgpass": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", - "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "dependencies": { - "split2": "^3.1.1" + "split2": "^4.1.0" } }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -1646,7 +1776,7 @@ "node_modules/postgres-bytea": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", "engines": { "node": ">=0.10.0" } @@ -1673,80 +1803,31 @@ "node_modules/printable-characters": { "version": "1.0.42", "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha1-Pxjpd6m9jrN/zE/1ZZ176Qhos9g=" - }, - "node_modules/prism-media": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.9.tgz", - "integrity": "sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q==", - "peerDependencies": { - "@discordjs/opus": "^0.5.0", - "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", - "node-opus": "^0.3.3", - "opusscript": "^0.0.8" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - }, - "ffmpeg-static": { - "optional": true - }, - "node-opus": { - "optional": true - }, - "opusscript": { - "optional": true - } - } + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==" }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "optional": true }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, - "bin": { - "rc": "cli.js" + "engines": { + "node": ">=10" } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1757,9 +1838,9 @@ } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -1772,66 +1853,10 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "optional": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } @@ -1841,6 +1866,15 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/retry-as-promised": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", @@ -1850,30 +1884,14 @@ } }, "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1898,20 +1916,27 @@ } ] }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true }, "node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -1920,14 +1945,14 @@ } }, "node_modules/sequelize": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.3.5.tgz", - "integrity": "sha512-MiwiPkYSA8NWttRKAXdU9h0TxP6HAc1fl7qZmMO/VQqQOND83G4nZLXd0kWILtAoT9cxtZgFqeb/MPYgEeXwsw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.5.0.tgz", + "integrity": "sha512-owBt8fnzVy8E1OvyCyfCdVk7OOLyPVrBCMEf+CvRReC5oCyo+UqeXCtwaex9L6LM9ifZ1i3TG3sFeM5MgLK0CQ==", "dependencies": { "debug": "^4.1.1", "dottie": "^2.0.0", "inflection": "1.12.0", - "lodash": "^4.17.15", + "lodash": "^4.17.20", "moment": "^2.26.0", "moment-timezone": "^0.5.31", "retry-as-promised": "^3.2.0", @@ -1971,9 +1996,9 @@ } }, "node_modules/sequelize-typescript": { - "version": "2.0.0-beta.0", - "resolved": "https://registry.npmjs.org/sequelize-typescript/-/sequelize-typescript-2.0.0-beta.0.tgz", - "integrity": "sha512-xsKz2XdTzwcxcmk3CifrLcJoSuUzASqzOKCt1tKTg2OGZd+Hzasr6Rdl5Jhkx3hW9hZ3ScQQWpJkkXItlOhp5g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sequelize-typescript/-/sequelize-typescript-2.0.0.tgz", + "integrity": "sha512-4nCX18iNAkuRCgxsFOOH9FsUyeqsqLuj7VIZPOWgdRT8ZeQkQl3SgU5MXlji5o2NVekaV9QQzSE0D/6xtUKCmQ==", "dependencies": { "glob": "7.1.2" }, @@ -1988,46 +2013,101 @@ "sequelize": "^6.0.0" } }, + "node_modules/sequelize-typescript/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { "is-arrayish": "^0.3.1" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "optional": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, "dependencies": { - "readable-stream": "^3.0.0" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" } }, "node_modules/sqlite3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz", - "integrity": "sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", + "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", "hasInstallScript": true, "dependencies": { - "node-addon-api": "2.0.0", - "node-pre-gyp": "^0.11.0" + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "tar": "^6.1.11" }, "optionalDependencies": { - "node-gyp": "3.x" + "node-gyp": "8.x" }, "peerDependencies": { - "node-gyp": "3.x" + "node-gyp": "8.x" }, "peerDependenciesMeta": { "node-gyp": { @@ -2035,45 +2115,34 @@ } } }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "optional": true, "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "minipass": "^3.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { "node": "*" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -2083,47 +2152,51 @@ } }, "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", - "optional": true, - "dependencies": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" } }, "node_modules/text-hex": { @@ -2145,74 +2218,82 @@ "node_modules/toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "engines": { - "node": "*" + "node": ">= 14.0.0" } }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + "node_modules/ts-mixer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/typescript": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", - "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" } }, - "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "optional": true, "dependencies": { - "punycode": "^2.1.0" + "imurmurhash": "^0.1.4" } }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } @@ -2225,73 +2306,78 @@ "node": ">= 0.10" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "optional": true, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "optional": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" - } - }, + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dependencies": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", "dependencies": { + "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", + "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.2.0", + "logform": "^2.4.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" + "winston-transport": "^4.5.0" }, "engines": { - "node": ">= 6.4.0" + "node": ">= 12.0.0" } }, "node_modules/winston-daily-rotate-file": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.5.0.tgz", - "integrity": "sha512-/HqeWiU48dzGqcrABRlxYWVMdL6l3uKCtFSJyrqK+E2rLnSFNsgYpvwx15EgTitBLNzH69lQd/+z2ASryV2aqw==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", "dependencies": { - "file-stream-rotator": "^0.5.7", + "file-stream-rotator": "^0.6.1", "object-hash": "^2.0.1", "triple-beam": "^1.3.0", - "winston-transport": "^4.2.0" + "winston-transport": "^4.4.0" }, "engines": { "node": ">=8" @@ -2301,44 +2387,18 @@ } }, "node_modules/winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "dependencies": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" }, "engines": { "node": ">= 6.4.0" } }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/winston-transport/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/winston-transport/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -2360,61 +2420,21 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -2434,14 +2454,14 @@ } }, "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "15.4.1", @@ -2475,45 +2495,1895 @@ "engines": { "node": ">=6" } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" + } + }, + "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" + "@discordjs/builders": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.5.tgz", + "integrity": "sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg==", + "requires": { + "@discordjs/formatters": "^0.3.2", + "@discordjs/util": "^1.0.1", + "@sapphire/shapeshift": "^3.9.2", + "discord-api-types": "0.37.50", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.6.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + } } }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==" + }, + "@discordjs/formatters": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.2.tgz", + "integrity": "sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA==", + "requires": { + "discord-api-types": "0.37.50" + }, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + } + } + }, + "@discordjs/rest": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.0.1.tgz", + "integrity": "sha512-/eWAdDRvwX/rIE2tuQUmKaxmWeHmGealttIzGzlYfI4+a7y9b6ZoMp8BG/jaohs8D8iEnCNYaZiOFLVFLQb8Zg==", + "requires": { + "@discordjs/collection": "^1.5.3", + "@discordjs/util": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.5.1", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.50", + "magic-bytes.js": "^1.0.15", + "tslib": "^2.6.1", + "undici": "5.22.1" }, - "engines": { - "node": ">=8" + "dependencies": { + "discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + } } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "@discordjs/util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.1.tgz", + "integrity": "sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA==" + }, + "@discordjs/ws": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.1.tgz", + "integrity": "sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g==", + "requires": { + "@discordjs/collection": "^1.5.3", + "@discordjs/rest": "^2.0.1", + "@discordjs/util": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.5", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.50", + "tslib": "^2.6.1", + "ws": "^8.13.0" + }, "dependencies": { - "ansi-regex": "^5.0.0" + "@types/ws": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", + "requires": { + "@types/node": "*" + } + }, + "discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + } + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "optional": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==" + }, + "@sapphire/shapeshift": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.2.tgz", + "integrity": "sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + } + }, + "@sapphire/snowflake": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==" + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true + }, + "@types/bluebird": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.39.tgz", + "integrity": "sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA==" + }, + "@types/js-levenshtein": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", + "integrity": "sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==", + "dev": true + }, + "@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "@types/node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "@types/triple-beam": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", + "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" + }, + "@types/validator": { + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" + }, + "@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "15.0.16", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.16.tgz", + "integrity": "sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", + "dev": true + }, + "@vladfrangu/async_event_emitter": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz", + "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "optional": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" }, - "engines": { - "node": ">=8" + "dependencies": { + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "requires": { + "printable-characters": "^1.0.42" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" + }, + "discord-api-types": { + "version": "0.37.60", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.60.tgz", + "integrity": "sha512-5BELXTsv7becqVHrD81nZrqT4oEyXXWBwbsO/kwDDu6X3u19VV1tYDB5I5vaVAK+c1chcDeheI9zACBLm41LiQ==" + }, + "discord.js": { + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.13.0.tgz", + "integrity": "sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA==", + "requires": { + "@discordjs/builders": "^1.6.5", + "@discordjs/collection": "^1.5.3", + "@discordjs/formatters": "^0.3.2", + "@discordjs/rest": "^2.0.1", + "@discordjs/util": "^1.0.1", + "@discordjs/ws": "^1.0.1", + "@sapphire/snowflake": "^3.5.1", + "@types/ws": "^8.5.5", + "discord-api-types": "0.37.50", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.6.1", + "undici": "5.22.1", + "ws": "^8.13.0" + }, + "dependencies": { + "@types/ws": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", + "requires": { + "@types/node": "*" + } + }, + "discord-api-types": { + "version": "0.37.50", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz", + "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==" + } + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, + "dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "requires": { + "moment": "^2.29.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, + "fuse.js": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", + "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "optional": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "optional": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "optional": true + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "requires": { + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-bytes.js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz", + "integrity": "sha512-wJkXvutRbNWcc37tt5j1HyOK1nosspdh3dj6LUYYAvF6JYNqs53IfRvK9oEpcwiDA1NdoIi64yAMfdivPeVAyw==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "moment-timezone": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "requires": { + "moment": "^2.29.4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "optional": true + }, + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + }, + "node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "requires": { + "clone": "2.x" + } + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-cloudflare": "^1.1.1", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + } + }, + "pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "requires": {} + }, + "pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "requires": { + "split2": "^4.1.0" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true + }, + "retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "requires": { + "any-promise": "^1.3.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "sequelize": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.5.0.tgz", + "integrity": "sha512-owBt8fnzVy8E1OvyCyfCdVk7OOLyPVrBCMEf+CvRReC5oCyo+UqeXCtwaex9L6LM9ifZ1i3TG3sFeM5MgLK0CQ==", + "requires": { + "debug": "^4.1.1", + "dottie": "^2.0.0", + "inflection": "1.12.0", + "lodash": "^4.17.20", + "moment": "^2.26.0", + "moment-timezone": "^0.5.31", + "retry-as-promised": "^3.2.0", + "semver": "^7.3.2", + "sequelize-pool": "^6.0.0", + "toposort-class": "^1.0.1", + "uuid": "^8.1.0", + "validator": "^10.11.0", + "wkx": "^0.5.0" + } + }, + "sequelize-pool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", + "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" + }, + "sequelize-typescript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sequelize-typescript/-/sequelize-typescript-2.0.0.tgz", + "integrity": "sha512-4nCX18iNAkuRCgxsFOOH9FsUyeqsqLuj7VIZPOWgdRT8ZeQkQl3SgU5MXlji5o2NVekaV9QQzSE0D/6xtUKCmQ==", + "requires": { + "glob": "7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "optional": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" + }, + "sqlite3": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", + "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "node-gyp": "8.x", + "tar": "^6.1.11" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + } + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" + }, + "ts-mixer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true + }, + "undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "requires": { + "busboy": "^1.6.0" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "winston": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.10.0.tgz", + "integrity": "sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==", + "requires": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + } + }, + "winston-daily-rotate-file": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", + "requires": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + } + }, + "winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "requires": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + } + }, + "wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "requires": { + "@types/node": "*" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index fdc66ec..d53b247 100644 --- a/package.json +++ b/package.json @@ -13,16 +13,17 @@ "dependencies": { "as-table": "^1.0.55", "chokidar": "^3.4.0", - "discord-api-types": "^0.18.1", - "discord.js": "git+https://github.com/discordjs/discord.js.git#f8703e3e59839d7380795ecf719d5bac691860a4", + "discord-api-types": "^0.37.60", + "discord.js": "^14.13.0", "dotenv": "^8.2.0", "fuse.js": "^6.2.0", + "js-levenshtein": "^1.1.6", "node-cache": "^5.1.1", "node-fetch": "^2.6.1", "pg": "^8.3.3", "reflect-metadata": "^0.1.13", - "sequelize": "^6.3.3", - "sequelize-typescript": "^2.0.0-beta.0", + "sequelize": "^6.5.0", + "sequelize-typescript": "^2.0.0", "sqlite3": "^5.0.0", "winston": "^3.2.1", "winston-daily-rotate-file": "^4.5.0", @@ -30,11 +31,12 @@ }, "devDependencies": { "@types/bluebird": "^3.5.32", - "@types/node": "^14.14.10", + "@types/js-levenshtein": "^1.1.1", + "@types/node": "^14.18.63", "@types/node-fetch": "^2.5.7", "@types/validator": "^13.1.0", "@types/ws": "^7.4.4", "@types/yargs": "^15.0.5", - "typescript": "^4.1.2" + "typescript": "^5.2.2" } } diff --git a/src/commands/associate.ts b/src/commands/associate.ts index 6d3a51e..317bc54 100644 --- a/src/commands/associate.ts +++ b/src/commands/associate.ts @@ -1,5 +1,5 @@ import fs from 'fs'; -import { Message } from 'discord.js'; +import { ApplicationCommandOptionType, Message } from 'discord.js'; import yargs from 'yargs'; import { loadProfile, createUserFromMessage, associateUser, getDbidFromDiscord, loadRemoteProfile } from '../utils/profile'; import { discordUserFromMessage, sendAndCache } from '../utils/discord'; @@ -11,7 +11,7 @@ async function asyncHandler(message: Message, dbid: string, devpull: boolean, ac await new Promise(resolve => setImmediate(() => resolve())); let user = await createUserFromMessage(message); - if (devpull){ + if (devpull || process.env.DEV_PULL_ALWAYS?.toString() === '1'){ if (process.env.NODE_ENV === 'production') { sendAndCache(message, `This is a dev-only command.`, {asReply: true, ephemeral: true}); return; @@ -81,7 +81,7 @@ class Associate implements Definitions.Command { options = [ { name: 'dbid', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'your DBID', required: true } diff --git a/src/commands/behold.ts b/src/commands/behold.ts index 0b4933c..15d01e3 100644 --- a/src/commands/behold.ts +++ b/src/commands/behold.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js'; +import { ApplicationCommandOptionType, Message } from 'discord.js'; import yargs from 'yargs'; import { calculateBehold, isValidBehold } from '../utils/beholdcalc'; @@ -35,19 +35,19 @@ class Behold implements Definitions.Command { options = [ { name: 'url', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'address of a png or jpg image', required: true, }, { name: 'threshold', - type: 'INTEGER', + type: ApplicationCommandOptionType.Integer, description: 'lower the threshold for crew detection; the lower it is, the higher the chance for false positives', required: false, }, { name: 'base', - type: 'BOOLEAN', + type: ApplicationCommandOptionType.Boolean, description: 'ignore user profile if available', required: false, }, diff --git a/src/commands/best.ts b/src/commands/best.ts index bb8cea3..a65090f 100644 --- a/src/commands/best.ts +++ b/src/commands/best.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js'; +import { ApplicationCommandOptionType, Message } from 'discord.js'; import yargs from 'yargs'; import { DCData } from '../data/DCData'; @@ -59,7 +59,7 @@ class Best implements Definitions.Command { options = [ { name: 'type', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'type of search to do', required: true, choices: [ @@ -70,7 +70,7 @@ class Best implements Definitions.Command { }, { name: 'skill', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'skill to search', required: true, choices: [ @@ -84,7 +84,7 @@ class Best implements Definitions.Command { }, { name: 'secondskill', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: '(optional) second skill to search', required: false, choices: [ @@ -98,7 +98,7 @@ class Best implements Definitions.Command { }, { name: 'stars', - type: 'INTEGER', + type: ApplicationCommandOptionType.Integer, description: 'limit the search to given number of stars or below', required: false, choices: [ diff --git a/src/commands/cheapestfffe.ts b/src/commands/cheapestfffe.ts index 27c8cad..3e5910e 100644 --- a/src/commands/cheapestfffe.ts +++ b/src/commands/cheapestfffe.ts @@ -1,12 +1,12 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import { DCData } from '../data/DCData'; import { formatSources, formatRecipe } from '../utils/items'; -import { colorFromRarity } from '../utils/crew'; +import { colorFromRarity, formatCollectionName } from '../utils/crew'; import { getEmoteOrString, sendAndCache } from '../utils/discord'; import CONFIG from '../utils/config'; -import { loadFullProfile, userFromMessage } from '../utils/profile'; +import { loadFullProfile, toTimestamp, userFromMessage } from '../utils/profile'; import { getNeededItems } from '../utils/equipment'; function bonusName(bonus: string) { @@ -20,6 +20,7 @@ function bonusName(bonus: string) { async function asyncHandler( message: Message, + fuse?: number ) { // This is just to break up the flow and make sure any exceptions end up in the .catch, not thrown during yargs command execution await new Promise(resolve => setImmediate(() => resolve())); @@ -36,12 +37,38 @@ async function asyncHandler( let profileItems = profile.player.character.items; let candidatesForImmortalisation = profileCrew.filter((c: any) => { if (c.level === 100) { + // let needed = getNeededItems(c.symbol, c.level); + // if (!needed) { + // return false; + // } + // return true; return false; } - if (c.rarity === crew.find((d) => d.symbol === c.symbol)?.max_rarity) { + let findcrew = crew.find((d) => d.symbol === c.symbol); + + if (!fuse) { + if (c.rarity === findcrew?.max_rarity) { + c.max_rarity = findcrew?.max_rarity; + return true; + } + else { + return false; + } + } + + let fnum = 0; + + if (typeof fuse === 'number') { + fnum = fuse; + } + + if (c.rarity === (findcrew?.max_rarity ?? 0) - fnum) { + c.max_rarity = findcrew?.max_rarity; return true; } - return false; + else { + return false; + } }); candidatesForImmortalisation = candidatesForImmortalisation.map((c: any) => { @@ -77,29 +104,71 @@ async function asyncHandler( requiredFactionItems, craftCost: needed.craftCost, } - }).sort((a: any, b: any) => a.requiredChronCost - b.requiredChronCost); + }).sort((a: any, b: any) => { + let r = 0; + if (!r) r = (b.rarity/b.max_rarity) - (a.rarity/a.max_rarity); + if (!r) r = a.requiredChronCost - b.requiredChronCost; + return r; + }); const embeds = candidatesForImmortalisation.slice(0, 5).map((can: any) => { - const matched = crew.find((crew) => crew.symbol === can.symbol); + + const matched = crew.find((crew) => { + return crew.symbol === can.symbol + }); + if (!matched) { return; } - return new MessageEmbed() - .setTitle(`${matched.name} (Level ${can.level})`) - .setDescription(`Missing item costs:`) - .setThumbnail(`${CONFIG.ASSETS_URL}${matched.imageUrlPortrait}`) - .setColor(colorFromRarity(matched.max_rarity)) - .addField(getEmoteOrString(message, 'chrons', 'Chrons'), Math.round(can.requiredChronCost), true) - .addField(getEmoteOrString(message, 'shuttle', 'Faction'), `${can.requiredFactionItems} items`, true) - .addField(getEmoteOrString(message, 'credits', 'Credits'), can.craftCost, true) - .setFooter(`${matched.name} is in ${matched.collections.length === 0 ? 'no collections' : `the following collections: ${matched.collections.join(', ')}`}`); + + return new EmbedBuilder() + .setTitle(`${matched.name} (Level ${can.level})`) + .setDescription(`Missing item costs:`) + .setThumbnail(`${CONFIG.ASSETS_URL}${matched.imageUrlPortrait}`) + .setColor(colorFromRarity(matched.max_rarity)) + .addFields( + { + name: 'Rarity', + value: '⭐'.repeat(can.rarity) + '🌑'.repeat(matched.max_rarity - can.rarity), + inline: false + }, + { + name: getEmoteOrString(message, 'chrons', 'Chrons'), + value: Math.round(can.requiredChronCost).toString(), + inline: true + }, + { + name: getEmoteOrString(message, 'shuttle', 'Faction'), + value: `${can.requiredFactionItems} items`, + inline: true + }, + { + name: getEmoteOrString(message, 'credits', 'Credits'), + value: can.craftCost.toString(), + inline: true + }, + { + name: `${matched.name} is in the following collections: `, + value: !matched?.collections?.length ? 'No Collections' : matched?.collections?.map(c => formatCollectionName(c))?.join(", ") ?? '', + inline: true + } + ) + //.setFooter({ text: `${matched.name} is in ${matched.collections.length === 0 ? 'no collections' : `the following collections: ${matched.collections.join(', ')}`}` }); }); - sendAndCache(message, - `Cheapest candidates for immortalisation for **${user.profiles[0].captainName}**'s roster (last updated ${user.profiles[0].lastUpdate.toDateString()})`, - { embeds } - ); + if (fuse) { + sendAndCache(message, + `Cheapest candidates for immortalisation that need ${fuse} fuse${fuse === 1 ? '' : 's'} for **${user.profiles[0].captainName}**'s roster (last updated ${toTimestamp(profile.lastModified ?? user.profiles[0].lastUpdate)})`, + { embeds } + ); + } + else { + sendAndCache(message, + `Cheapest candidates for immortalisation for **${user.profiles[0].captainName}**'s roster (last updated ${toTimestamp(profile.lastModified ?? user.profiles[0].lastUpdate)})`, + { embeds } + ); + } } class CheapestFFFE implements Definitions.Command { @@ -107,13 +176,31 @@ class CheapestFFFE implements Definitions.Command { command = 'cheapestfffe'; aliases = []; describe = 'Shows FF crew on your roster who are cheapest to FE'; + options = [{ + name: 'fuseneed', + type: ApplicationCommandOptionType.Integer, + description: 'show crew with the specified needed fuses', + required: false, + default: 0, + choices: [ + { name: '1', value: 1 }, + { name: '2', value: 2 }, + { name: '3', value: 3 }, + { name: '4', value: 4 }, + { name: '5', value: 5 }, + ] + }] builder(yp: yargs.Argv): yargs.Argv { - return yp; + return yp.option('fuseneed', { + alias: 'f', + desc: 'show crew with the specified needed fuses' + }); } handler(args: yargs.Arguments) { let message = args.message; - args.promisedResult = asyncHandler(message); + let fuse = args.fuseneed as number; + args.promisedResult = asyncHandler(message, fuse); } } diff --git a/src/commands/crewneed.ts b/src/commands/crewneed.ts index 27d1b16..d4b119a 100644 --- a/src/commands/crewneed.ts +++ b/src/commands/crewneed.ts @@ -1,4 +1,4 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import { DCData } from '../data/DCData'; @@ -41,7 +41,7 @@ async function asyncHandler(message: Message, searchString: string, level: numbe } else { let crew = results[0]; - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle(`${crew.name} equipment breakdown`) .setThumbnail(`${CONFIG.ASSETS_URL}${crew.imageUrlPortrait}`) .setColor(colorFromRarity(crew.max_rarity)) @@ -67,17 +67,17 @@ async function asyncHandler(message: Message, searchString: string, level: numbe level = pcrew.level; } - embed = embed.addField( - user.profiles[0].captainName, - `Data is customized for [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid}), you own a level ${level} ${crew.name}.` - ); + embed = embed.addFields({ + name: user.profiles[0].captainName, + value: `Data is customized for [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid}), you own a level ${level} ${crew.name}.` + }); plainTextHeader += `${user.profiles[0].captainName}, data is customized for your profile: you own a level ${level} ${crew.name}.\n`; } else { - embed = embed.addField( - user.profiles[0].captainName, - `According to [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid}), you don't own an unfrozen ${crew.name}; make sure your profile is up-to-date on ${CONFIG.DATACORE_URL}.` - ); + embed = embed.addFields({ + name: user.profiles[0].captainName, + value: `According to [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid}), you don't own an unfrozen ${crew.name}; make sure your profile is up-to-date on ${CONFIG.DATACORE_URL}.` + }); plainTextHeader += `${user.profiles[0].captainName}, according to your profile, you don't own an unfrozen ${crew.name}; make sure your profile is up-to-date on ${CONFIG.DATACORE_URL}.\n`; } @@ -146,27 +146,27 @@ async function asyncHandler(message: Message, searchString: string, level: numbe let MessageEmbedFits = true; // TODO: there must be a smarter way to break these down if (breakdown.length < 2) { - embed = embed.addField('Breakdown', `Failed to load data, please see [the website](${CONFIG.DATACORE_URL}crew/${crew.symbol}/).`); + embed = embed.addFields({ name: 'Breakdown', value: `Failed to load data, please see [the website](${CONFIG.DATACORE_URL}crew/${crew.symbol}/).` }); } else if (breakdown.length < 1024) { - embed = embed.addField('Breakdown', breakdown); + embed = embed.addFields({ name: 'Breakdown', value: breakdown }); } else if (breakdown.length < 2000) { - embed = embed.addField('Breakdown (1 / 2)', formatItemList(data.slice(0, data.length / 2))); - embed = embed.addField('Breakdown (2 / 2)', formatItemList(data.slice(data.length / 2, data.length))); + embed = embed.addFields({ name: 'Breakdown (1 / 2)', value: formatItemList(data.slice(0, data.length / 2)) }); + embed = embed.addFields({ name: 'Breakdown (2 / 2)', value: formatItemList(data.slice(data.length / 2, data.length)) }); } else if (breakdown.length < 3000) { - embed = embed.addField('Breakdown (1 / 3)', formatItemList(data.slice(0, data.length / 3))); - embed = embed.addField('Breakdown (2 / 3)', formatItemList(data.slice((1 * data.length) / 3, (2 * data.length) / 3))); - embed = embed.addField('Breakdown (3 / 3)', formatItemList(data.slice((2 * data.length) / 3, data.length))); + embed = embed.addFields({ name: 'Breakdown (1 / 3)', value: formatItemList(data.slice(0, data.length / 3)) }); + embed = embed.addFields({ name: 'Breakdown (2 / 3)', value: formatItemList(data.slice((1 * data.length) / 3, (2 * data.length) / 3)) }); + embed = embed.addFields({ name: 'Breakdown (3 / 3)', value: formatItemList(data.slice((2 * data.length) / 3, data.length)) }); } else if (breakdown.length < 4000) { - embed = embed.addField('Breakdown (1 / 4)', formatItemList(data.slice(0, data.length / 4))); - embed = embed.addField('Breakdown (2 / 4)', formatItemList(data.slice((1 * data.length) / 4, (2 * data.length) / 4))); - embed = embed.addField('Breakdown (3 / 4)', formatItemList(data.slice((2 * data.length) / 4, (3 * data.length) / 4))); - embed = embed.addField('Breakdown (4 / 4)', formatItemList(data.slice((3 * data.length) / 4, data.length))); + embed = embed.addFields({ name: 'Breakdown (1 / 4)', value: formatItemList(data.slice(0, data.length / 4)) }); + embed = embed.addFields({ name: 'Breakdown (2 / 4)', value: formatItemList(data.slice((1 * data.length) / 4, (2 * data.length) / 4)) }); + embed = embed.addFields({ name: 'Breakdown (3 / 4)', value: formatItemList(data.slice((2 * data.length) / 4, (3 * data.length) / 4)) }); + embed = embed.addFields({ name: 'Breakdown (4 / 4)', value: formatItemList(data.slice((3 * data.length) / 4, data.length)) }); } else if (breakdown.length < 5000) { - embed = embed.addField('Breakdown (1 / 5)', formatItemList(data.slice(0, data.length / 5))); - embed = embed.addField('Breakdown (2 / 5)', formatItemList(data.slice((1 * data.length) / 5, (2 * data.length) / 5))); - embed = embed.addField('Breakdown (3 / 5)', formatItemList(data.slice((2 * data.length) / 5, (3 * data.length) / 5))); - embed = embed.addField('Breakdown (4 / 5)', formatItemList(data.slice((3 * data.length) / 5, (4 * data.length) / 5))); - embed = embed.addField('Breakdown (5 / 5)', formatItemList(data.slice((4 * data.length) / 5, data.length))); + embed = embed.addFields({ name: 'Breakdown (1 / 5)', value: formatItemList(data.slice(0, data.length / 5)) }); + embed = embed.addFields({ name: 'Breakdown (2 / 5)', value: formatItemList(data.slice((1 * data.length) / 5, (2 * data.length) / 5)) }); + embed = embed.addFields({ name: 'Breakdown (3 / 5)', value: formatItemList(data.slice((2 * data.length) / 5, (3 * data.length) / 5)) }); + embed = embed.addFields({ name: 'Breakdown (4 / 5)', value: formatItemList(data.slice((3 * data.length) / 5, (4 * data.length) / 5)) }); + embed = embed.addFields({ name: 'Breakdown (5 / 5)', value: formatItemList(data.slice((4 * data.length) / 5, data.length)) }); } else { // Nothing fits, fallback to a plain text output MessageEmbedFits = false; @@ -196,11 +196,11 @@ async function asyncHandler(message: Message, searchString: string, level: numbe } if (MessageEmbedFits) { - embed = embed.addField( - 'Estimated Cost', - `${neededItems ? neededItems.craftCost : 'N/A'} credits, ${requiredChronCost} ${getEmoteOrString(message, 'chrons', 'chrons')}, ${requiredFactionItems} faction items`, - true - ); + embed = embed.addFields({ + name: 'Estimated Cost', + value:`${neededItems ? neededItems.craftCost : 'N/A'} credits, ${requiredChronCost} ${getEmoteOrString(message, 'chrons', 'chrons')}, ${requiredFactionItems} faction items`, + inline: true + }); sendAndCache(message, '', {embeds: [embed]}); } @@ -216,31 +216,31 @@ class CrewNeed implements Definitions.Command { options = [ { name: 'crew', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'name of crew or part of the name', required: true, }, { name: 'level', - type: 'INTEGER', + type: ApplicationCommandOptionType.Integer, description: 'starting level', required: false, }, { name: 'item', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'filter to specific items', required: false, }, { name: 'all', - type: 'BOOLEAN', + type: ApplicationCommandOptionType.Boolean, description: 'expand the entire recipe (including owned items)', required: false, }, { name: 'base', - type: 'BOOLEAN', + type: ApplicationCommandOptionType.Boolean, description: 'return common stats (not adjusted for your profile)', required: false, } diff --git a/src/commands/dilemma.ts b/src/commands/dilemma.ts index 42b9eee..f71cf04 100644 --- a/src/commands/dilemma.ts +++ b/src/commands/dilemma.ts @@ -1,40 +1,131 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import { DCData } from '../data/DCData'; import { getEmoteOrString, sendAndCache } from '../utils/discord'; +import levenshtein from 'js-levenshtein'; +import { colorFromRarity } from '../utils/crew'; +import CONFIG from '../utils/config'; function formatChoice(message: Message, choice: any): string { let result = choice.text + '\n' + choice.reward.join(', '); result = result.split(':honor:').join(getEmoteOrString(message, 'honor', 'honor')); result = result.split(':chrons:').join(getEmoteOrString(message, 'chrons', 'chrons')); + result = result.split(':merits:').join(getEmoteOrString(message, 'merits', 'merits')); return result; } +function getChoiceRarity(choice: any) { + if (choice.reward.some((r: string) => r.includes("100 :honor:"))) return 5; + else if (choice.reward.some((r: string) => r.includes("60 :honor:"))) return 4; + else return 3; +} + async function asyncHandler(message: Message, searchString: string) { // This is just to break up the flow and make sure any exceptions end up in the .catch, not thrown during yargs command execution await new Promise(resolve => setImmediate(() => resolve())); + + let test_search = searchString.trim().toLowerCase().replace(/,/g, '').replace(/:/g, '').replace(/;/g, '').replace(/'/g, ''); + let dilemmas = DCData.getDilemmas(); - let results = DCData.getDilemmas().filter( - (dilemma: any) => dilemma.title.toLowerCase().indexOf(searchString.trim().toLowerCase()) >= 0 + let intermediate = [] as { distance: number, dilemma: any }[]; + let results = [] as any[]; + + results = dilemmas.filter( + (dilemma: any) => dilemma.title.toLowerCase().replace(/,/g, '').replace(/:/g, '').replace(/;/g, '').replace(/'/g, '').indexOf(test_search) >= 0 ); + if (!results.length) { + dilemmas.forEach((dilemma: any, idx: number) => { + let distance = levenshtein(test_search, dilemma.title.toLowerCase().trim()); + if (distance <= 5 && !results.some(r => r.title === dilemma.title)) { + intermediate.push({ distance, dilemma }); + } + }); + + if (intermediate.length) { + intermediate.sort((a, b) => { + let r = a.distance - b.distance; + if (!r) r = a.dilemma.title.localeCompare(b.dilemma.title); + return r; + }); + + if (intermediate.some(i => i.distance === 0)) { + results = intermediate.filter(i => i.distance === 0).map(i => i.dilemma); + } + else { + results = intermediate.map(i => i.dilemma); + } + } + + } + if ((results === undefined) || (results.length === 0)) { sendAndCache(message, `Sorry, I couldn't find a dilemma matching '${searchString}'`); } else { - results.forEach((dilemma: any) => { - let embed = new MessageEmbed() + let rex = new RegExp(/.*\*\*(.+)\*\*.*/); + let embeds = [] as EmbedBuilder[]; + let botCrew = DCData.getBotCrew().filter(crew => crew.obtained === 'Voyage'); + let legend = [] as string[]; + results = JSON.parse(JSON.stringify(results)); + + for (let dilemma of results) { + let crewurl = undefined as string | undefined; + let dil = 0; + [dilemma.choiceA, dilemma.choiceB, dilemma.choiceC ?? null].forEach((choice) => { + if (choice) { + let i = 0; + for (let s of choice.reward) { + if (s.includes('4') && s.includes(':star:')) { + legend.push(dil === 0 ? 'A' : (dil === 1 ? 'B' : 'C')); + } + else if (rex.test(s)) { + let result = rex.exec(s); + if (result && result.length) { + let crewname = result[1]; + let crew = botCrew.find(crew => crew.name === crewname); + if (crew) { + if (!crewurl) crewurl = crew.imageUrlPortrait; + choice.reward[i] = choice.reward[i].replace(crew.name, `[${crew.name}](${CONFIG.DATACORE_URL}crew/${crew.symbol})`) + } + } + } + i++; + } + } + dil++; + }); + + let r = getChoiceRarity(dilemma.choiceA); + let r2 = getChoiceRarity(dilemma.choiceB); + let r3 = dilemma.choiceC ? getChoiceRarity(dilemma.choiceC) : 0; + if (r2 > r) r = r2; + if (r3 > r) r = r3; + if (crewurl && r < 4) r = 4; + let embed = new EmbedBuilder() .setTitle(dilemma.title) - .setColor('DARK_GREEN') - .addField('Choice A', formatChoice(message, dilemma.choiceA)) - .addField('Choice B', formatChoice(message, dilemma.choiceB)); - + .setColor(colorFromRarity(r)) + .addFields({ name: 'Choice A', value: formatChoice(message, dilemma.choiceA) }) + .addFields({ name: 'Choice B', value: formatChoice(message, dilemma.choiceB) }); + if (crewurl) { + embed = embed.setThumbnail(CONFIG.ASSETS_URL+crewurl) + } if (dilemma.choiceC != null) { - embed = embed.addField('Choice C', formatChoice(message, dilemma.choiceC)); + embed = embed.addFields({ name: 'Choice C', value: formatChoice(message, dilemma.choiceC) }); } + if (r === 5 && legend.length) { + let featured = botCrew.filter(crew => crew.max_rarity === 5).sort((a, b) => (b.date_added as Date).getTime() - (a.date_added as Date).getTime()); + if (featured?.length) { + embed = embed.addFields({ name: `Chance of Legendary Behold (Choice ${legend.length === 3 ? 'A, B or C' : legend.join(" or ")})`, value: featured.map(f => `**[${f.name}](${CONFIG.DATACORE_URL}crew/${f.symbol})**`).join(", ") }) + if (!crewurl) { + embed = embed.setThumbnail(CONFIG.ASSETS_URL+featured[0].imageUrlPortrait); + } + } + } + embeds.push(embed); + } - sendAndCache(message, '', {embeds: [embed]}); - }); + await sendAndCache(message, '', {embeds: embeds}); } } @@ -46,7 +137,7 @@ class Dilemma implements Definitions.Command { options = [ { name: 'title', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: "(part of) the dilemma's title", required: true } diff --git a/src/commands/farm.ts b/src/commands/farm.ts index bda6e5d..1aa6363 100644 --- a/src/commands/farm.ts +++ b/src/commands/farm.ts @@ -1,4 +1,4 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import { DCData } from '../data/DCData'; @@ -33,7 +33,7 @@ async function asyncHandler( } else if (results.length > 1) { let embeds = results.map((item) => { let shortSymbol = item.symbol.replace(/_quality.*/, ''); - return new MessageEmbed() + return new EmbedBuilder() .setTitle(item.name) .setDescription(`\`${shortSymbol}\``) .setThumbnail(`${CONFIG.ASSETS_URL}${item.imageUrl}`) @@ -46,7 +46,7 @@ async function asyncHandler( if (extended) { // TODO: crew that equips it, recipes it's part of, etc. - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle(item.name) .setThumbnail(`${CONFIG.ASSETS_URL}${item.imageUrl}`) .setColor(colorFromRarity(item.rarity)) @@ -54,7 +54,7 @@ async function asyncHandler( if (item.bonuses) { let bonuses = Object.keys(item.bonuses).map(bonus => `${bonusName(bonus)} +${item.bonuses[bonus]}`); - embed = embed.addField('Bonuses', bonuses.join(', ')); + embed = embed.addFields({ name: 'Bonuses', value: bonuses.join(', ') }); } let laterRecipe = ''; @@ -63,13 +63,13 @@ async function asyncHandler( if (!item.item_sources || item.item_sources.length === 0) { laterRecipe = formatRecipe(message, item, true); if (laterRecipe.length < 1000) { - embed = embed.addField('Recipe', laterRecipe); + embed = embed.addFields({ name: 'Recipe', value: laterRecipe }); laterRecipe = ''; } } else { laterSources = formatSources(message, item, adjustForKit, true); if (laterSources.length < 1000) { - embed = embed.addField('Sources', laterSources); + embed = embed.addFields({ name: 'Sources', value: laterSources }); laterSources = ''; } } @@ -96,16 +96,16 @@ async function asyncHandler( equip += `\nand ${crew_levels.length - 10} more (see site for details)`; } - embed = embed.addField('Equippable by this crew', equip); + embed = embed.addFields({ name: 'Equippable by this crew', value: equip }); } - - if (embed.fields && embed.fields.length > 0) { + + if (embed.data.fields && embed.data.fields.length > 0) { sendAndCache(message, '', {embeds: [embed]}); } if (laterSources.length > 0) { if (laterSources.length < 1024) { - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle(`Item sources for ${item.name}`) .setThumbnail(`${CONFIG.ASSETS_URL}${item.imageUrl}`) .setColor(colorFromRarity(item.rarity)) @@ -121,7 +121,7 @@ async function asyncHandler( if (laterRecipe.length > 0) { if (laterRecipe.length < 2048) { - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle(`Recipe for ${item.name}`) .setThumbnail(`${CONFIG.ASSETS_URL}${item.imageUrl}`) .setColor(colorFromRarity(item.rarity)) @@ -154,7 +154,7 @@ class Farm implements Definitions.Command { options = [ { name: 'rarity', - type: 'INTEGER', + type: ApplicationCommandOptionType.Integer, description: 'rarity', required: true, choices: [ @@ -168,13 +168,13 @@ class Farm implements Definitions.Command { }, { name: 'name', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: "(part of the) item's name", required: true, }, { name: 'kit', - type: 'BOOLEAN', + type: ApplicationCommandOptionType.Boolean, description: 'adjust the chroniton cost for a supply kit', required: false, } diff --git a/src/commands/gauntlet.ts b/src/commands/gauntlet.ts index cee5e56..6d5bac0 100644 --- a/src/commands/gauntlet.ts +++ b/src/commands/gauntlet.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js'; +import { ApplicationCommandOptionType, Message } from 'discord.js'; import yargs from 'yargs'; import fetch from 'node-fetch'; import NodeCache from 'node-cache'; @@ -133,7 +133,7 @@ class Gauntlet implements Definitions.Command { options = [ { name: 'base', - type: 'BOOLEAN', + type: ApplicationCommandOptionType.Boolean, description: 'return all crew with base stats matching the gauntlet (not customized for your profile)', required: false, } diff --git a/src/commands/meme.ts b/src/commands/meme.ts index d11ed78..abfddb9 100644 --- a/src/commands/meme.ts +++ b/src/commands/meme.ts @@ -1,4 +1,4 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import { captionMeme, listMemesTop100, listMemesHardCoded } from '../utils/imgflip'; @@ -21,7 +21,7 @@ async function asyncHandler(message: Message, name: string, texts: string[]) { let mm = memes.find(meme => meme.name.toLowerCase().indexOf(name) >= 0); if (mm) { let url = await captionMeme(mm.id, texts); - sendAndCache(message, '', {embeds: [new MessageEmbed().setImage(url)]}); + sendAndCache(message, '', {embeds: [new EmbedBuilder().setImage(url)]}); // TODO: delete message if it has the rights } else { @@ -38,13 +38,13 @@ class Meme implements Definitions.Command { options = [ { name: 'name', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: "name of the meme; use list to see what's available", required: true, }, { name: 'text', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'lines of text. Enclose each line in quotes', required: true, } diff --git a/src/commands/offers.ts b/src/commands/offers.ts index 4209e98..2f8a8c4 100644 --- a/src/commands/offers.ts +++ b/src/commands/offers.ts @@ -1,4 +1,4 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import fetch from 'node-fetch'; import NodeCache from 'node-cache'; @@ -42,6 +42,8 @@ function getOfferList(offers: any) { async function asyncHandler(message: Message, offer_name?: String) { // This is just to break up the flow and make sure any exceptions end up in the .catch, not thrown during yargs command execution await new Promise(resolve => setImmediate(() => resolve())); + + const maxOffer = 6; let offers = await loadOffers(); console.log(offers); @@ -64,12 +66,60 @@ async function asyncHandler(message: Message, offer_name?: String) { sendAndCache(message, `Could not find any crew for offer ${selectedOffer.primary_content[0].title}`) return; } - let embed = new MessageEmbed() - .setTitle(`Crew details for offer: ${selectedOffer.primary_content[0].title}`); - relevantCrew.forEach((crew) => { - embed.addField(crew.name, formatCrewField(message, crew, crew.max_rarity, '')); - }); - sendAndCache(message, '', {embeds: [embed]}); + + let embeds = []; + let remainder = [] as Definitions.BotCrew[]; + let pricrew = [] as Definitions.BotCrew[]; + let part = 1; + + relevantCrew = relevantCrew.sort((a, b) => (b.date_added as Date).getTime() - (a.date_added as Date).getTime()); + + pricrew = relevantCrew.splice(0, maxOffer); + let andmore = relevantCrew.length; + relevantCrew = relevantCrew.splice(0, 20); + andmore -= relevantCrew.length; + + while (!!pricrew?.length) { + let embed = new EmbedBuilder() + .setThumbnail(CONFIG.ASSETS_URL + pricrew[0].imageUrlPortrait) + .setTitle(`Crew details for offer: ${selectedOffer.primary_content[0].title} (Part ${part++})`) + .setURL(`${CONFIG.DATACORE_URL}crew/${pricrew[0].symbol}`); + pricrew.splice(0, 1).forEach((crew) => { + embed.addFields({ name: crew.name, value: formatCrewField(message, crew, crew.max_rarity, '', crew?.collections ?? []) }); + }); + + embeds.push(embed); + } + while (relevantCrew.length) { + let embed = new EmbedBuilder() + .setTitle(`Crew details for offer: ${selectedOffer.primary_content[0].title} (Part ${part++})`); + let s = ""; + let i = 0; + + while (i < relevantCrew.length) { + let crew = relevantCrew[i]; + let str = `[${crew.name}](${CONFIG.DATACORE_URL}crew/${crew.symbol})`; + if (s.length + str.length + 2 > 900) { + break; + } + if (s != "") s += ", "; + s += str; + i++; + } + + relevantCrew.splice(0, i); + embed.addFields({ name: 'Crew', value: s }); + embeds.push(embed); + } + + if (andmore > 0 && embeds[embeds.length - 1].data.fields?.length) { + let datafield = embeds[embeds.length - 1].data.fields ?? [] + datafield[datafield.length - 1].value += ", and " + andmore.toString() +" more ..."; + } + + let content = ''; + sendAndCache(message, content, { embeds }); + return; } @@ -81,7 +131,7 @@ class Offers implements Definitions.Command { options = [ { name: 'offer_name', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: "name of the offer to show details of", required: false, } diff --git a/src/commands/profile.ts b/src/commands/profile.ts index 79bc3a1..90f73f7 100644 --- a/src/commands/profile.ts +++ b/src/commands/profile.ts @@ -1,4 +1,4 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import { userFromMessage, @@ -8,6 +8,7 @@ import { ProfileRosterEntry, loadFleet, loadFullProfile, + toTimestamp, } from '../utils/profile'; import CONFIG from '../utils/config'; import { sendAndCache, sendSplitText, deleteOldReplies } from '../utils/discord'; @@ -15,21 +16,22 @@ import { DCData } from '../data/DCData'; import { FACTIONS } from '../utils/factions'; import { configure } from 'as-table'; +import { PlayerCrew, PlayerData } from 'src/datacore/player'; require('dotenv').config(); const MAX_CREW = 10; -function eventCrewFormat(entry: ProfileRosterEntry, profileData: any): string { - let pcrew = profileData.player.character.crew.find((crew: any) => crew.symbol === entry.crew.symbol); +function eventCrewFormat(entry: Definitions.BotCrew, profileData: any): string { + let pcrew = profileData.player.character.crew.find((crew: PlayerCrew) => crew.symbol === entry.symbol); - if (!pcrew) { - return `**${entry.crew.name}** (🥶)`; + if (!pcrew || (pcrew.immortal && pcrew.immortal > 0)) { + return `**${entry.name}** (🥶)`; } else { - if (entry.rarity === entry.crew.max_rarity && pcrew.level === 100 && pcrew.equipment.length === 4) { - return `**${entry.crew.name}** (FF/FE)`; + if (pcrew.rarity === entry.max_rarity && pcrew.level === 100 && pcrew.equipment.length === 4) { + return `**${entry.name}** (FF/FE)`; } else { - return `**${entry.crew.name}** (L${pcrew.level} ${entry.rarity}/${entry.crew.max_rarity})`; + return `**${entry.name}** (L${pcrew.level} ${pcrew.rarity}/${entry.max_rarity})`; } } } @@ -138,27 +140,27 @@ async function asyncHandler(message: Message, guildConfig?: Definitions.GuildCon } }); - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle(fleet.name) .setURL(`${CONFIG.DATACORE_URL}fleet_info/?fleetid=${fleetId}`) .setThumbnail(`${CONFIG.ASSETS_URL}${imageUrl}`) - .setColor('DARK_GREEN') - .addField('Starbase level', fleet.nstarbase_level, true) - .addField('Created', new Date(fleet.created).toLocaleDateString(), true) - .addField('Size', `${fleet.cursize} / ${fleet.maxsize}`, true); + .setColor('DarkGreen') + .addFields({ name: 'Starbase level', value: fleet.nstarbase_level.toString(), inline: true }) + .addFields({ name: 'Created', value: new Date(fleet.created).toLocaleDateString(), inline: true }) + .addFields({ name: 'Size', value: `${fleet.cursize} / ${fleet.maxsize}`, inline: true }); if (fleet.motd) { - embed = embed.addField('MOTD', fleet.motd); + embed = embed.addFields({ name: 'MOTD', value: fleet.motd });; } embed = embed - .addField(fleet.leaderboard[0].event_name, `Rank ${fleet.leaderboard[0].fleet_rank}`, true) - .addField(fleet.leaderboard[1].event_name, `Rank ${fleet.leaderboard[1].fleet_rank}`, true) - .addField(fleet.leaderboard[2].event_name, `Rank ${fleet.leaderboard[2].fleet_rank}`, true) - .addField('Member list', memberFields[0]); + .addFields({ name: fleet.leaderboard[0].event_name, value: `Rank ${fleet.leaderboard[0].fleet_rank}`, inline: true }) + .addFields({ name: fleet.leaderboard[1].event_name, value: `Rank ${fleet.leaderboard[1].fleet_rank}`, inline: true }) + .addFields({ name: fleet.leaderboard[2].event_name, value: `Rank ${fleet.leaderboard[2].fleet_rank}`, inline: true }) + .addFields({ name: 'Member list', value: memberFields[0] }); if (memberFields.length > 0) { - embed = embed.addField('Member list (continued)', memberFields[1]); + embed = embed.addFields({ name: 'Member list (continued)', value: memberFields[1] });; } sendAndCache(message, '', {embeds: [embed]}); @@ -174,84 +176,92 @@ async function asyncHandler(message: Message, guildConfig?: Definitions.GuildCon let eventReply = verb && verb.toLowerCase().trim() === 'event'; if (defaultReply) { - for (let profile of user.profiles) { - let profileData = loadFullProfile(profile.dbid); - if (profileData) { - let embed = new MessageEmbed().setTitle(profile.captainName).setColor('DARK_GREEN'); - - if (eventReply) { - embed = embed - .addField('Last update', profile.lastUpdate.toDateString(), true) - .addField('Stats', `VIP${profileData.player.vip_level}; Level ${profileData.player.character.level}`, true); - } else { - embed = embed - .setURL(`${CONFIG.DATACORE_URL}profile/?dbid=${profile.dbid}`) - .addField('Last update', profile.lastUpdate.toDateString()) - .addField('VIP', profileData.player.vip_level, true) - .addField('Level', profileData.player.character.level, true); - } - - embed = embed.addField('Shuttles', profileData.player.character.shuttle_bays, true); - - if (profileData.player.character.crew_avatar && profileData.player.character.crew_avatar.portrait) { - embed = embed.setThumbnail(`${CONFIG.ASSETS_URL}${profileData.player.character.crew_avatar.portrait}`); - } - - if (eventReply) { - let event = DCData.getUpcomingEvents().slice(-1)[0]; - if (event.endDate < new Date()) { - // TODO: No data for upcoming event, error out + try { + let embeds = [] as EmbedBuilder[]; + + for (let profile of user.profiles) { + let profileData = loadFullProfile(profile.dbid); + if (profileData) { + let embed = new EmbedBuilder().setTitle(profile.captainName).setColor('DarkGreen'); + + if (eventReply) { + embed = embed + .addFields( + { name: 'Last update', value: toTimestamp(profileData.lastModified ?? profile.lastUpdate), inline: true }, + { name: 'Stats', value: `VIP${profileData.player.vip_level}; Level ${profileData.player.character.level}`, inline: true } + ); + } else { + embed = embed + .setURL(`${CONFIG.DATACORE_URL}profile?dbid=${profile.dbid}`) + .addFields( + { name: 'Last update', value: toTimestamp(profileData.lastModified ?? profile.lastUpdate) }, + { name: 'VIP', value: profileData.player.vip_level.toString(), inline: true }, + { name: 'Level', value: profileData.player.character.level.toString(), inline: true } + ); + } + + embed = embed.addFields({ name: 'Shuttles', value: profileData.player.character.shuttle_bays.toString(), inline: true }); + + if (profileData.player.character.crew_avatar && profileData.player.character.crew_avatar?.portrait?.file) { + embed = embed.setThumbnail(`${CONFIG.ASSETS_URL}${profileData.player.character.crew_avatar.portrait.file}`); } + + if (eventReply) { + let event = DCData.getEvents()[0]; + let allCrew = DCData.getBotCrew(); - let profile = await loadProfile(user.profiles[0].dbid); - let roster = loadProfileRoster(profile); - - let highbonus = roster.filter((entry) => event.highbonus.includes(entry.crew.symbol)); - let smallbonus = roster.filter((entry) => - event.smallbonus.traits.some((trait) => entry.crew.traits_named.includes(trait) || entry.crew.traits_hidden.includes(trait)) - ); - - smallbonus.sort((a, b) => b.voyageScore - a.voyageScore); - - // Remove from smallbonus the highbonus crew - smallbonus = smallbonus.filter((entry) => !highbonus.includes(entry)); - - let reply = `Event ending on *${event.endDate.toDateString()}*\n\nHigh bonus crew: ${ - highbonus.length === 0 ? 'NONE' : highbonus.map((entry) => eventCrewFormat(entry, profileData)).join(', ') - }\n\n`; - reply += `Small bonus crew: ${ - smallbonus.length === 0 - ? 'NONE' - : smallbonus - .slice(0, MAX_CREW) - .map((entry) => eventCrewFormat(entry, profileData)) - .join(', ') - }${smallbonus.length > MAX_CREW ? ` and ${smallbonus.length - MAX_CREW} more` : ''}\n`; - - //embed = embed.addField('Total crew', roster.length, true); - embed = embed.addField(`**${event.name}** (${event.type})`, reply); // ending on *${event.endDate.toDateString()}* - } - - if (text) { - embed = embed.addField('Other details', text); - - // TODO: save this for the fleet admiral's report view - // userId, eventId, eventGoals, ? eventCrew - } - - if (!eventReply && profileData.player.fleet && profileData.player.fleet.id) { - embed = embed.addField( - 'Fleet', - `[${profileData.player.fleet.slabel}](${CONFIG.DATACORE_URL}fleet_info?fleetid=${profileData.player.fleet.id})` - ); - } - - if (eventReply) { - await deleteOldReplies(message, profile.captainName); + if (event.startDate && event.startDate < new Date()) { + // TODO: No data for upcoming event, error out + } + + // let profile = await loadProfile(user.profiles[0].dbid); + // let roster = loadProfileRoster(profile); + + let highbonus = (profileData as PlayerData).player.character.crew.filter((entry) => event.featured.includes(entry.symbol)).map(crew1 => allCrew.find(crew2 => crew2.symbol === crew1.symbol)); + let smallbonus = (profileData as PlayerData).player.character.crew.filter((entry) => + event.bonus.includes(entry.symbol) + ).map(crew1 => allCrew.find(crew2 => crew2.symbol === crew1.symbol)); + + smallbonus.sort((a, b) => (a?.ranks.voyRank ?? 0) - (b?.ranks.voyRank ?? 0)); + + // Remove from smallbonus the highbonus crew + smallbonus = smallbonus.filter((entry) => !highbonus.includes(entry)); + event.endDate ??= new Date(); + let reply = `Event ending on *${toTimestamp(event.endDate)}*\n\nHigh bonus crew: ${ + highbonus.length === 0 ? 'NONE' : highbonus.map((entry) => entry ? eventCrewFormat(entry, profileData) : '').join(', ') + }\n\n`; + reply += `Small bonus crew: ${ + smallbonus.length === 0 + ? 'NONE' + : smallbonus + .slice(0, MAX_CREW) + .map((entry) => entry ? eventCrewFormat(entry, profileData) : '') + .join(', ') + }${smallbonus.length > MAX_CREW ? ` and ${smallbonus.length - MAX_CREW} more` : ''}\n`; + + embed = embed.addFields({name: `**${event.name}** (${event.type})`, value: reply }); + } + + if (text) { + embed = embed.addFields({ name: 'Other details', value: text }); + } + + if (!eventReply && profileData.player.fleet && profileData.player.fleet.id) { + embed = embed.addFields({ + name: 'Fleet', + value: `[${profileData.player.fleet.slabel}](${CONFIG.DATACORE_URL}fleet_info?fleetid=${profileData.player.fleet.id})` + }); + } + + embeds.push(embed); } - - sendAndCache(message, '', {embeds: [embed] }); } + + sendAndCache(message, '', { embeds }); + } + catch (err: any) { + console.log(err); + message.reply("Sorry, we ran into an error and couldn't process your request. Try again later."); } } } @@ -265,7 +275,7 @@ class Profile implements Definitions.Command { options = [ { name: 'verb', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'additional profile actions', required: false, choices: [ diff --git a/src/commands/search.ts b/src/commands/search.ts index 78e3f61..24781ec 100644 --- a/src/commands/search.ts +++ b/src/commands/search.ts @@ -1,4 +1,4 @@ -import { Message } from 'discord.js'; +import { ApplicationCommandOptionType, Message } from 'discord.js'; import yargs from 'yargs'; import { DCData } from '../data/DCData'; @@ -13,13 +13,13 @@ class Search implements Definitions.Command { options = [ { name: 'term', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'name of crew, trait or skill or part of the name', required: true, }, { name: 'stars', - type: 'INTEGER', + type: ApplicationCommandOptionType.Integer, description: 'limit the search to crew with this number of stars (fuse level)', required: false, } diff --git a/src/commands/stats.ts b/src/commands/stats.ts index b42fce7..4765f4e 100644 --- a/src/commands/stats.ts +++ b/src/commands/stats.ts @@ -1,4 +1,4 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, EmbedBuilder, ApplicationCommandOptionType } from 'discord.js'; import yargs from 'yargs'; import { DCData } from '../data/DCData'; @@ -71,17 +71,17 @@ async function asyncHandler(message: Message, searchString: string, raritySearch raritySearch = 1; } - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle(crew.name) .setThumbnail(`${CONFIG.ASSETS_URL}${crew.imageUrlPortrait}`) .setColor(colorFromRarity(crew.max_rarity)) .setURL(`${CONFIG.DATACORE_URL}crew/${crew.symbol}/`); if (extended && crew.nicknames && crew.nicknames.length > 0) { - embed = embed.addField('Also known as', `${crew.nicknames.map((n) => `${n.cleverThing}${n.creator ? ` (coined by _${n.creator}_)` : ''}`).join(', ')}`); + embed = embed.addFields({ name: 'Also known as', value: `${crew.nicknames.map((n) => `${n.cleverThing}${n.creator ? ` (coined by _${n.creator}_)` : ''}`).join(', ')}` }); } - embed = embed.addField('Traits', `${crew.traits_named.join(', ')}*, ${crew.traits_hidden.join(', ')}*`); + embed = embed.addFields({ name: 'Traits', value: `${crew.traits_named.join(', ')}*, ${crew.traits_hidden.join(', ')}*` }); if (!base) { let user = await userFromMessage(message); @@ -97,42 +97,43 @@ async function asyncHandler(message: Message, searchString: string, raritySearch sd.base_skills = applyCrewBuffs(sd.base_skills, profile!.buffConfig, false); }); - embed = embed.addField( - user.profiles[0].captainName, - `Data is customized for [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid})'s buffs` - ); + embed = embed.addFields({ + name: user.profiles[0].captainName, + value: `Data is customized for [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid})'s buffs` + }); } } } embed = embed - .addField('Stats', formatStatLine(message, crew, raritySearch)) - .addField('Voyage Rank', `${crew.ranks.voyRank} of ${DCData.totalCrew()}`, true) - .addField('Voyage Triplet', crew.ranks.voyTriplet ? `#${crew.ranks.voyTriplet.rank} ${crew.ranks.voyTriplet.name.replace(/ /g, '')}` : 'N/A', true) - .addField('Gauntlet Rank', `${crew.ranks.gauntletRank} of ${DCData.totalCrew()}`, true) - .addField( - 'Estimated Cost', - `${crew.totalChronCost} ${getEmoteOrString(message, 'chrons', 'chrons')}, ${crew.factionOnlyTotal} faction`, - true - ) - .addField('Difficulty', getDifficulty(crew.ranks.chronCostRank), true) - .setFooter(formatCrewCoolRanks(crew)); + .addFields({ name: 'Stats', value: formatStatLine(message, crew, raritySearch) }) + .addFields({ name: 'Voyage Rank', value: `${crew.ranks.voyRank} of ${DCData.totalCrew()}`, inline: true }) + .addFields({ name: 'Voyage Triplet', value: crew.ranks.voyTriplet ? `#${crew.ranks.voyTriplet.rank} ${crew.ranks.voyTriplet.name.replace(/ /g, '')}` : 'N/A', inline: true }) + .addFields({ name: 'Gauntlet Rank', value: `${crew.ranks.gauntletRank} of ${DCData.totalCrew()}`, inline: true }) + .addFields({ + name: 'Estimated Cost', + value: `${crew.totalChronCost} ${getEmoteOrString(message, 'chrons', 'chrons')}, ${crew.factionOnlyTotal} faction`, + inline: true + }) + .addFields({ name: 'Difficulty', value: getDifficulty(crew.ranks.chronCostRank), inline: true }) + .setFooter({ text: formatCrewCoolRanks(crew) }); if (crew.bigbook_tier && crew.events) { embed = embed - .addField('Events', crew.events, true) - .addField('Big Book Tier ', crew.bigbook_tier === -1 ? '¯\\_(ツ)_/¯' : `[${crew.bigbook_tier}](https://www.bigbook.app/crew/${crew.symbol})`, true); + .addFields({ name: 'Events', value: crew.events.toString(), inline: true }) + .addFields({ name: 'Big Book Tier ', value: crew.bigbook_tier === -1 ? '¯\\_(ツ)_/¯' : `[${crew.bigbook_tier}](https://www.bigbook.app/crew/${crew.symbol})`, inline: true }); } if (crew.cab_ov) { - embed = embed.addField('CAB Rating', `[${crew.cab_ov}](https://sttpowerratings.com/)`, true); + embed = embed.addFields({ name: 'CAB Grade', value: `[${crew.cab_ov_grade}](https://sttpowerratings.com/)`, inline: true }); + embed = embed.addFields({ name: 'CAB Rating', value: `[${crew.cab_ov}](https://sttpowerratings.com/)`, inline: true }); } if (crew.collections && crew.collections.length > 0) { - embed = embed.addField( - 'Collections', - crew.collections.map((c: string) => `[${c}](${CONFIG.DATACORE_URL}collections/#${encodeURIComponent(c)}/)`).join(', ') - ); + embed = embed.addFields({ + name: 'Collections', + value: crew.collections.map((c: string) => `[${c}](${CONFIG.DATACORE_URL}collections/#${encodeURIComponent(c)}/)`).join(', ') + }); } if (extended) { @@ -156,18 +157,18 @@ async function asyncHandler(message: Message, searchString: string, raritySearch shipAbilities += `\n**Uses:** ${crew.action.limit}`; } - embed = embed.addField('Ship Abilities', shipAbilities); + embed = embed.addFields({ name: 'Ship Abilities', value: shipAbilities }); } if (extended && crew.markdownContent && crew.markdownContent.length < 980) { - embed = embed.addField('Big Book note', crew.markdownContent); + embed = embed.addFields({ name: 'Big Book note', value: crew.markdownContent }); } sendAndCache(message, '', {embeds: [embed]}); if (extended && crew.markdownContent && crew.markdownContent.length >= 980) { if (crew.markdownContent.length < 2048) { - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle(`Big Book note for ${crew.name}`) .setColor(colorFromRarity(crew.max_rarity)) .setURL(`${CONFIG.DATACORE_URL}crew/${crew.symbol}/`) @@ -190,25 +191,25 @@ class Stats implements Definitions.Command { options = [ { name: 'crew', - type: 'STRING', + type: ApplicationCommandOptionType.String, description: 'name of crew or part of the name', required: true, }, { name: 'extended', - type: 'BOOLEAN', + type: ApplicationCommandOptionType.Boolean, description: 'return extended information', required: false, }, { name: 'stars', - type: 'INTEGER', + type: ApplicationCommandOptionType.Integer, description: 'number of stars (fuse level) for which to display stats', required: false, }, { name: 'base', - type: 'BOOLEAN', + type: ApplicationCommandOptionType.Boolean, description: 'return base stats (not adjusted for your profile)', required: false, } diff --git a/src/data/DCData.ts b/src/data/DCData.ts index 957cddf..4b94d42 100644 --- a/src/data/DCData.ts +++ b/src/data/DCData.ts @@ -2,6 +2,8 @@ import fs from 'fs'; import path from 'path'; import { watch, FSWatcher } from 'chokidar'; import Fuse from 'fuse.js'; +import { IEventData } from '../datacore/events'; +import { getRecentEvents } from '../utils/events'; class DCDataClass { private _watcher?: FSWatcher; @@ -9,19 +11,18 @@ class DCDataClass { private _quests: any[] = []; private _dilemmas: any[] = []; private _rawCrew: Definitions.BotCrew[] = []; - private _upcomingEvents: Definitions.UpcomingEvent[] = []; + private _recentEvents: IEventData[] = []; public setup(datacore_path: string): void { // Set up a watcher to reload data on changes this._watcher = watch(datacore_path, { persistent: true, awaitWriteFinish: true }); this._watcher.on('change', filePath => this._reloadData(filePath)); - // Initial read this._reloadData(path.join(datacore_path, 'items.json')); this._reloadData(path.join(datacore_path, 'quests.json')); this._reloadData(path.join(datacore_path, 'dilemmas.json')); this._reloadData(path.join(datacore_path, 'crew.json')); - this._reloadData(path.join(datacore_path, 'upcomingevents.json')); + this._reloadData(path.join(datacore_path, 'event_instances.json')); } private _reloadData(filePath: string) { @@ -54,18 +55,16 @@ class DCDataClass { if (crew.base_skills.diplomacy_skill) crew.traits_pseudo.push('dip'); if (crew.base_skills.medicine_skill) crew.traits_pseudo.push('med'); }); - } else if (filePath.endsWith('upcomingevents.json')) { - // Fix up the dates - parsedData.forEach((entry: any) => { - entry.startDate = new Date(entry.startDate); - entry.endDate = new Date(entry.endDate); - }); - - this._upcomingEvents = parsedData; + } else if (filePath.endsWith('event_instances.json')) { + this._recentEvents = getRecentEvents(this._rawCrew, parsedData); } } } + public getEvents() { + return this._recentEvents; + } + public shutdown() { if (this._watcher) { this._watcher.close(); @@ -73,7 +72,12 @@ class DCDataClass { } public getBotCrew(): Definitions.BotCrew[] { - return this._rawCrew; + return this._rawCrew.map((rc) => { + if (typeof rc.date_added === 'string') { + rc.date_added = new Date(rc.date_added); + } + return rc; + }); } public getItems(): Definitions.Item[] { @@ -84,10 +88,6 @@ class DCDataClass { return this._dilemmas; } - public getUpcomingEvents(): Definitions.UpcomingEvent[] { - return this._upcomingEvents; - } - public totalCrew(): number { return this._rawCrew.length; } diff --git a/src/datacore/archetype.ts b/src/datacore/archetype.ts new file mode 100644 index 0000000..550444a --- /dev/null +++ b/src/datacore/archetype.ts @@ -0,0 +1,62 @@ +import { Icon } from "./game-elements" + +export interface ArchetypeRoot20 { + archetypes: Archetype20[] +} + +export interface ArchetypeRoot17 { + archetypes: Archetype17[] +} + +export interface ArchetypeBase { + id: number; + type: string | number; + symbol: string; + name: string; + icon: Icon; + flavor: string; + rarity: number; + recipe?: ArchetypeRecipe; + item_sources: ItemSource[]; + bonuses?: ArchetypeBonus; + short_name?: string; +} + +export interface Archetype20 extends ArchetypeBase { + type: string; + item_type: number; + } + + export interface Archetype17 extends ArchetypeBase { + type: number; + } + + export interface ArchetypeRecipe { + demands: ArchetypeDemand[] + validity_hash: string + } + + export interface ArchetypeDemand { + archetype_id: number + count: number + } + + export interface ItemSource { + challenge_id?: number + challenge_skill?: string + challenge_difficulty?: number + type: number + id: number + name: string + energy_quotient: number + chance_grade: number + place?: string + mission?: number + dispute?: number + mastery?: number + } + + export interface ArchetypeBonus { + [key: string]: number | undefined; + } + \ No newline at end of file diff --git a/src/datacore/boss.ts b/src/datacore/boss.ts new file mode 100644 index 0000000..841e631 --- /dev/null +++ b/src/datacore/boss.ts @@ -0,0 +1,375 @@ +import { PlayerCrew, Reward } from './player'; +import { Icon } from './game-elements'; +import { ShipAction } from "./ship"; + +export interface BossBattlesRoot { + env: BossConfig + statuses: Status[] + fleet_boss_battles_energy: Energy + groups: BossGroup[] +} + +export interface BossConfig { + enabled: boolean + battle_start_restricted_by_rank: boolean +} + +export interface Status { + desc_id: number + symbol: string + group: string + blocker_boss?: string + duration: number + place: string + boss_ship: BossShip + difficulty_id: number + attack_energy_cost: AttackEnergyCost + card_icon: Icon + damage_rewards: DamageReward[] + destruction_rewards: DestructionReward[] + id?: number + ends_in?: number + hp?: number + combo?: Combo + creator_character?: CreatorCharacter + blocked_by_another_boss?: boolean +} + +export interface BossShip { + icon: Icon + archetype_id: number + symbol: string + ship_name: string + rarity: number + shields: number + hull: number + evasion: number + attack: number + accuracy: number + crit_chance: number + crit_bonus: number + attacks_per_second: number + shield_regen: number + actions: ShipAction[] +} + +export interface AttackEnergyCost { + currency: number + amount: number +} + +export interface BossReward extends Reward { + type: number + id: number + symbol: string + item_type?: number + name: string + full_name: string + flavor: string + quantity: number + rarity: number +} + +export interface DamageReward { + threshold: number + rewards: BossReward[] +} + +export interface DestructionReward { + threshold: number + rewards: BossReward[] +} + +export interface Combo { + nodes: ComboNode[] + traits: string[] + restart_number: number + restart_limit: number + damage: number + active_effects: BossEffect[] + next_effect: BossEffect + previous_node_counts: number[] + reroll_count: number + reroll_limit: number + reroll_price: RerollPrice +} + +export interface ComboNode { + open_traits: string[] + hidden_traits: string[] + unlocked_character?: UnlockedCharacter + unlocked_crew_archetype_id?: number +} + +export interface UnlockedCharacter { + name: string + crew_avatar_icon: Icon + is_current: boolean +} + +export interface BossEffect { + icon: Icon + icon_color: string + description: string + value: number + multiplier: number + min_value: number + max_value: number + string_format: string +} + +export interface RerollPrice { + currency: number + amount: number +} + +export interface CreatorCharacter { + name: string + icon: Icon +} + +export interface Energy { + id: number + quantity: number + regeneration: Regeneration + regenerated_at: number +} + +export interface Regeneration { + increment?: number + interval_seconds?: number + regeneration_cap?: number + seconds?: number; +} + +export interface BossGroup { + symbol: string + name: string +} + +/** Boss Battle Engine Models Start Here */ + +export interface BossBattle { + id: number; // equivalent to ephemeral/fbbRoot/statuses/id + fleetId: number; + bossGroup: string; + difficultyId: number; + chainIndex: number; + chain: Chain; + description: string; // Boss, Difficulty +}; + +export interface Chain { + id: string; + traits: string[]; + nodes: ComboNode[]; +} + +export interface UserPreferences { + view: string; + pollInterval: number; +} + +export interface SpotterPreferences { + onehand: string; + alpha: string; + nonoptimal: string; + noncoverage: string; +} + +export interface SoloPreferences { + usable: string; + shipAbility: string; +} + +export type ShowHideValue = 'show' | 'hide'; + +export interface ExportPreferences { + header: string; + solve: string; + node_format: string; + node_traits: ShowHideValue; + bullet: string; + delimiter: string; + coverage_format: string; + crew_traits: ShowHideValue; + duplicates: string; + flag_onehand: string; + flag_alpha: string; + flag_unique: string; + flag_nonoptimal: string; +} + +export interface FilterNotes { + oneHandException: boolean; + alphaException: boolean; + uniqueCrew: boolean; + nonPortal: boolean; + nonOptimal: boolean; +} + +export interface ComboCount { + index: number; + combo: string[]; + crew: string[]; + portals: number; +} + +export interface IgnoredCombo { + index: number; + combo: string[]; +} + +export interface SolverTrait { + id: number; + trait: string; + name: string; + poolCount: number; + instance: number; + source: string; + consumed: boolean; +} + +export interface SolverNode { + index: number; + givenTraitIds: number[]; + solve: string[]; + traitsKnown: string[]; + hiddenLeft: number; + open: boolean; + spotSolve: boolean; + alphaTest: string; + oneHandTest: boolean; + possible?: any; /* { id: number, trait: string } */ + solveOptions?: SolveOption[]; +} + +export interface Solve { + node: number; + traits: string[]; +} + +export interface Solver { + id: string; + nodes: SolverNode[]; + traits: SolverTrait[]; + crew: BossCrew[]; +} + +export interface SolveOption { + key: number; + value?: string[]; + rarity: number; +} + +export interface TraitOption { + key: string | number; + value?: string; + text: string; +} + +export interface Spotter { + id: string; + solves: Solve[]; + attemptedCrew: string[]; + pendingCrew: string[]; + ignoredTraits: string[]; +} + +export interface NodeMatch { + index: number; + combos: string[][]; + traits: string[]; +} + +export interface PossibleCombo { + combo: string[]; + crew: string[]; +} + +export interface TraitRarities { + [key: string]: number; +} + +export interface NodeMatches { + [key: string]: NodeMatch; +} + +export interface Rule { + compliant: number; + exceptions: RuleException[]; +} + +export interface RuleException { + index: number; + combo: string[]; +} + +export interface BossCrew extends PlayerCrew { + highest_owned_rarity: number; + only_frozen: boolean; + nodes: number[]; + nodes_rarity: number; + node_matches: NodeMatches; + onehand_rule: Rule; + alpha_rule: Rule; +} + +export interface ViableCombo { + traits: string[]; + nodes: number[]; +} + +export interface NodeRarity { + combos: PossibleCombo[]; + traits: TraitRarities; +} + +export interface NodeRarities { + [key: string]: NodeRarity; +} + +export interface Optimizer { + crew: BossCrew[]; + optimalCombos: ViableCombo[]; + rarities: NodeRarities; + groups: FilteredGroups; + prefs: { + spotter: SpotterPreferences; + solo: SoloPreferences; + }; +} + +export interface FilteredGroup { + traits: string[]; + score: number; + crewList: BossCrew[]; + notes: FilterNotes; +} + +export interface FilteredGroups { + [key: string]: FilteredGroup[]; +} + +export interface RarityStyle { + background: string; + color: string; +} + +export interface Collaboration { + bossBattleId: number; // Same as bossBattle.id + fleetId: number; + bossGroup: string; + difficultyId: number; + chainIndex: number; + chain: Chain; + description: string; + roomCode: string; + solves: Solve[]; + trials: CrewTrial[]; +}; + +export interface CrewTrial { + crewSymbol: string; + trialType: string; +}; diff --git a/src/datacore/bridge.ts b/src/datacore/bridge.ts new file mode 100644 index 0000000..db62c10 --- /dev/null +++ b/src/datacore/bridge.ts @@ -0,0 +1,78 @@ +import { BaseSkills } from "./crew" +import { Icon } from "./game-elements" +import { Ship, ShipAction } from "./ship" + +export interface CaptainsBridgeRoot { + id: number + level: number + max_level: number + buffs: BridgeBuff[] + claimed_rewards_positions: number[] + rewards_per_level: RewardsPerLevel + } + + export interface BridgeBuff { + symbol: string + id: number + name: string + icon: Icon + index: number + level: number + max_level: number + levels: Level[] + } + + export interface Level { + buffs: BridgeBuff[] + cost: Cost[] + } + + export interface Cost { + archetype_id: number + count: number + } + + export interface RewardsPerLevel { + [key: string]: LevelReward; + } + + export interface LevelReward { + rewards: Reward[] + } + + export interface Reward { + type: number + id: number + symbol: string + name: string + full_name: string + flavor: string + icon: Icon + quantity: number + rarity: number + item_type?: number + ship?: ShipReward + portrait?: Icon + full_body?: Icon + skills?: BaseSkills + traits?: string[] + action?: ShipAction + } + + export interface ShipReward extends Ship { + type: number + id: number + symbol: string + name: string + full_name: string + flavor: string + icon: Icon + shields: number + hull: number + attack: number + evasion: number + accuracy: number + quantity: number + rarity: number + } + diff --git a/src/datacore/collectionfilter.ts b/src/datacore/collectionfilter.ts new file mode 100644 index 0000000..82d8039 --- /dev/null +++ b/src/datacore/collectionfilter.ts @@ -0,0 +1,101 @@ +import { PlayerCollection, PlayerCrew, PlayerData } from "./player"; + +export interface MapFilterOptions { + collectionsFilter?: number[]; + rewardFilter?: string[]; +} + +export interface CollectionMap { + collection: PlayerCollection; + crew: PlayerCrew[]; + neededStars?: number[]; + completes: boolean; +} + +export interface ColComboMap { + names: string[]; + count: number; + crew: string[]; +} + +export interface ComboCostMap { + collection: string; + combo: ColComboMap; + cost: number; crew: PlayerCrew[] +} + +export interface CollectionGroup { + name: string; + maps: CollectionMap[]; + uniqueCrew: PlayerCrew[]; + commonCrew: PlayerCrew[]; + collection: PlayerCollection; + nonfullfilling?: number; + nonfullfillingRatio?: number; + neededStars?: number[]; + uniqueCost?: number; + combos?: ColComboMap[]; + comboCost?: number[]; +} + + +export interface CollectionFilterProps { + short: boolean; + mapFilter: MapFilterOptions; + searchFilter: string; + rarityFilter: number[]; + fuseFilter: string; + ownedFilter: string; + costMode: 'normal' | 'sale'; + matchMode: CollectionMatchMode; +}; + + +export interface CollectionFilterContextProps extends CollectionFilterProps { + short: boolean; + setShort: (value: boolean) => void; + + mapFilter: MapFilterOptions; + setMapFilter: (options: MapFilterOptions) => void; + + searchFilter: string; + setSearchFilter: (value?: string) => void; + + rarityFilter: number[]; + setRarityFilter: (value: number[]) => void; + + fuseFilter: string; + setFuseFilter: (value?: string) => void; + + ownedFilter: string; + setOwnedFilter: (value?: string) => void; + + costMode: 'normal' | 'sale'; + setCostMode: (value: 'normal' | 'sale') => void; + + byCost: boolean; + setByCost: (value: boolean) => void; + + matchMode: CollectionMatchMode; + setMatchMode: (value: CollectionMatchMode) => void; + + checkCommonFilter: (filter: CollectionFilterProps, crew: PlayerCrew, exclude?: string[]) => boolean; + checkRewardFilter: (collection: PlayerCollection, filters: string[]) => boolean; +}; + +export type CollectionMatchMode = 'normal' | 'exact-only' | 'extended' | 'inexact-only'; + +export interface CollectionWorkerConfig { + playerData: PlayerData; + filterProps: CollectionFilterProps; + playerCollections: PlayerCollection[]; + collectionCrew: PlayerCrew[]; + matchMode: CollectionMatchMode; + byCost: boolean; +} + +export interface CollectionWorkerResult { + groups: CollectionGroup[]; + maps: CollectionMap[]; + costMap: ComboCostMap[]; +} \ No newline at end of file diff --git a/src/datacore/crew.ts b/src/datacore/crew.ts new file mode 100644 index 0000000..d48ede2 --- /dev/null +++ b/src/datacore/crew.ts @@ -0,0 +1,209 @@ +import { ShipBonus, ShipAction as ShipAction } from "./ship"; +import { Icon } from "./game-elements" + +export interface CrossFuseTarget { + symbol: string; + name?: string; +} + +/** + * The is the crew roster model from crew.json + * + * This is the model for the master list of all crew in STT. + * PlayerCrew derives from this and CompactCrew. + */ +export interface CrewMember { + symbol: string + name: string + short_name: string + flavor: string + archetype_id: number + max_rarity: number + equipment_slots: EquipmentSlot[] + voice_over?: string + traits: string[] + traits_hidden: string[] + base_skills: BaseSkills + ship_battle: ShipBonus + action: ShipAction; + cross_fuse_targets: CrossFuseTarget | []; + skill_data: SkillData[] + intermediate_skill_data: IntermediateSkillData[] + is_craftable: boolean + imageUrlPortrait: string + imageUrlFullBody: string + series?: string + traits_named: string[] + collections: string[] + nicknames: Nickname[] + cab_ov: string + cab_ov_rank: number + cab_ov_grade: string + totalChronCost: number + factionOnlyTotal: number + craftCost: number + ranks: Ranks + bigbook_tier: number + events: number + in_portal: boolean + date_added: Date + obtained: string + markdownContent: string + unique_polestar_combos?: string[][] + constellation?: CrewConstellation + kwipment?: any[] + q_bits?: number + + /** Used internally, not part of incoming data */ + pickerId?: number; + pairs?: Skill[][]; +} + +export interface EquipmentSlot { + level: number + symbol: string + imageUrl?: string; +} + +export enum BaseSkillFields { + SecuritySkill = 'security_skill', + CommandSkill = 'command_skill', + DiplomacySkill = 'diplomacy_skill', + MedicineSkill = 'medicine_skill', + ScienceSkill = 'science_skill', + EngineeringSkill = 'engineering_skill', +} + +export interface BaseSkills { + security_skill?: Skill + command_skill?: Skill + diplomacy_skill?: Skill + medicine_skill?: Skill + science_skill?: Skill + engineering_skill?: Skill +} + + +export interface Skill { + core: number + range_min: number + range_max: number + skill?: string; +} + +export interface ComputedSkill { + core: number; + min: number; + max: number; + skill?: string; +} + +export interface SkillsSummary { + key: string; + skills: string[]; + total: number; + owned: number; + ownedPct: number; + average: number; + best: { + score: number; + name: string; + }, + tenAverage: number; + maxPct: number; +}; + +export interface ComputedBuff { + core: number + min: number + max: number + skill?: string; +} + +export interface SkillData { + rarity: number + base_skills: BaseSkills +} + +export interface IntermediateSkillData extends SkillData { + level: number + action: ShipAction + ship_battle: ShipBonus +} + +export interface Nickname { + actualName: string + cleverThing: string + creator?: string +} + +export interface Ranks { + voyRank: number + gauntletRank: number + chronCostRank: number + B_SEC?: number + A_SEC?: number + V_CMD_SEC?: number + G_CMD_SEC?: number + V_SCI_SEC?: number + G_SCI_SEC?: number + V_SEC_ENG?: number + G_SEC_ENG?: number + V_SEC_DIP?: number + G_SEC_DIP?: number + V_SEC_MED?: number + G_SEC_MED?: number + B_CMD?: number + A_CMD?: number + V_CMD_SCI?: number + G_CMD_SCI?: number + V_CMD_ENG?: number + G_CMD_ENG?: number + V_CMD_DIP?: number + G_CMD_DIP?: number + V_CMD_MED?: number + G_CMD_MED?: number + B_DIP?: number + A_DIP?: number + voyTriplet?: VoyTriplet + V_SCI_DIP?: number + G_SCI_DIP?: number + V_ENG_DIP?: number + G_ENG_DIP?: number + V_DIP_MED?: number + G_DIP_MED?: number + B_MED?: number + A_MED?: number + V_SCI_MED?: number + G_SCI_MED?: number + V_ENG_MED?: number + G_ENG_MED?: number + B_SCI?: number + A_SCI?: number + V_SCI_ENG?: number + G_SCI_ENG?: number + B_ENG?: number + A_ENG?: number +} + +export interface VoyTriplet { + name: string + rank: number +} + +export interface CrewConstellation { + id: number + symbol: string + name: string + short_name: string + flavor: string + icon: Icon + keystones: number[] + type: string + crew_archetype_id: number +} + +export interface RewardsGridNeed { + symbol: string; + quantity: number; +} diff --git a/src/datacore/equipment.ts b/src/datacore/equipment.ts new file mode 100644 index 0000000..5554796 --- /dev/null +++ b/src/datacore/equipment.ts @@ -0,0 +1,68 @@ +import { Icon } from "./game-elements" +import { PlayerCrew, PlayerEquipmentItem } from "./player" + +export interface EquipmentCommon extends PlayerEquipmentItem { + symbol: string + type: number + name: string + flavor: string + rarity: number + short_name?: string + imageUrl: string + bonuses?: EquipmentBonuses + quantity?: number; + needed?: number; + factionOnly?: boolean; + demandCrew?: string[]; +} + +export interface EquipmentItem extends EquipmentCommon { + symbol: string + type: number + name: string + flavor: string + rarity: number + short_name?: string + imageUrl: string + bonuses?: EquipmentBonuses + quantity?: number; + needed?: number; + factionOnly?: boolean; + + item_sources: EquipmentItemSource[] + recipe?: EquipmentRecipe + + empty?: boolean; + isReward?: boolean; + +} + +export interface EquipmentItemSource { + type: number + name: string + energy_quotient: number + chance_grade: number + dispute?: number + mastery?: number + mission_symbol?: string + cost?: number + avg_cost?: number + cadet_mission?: string; + cadet_symbol?: string; +} + +export interface EquipmentRecipe { + incomplete: boolean + craftCost: number + list: EquipmentIngredient[] +} + +export interface EquipmentIngredient { + count: number + factionOnly: boolean + symbol: string +} + +export interface EquipmentBonuses { + [key: string]: number; +} diff --git a/src/datacore/events.ts b/src/datacore/events.ts new file mode 100644 index 0000000..f4becea --- /dev/null +++ b/src/datacore/events.ts @@ -0,0 +1,37 @@ +import { Icon } from "./game-elements" + +export interface EventLeaderboard { + instance_id: number + leaderboard: Leaderboard[] +} + +export interface Leaderboard { + dbid: number + display_name: string + pid: number + avatar?: Icon + level: number + uid: number + rank: number + score: number + fleetid?: number + fleetname: any +} + +// Stripped, modified version of GameData for Event Planner, Shuttle Helper, and Voyage tools +export interface IEventData { + symbol: string; + name: string; + description: string; + bonus_text: string; + content_types: string[]; /* shuttles, gather, etc. */ + seconds_to_start: number; + seconds_to_end: number; + image: string; + bonus: string[]; /* ALL bonus crew by symbol */ + featured: string[]; /* ONLY featured crew by symbol */ + bonusGuessed?: boolean; + startDate?: Date; + endDate?: Date; + type?: string; +}; diff --git a/src/datacore/game-elements.ts b/src/datacore/game-elements.ts new file mode 100644 index 0000000..a7012ad --- /dev/null +++ b/src/datacore/game-elements.ts @@ -0,0 +1,199 @@ +import { CrewMember } from "./crew"; +import { MilestoneBuff, Reward } from "./player"; + +export type Variant = { + name: string; + trait_variants: CrewMember[]; +}; + +export type PolestarCombo = { + count: number; + alts: { symbol: string; name: string }[]; + polestars: string[]; +}; + +export function categorizeKeystones(data: KeystoneBase[]): [Constellation[], Polestar[]] { + let cons = [] as Constellation[]; + let pols = [] as Polestar[]; + + data.forEach((k) => { + if (k.type === "keystone") { + pols.push(k as Polestar); + } + else { + cons.push(k as Constellation); + } + }); + + return [cons, pols]; +} + +export interface KeystoneBase { + id: number; + symbol: string; + type: "keystone_crate" | "crew_keystone_crate" | "keystone"; + name: string; + short_name: string; + flavor: string; + icon: Icon; + rarity?: number; + crew_archetype_id?: number; + quantity?: number; +} + +export interface Constellation extends KeystoneBase { + type: "keystone_crate" | "crew_keystone_crate"; + keystones: number[]; + quantity: number; +} + +export interface Polestar extends KeystoneBase { + type: "keystone"; + quantity: number; + loaned: number; + crew_count: number; + filter?: Filter; + useful?: number + useful_alone?: boolean; + scan_odds?: number; + crate_count?: number; + owned_crate_count?: number; + owned_best_odds?: number; + owned_total_odds?: number; +} + +export interface Icon { + file: string; +} + +export interface Negatable { + negated: boolean; +} + +export interface FilterCondition extends Negatable { + keyword: string; + value?: any; +} + +export interface TextSegment extends Negatable { + text: string; +} + +export interface Filter { + type: "trait" | "rarity" | "skill"; + trait?: string; + rarity?: number; + skill?: string; + textSegments?: TextSegment[]; + conditionArray?: FilterCondition[]; +} + +export interface ConstellationMap { + name: string; + flavor: string; + keystones: Polestar[]; + raritystone: Polestar[]; + skillstones: Polestar[]; +}; + +export interface Collection { + id: number; + name: string; + crew?: string[]; + description?: string; + image?: string; + milestones?: Milestone[]; +} +export interface Milestone { + goal: number + buffs: MilestoneBuff[] + rewards: Reward[] +} + +export const rarityLabels = [ + "Common", + "Uncommon", + "Rare", + "Super Rare", + "Legendary", +]; + +export interface RarityOptions { + key: string; + value?: string | null | undefined; + text: string; + content?: string; +} + + +export interface RetrievalOptions { + initialized: boolean; + list: RetrievalOption[]; +} + +export interface AvatarIcon { + avatar: boolean; + src: string; +} + +export interface RetrievalOption { + key: string | 0; + value: string | 0; + text: string; + image?: AvatarIcon; // image: { avatar: true, src: `${process.env.GATSBY_ASSETS_URL}${c.imageUrlPortrait}` }}]; +} + +export interface FuseGroup { + [key: string]: number[][]; +} + +export interface NumericOptions { + key: number; + value: number; + text: string; +} + +export interface LockedProspect { + symbol: string; + name: string; + rarity: number; + level?: number; + prospect?: boolean; + imageUrlPortrait?: string; + max_rarity?: number; +} + +export interface InitialOptions { + search?: string; + filter?: string; + column?: string; + direction?: 'ascending' | 'descending'; + rows?: number; + page?: number; +} + +export interface ISymbol { + symbol: string; +} + +export interface SymbolName extends ISymbol { + symbol: string; + name: string; +} + +export interface MarkdownRemark { + frontmatter: { + name?: string; + rarity?: number; + series?: string; + memory_alpha?: string; + bigbook_tier?: number; + events?: number; + in_portal?: boolean; + date?: Date; + obtained?: string; + mega?: boolean; + published?: boolean; + } +} + diff --git a/src/datacore/gauntlets.ts b/src/datacore/gauntlets.ts new file mode 100644 index 0000000..9891546 --- /dev/null +++ b/src/datacore/gauntlets.ts @@ -0,0 +1,145 @@ +import { CrewMember } from "./crew" +import { Icon } from "./game-elements" +import { GauntletPairScore, PlayerCrew } from "./player" + +export interface Gauntlet { + gauntlet_id?: number + state: string + jackpot_crew?: string + seconds_to_join?: number + contest_data?: ContestData + date: string + unavailable_msg?: string + unavailable_desc_msg?: string, + matchedCrew?: (PlayerCrew | CrewMember)[]; + prettyTraits: string[] | undefined; + origRanks?: { [key: string]: number }; + template?: boolean; + maximal?: number; + minimal?: number; + pairMin?: GauntletPairScore[]; + pairMax?: GauntletPairScore[]; + + bracket_id?: string + rank?: number + score?: number + seconds_to_next_crew_refresh?: number + seconds_to_next_opponent_refresh?: number + seconds_to_end?: number + consecutive_wins?: number + refresh_cost?: GauntletRefreshCost + revive_cost?: GauntletReviveCost + revive_and_save_cost?: GauntletReviveAndSaveCost + opponents?: Opponent[] +} + +export interface ContestData { + featured_skill: string + primary_skill: string + traits: string[] + crit_chance_per_trait: number + + secondary_skill?: string + selected_crew?: SelectedCrew[] + ranked_rewards?: RankedReward[] + contest_rewards?: ContestReward[] + } + +export interface GauntletRoot { + action: string + character: GauntletCharacter + } + + export interface GauntletCharacter { + id: number + gauntlets: Gauntlet[] + } + + export interface GauntletRefreshCost { + currency: number + amount: number + } + + export interface GauntletReviveCost { + currency: number + amount: number + } + + export interface GauntletReviveAndSaveCost { + currency: number + amount: number + } + + + + export interface SelectedCrew { + crew_id: number + archetype_symbol: string + rarity: number + level: number + skills: GauntletSkill[] + max_rarity: number + debuff: number + disabled: boolean + selected: boolean + crit_chance: number + } + + export interface GauntletSkill { + skill: string + max: number + min: number + } + + export interface RankedReward { + first: number + last: number + rewards: GauntletReward[] + quantity: number + loot_box_rarity: number + } + + export interface GauntletReward { + type: number + icon: Icon + quantity: number + } + + export interface ContestReward { + streak_required: number + loot_box_rarity: number + quantity: number + win_interval?: number + } + + export interface Opponent { + player_id: number + rank: number + value: number + level: number + icon: Icon2 + name: string + crew_contest_data: CrewContestData + } + + export interface Icon2 { + file: string + } + + export interface CrewContestData { + crew: GauntletContestCrew[] + } + + export interface GauntletContestCrew { + crew_id: number + archetype_symbol: string + rarity: number + level: number + skills: GauntletSkill[] + max_rarity: number + debuff: number + disabled: boolean + selected: boolean + crit_chance: number + } + \ No newline at end of file diff --git a/src/datacore/missions.ts b/src/datacore/missions.ts new file mode 100644 index 0000000..802c630 --- /dev/null +++ b/src/datacore/missions.ts @@ -0,0 +1,215 @@ +import { Ship } from "./ship" +import { PotentialReward } from "./player" +import { Icon } from "./game-elements" + +export interface Mission { + id: number + symbol: string + description?: string + episode: number + episode_title?: string + episode_portrait?: Icon + marker: number[] + marker_icon?: Icon + exclude_from_timeline?: boolean + total_stars: number + character_xp_reward?: number + loot_rewards?: any[] + quests: Quest[] + type?: number + cadet?: boolean + name?: string + faction_id?: number +} + +export interface Quest { + id: number + quest_type: string + status?: number + current_quest_path?: string + symbol: string + name?: string + description?: string + action?: string + place?: string + notifier_icon?: Icon + intro?: MissionIntro + mastery_levels?: MasteryLevel[] + warpLogs: WarpLog[] + traits_used?: string[] + crew?: any[] + stages?: Stage[] + starting_challenge_id?: number + challenges?: MissionChallenge[] + locked?: boolean + star_background?: boolean + material_bundle?: string + timeline_icon?: Icon + mission_id?: number + crew_requirement?: CrewRequirement + cadet?: boolean + cadet_crew_select_info?: string + screens?: MissionScreen[] + compiled_paths?: string[] + unlock_text?: string +} + +export interface MissionIntro { + text: string + portrait: Icon + speaker_name: string + response: string + voice_over_bundle?: string +} + +export interface MasteryLevel { + id: number + energy_cost: number + rewards: MissionReward[] + locked: boolean + progress: Progress + opponent?: Ship + jackpots?: Jackpot[] +} + +export interface MissionReward { + type: number + icon: Icon + rarity?: number + potential_rewards?: PotentialReward[] + quantity: number + symbol?: string + name?: string + quantity_as_percentage_increase?: number + id?: number + full_name?: string + flavor?: string + item_type?: number +} + +export interface Bonuses { + [key: number]: number; +} + +export interface Progress { + goal_progress: number + goals: number +} + + +export interface Jackpot { + id: number + reward: MissionReward[] + claimed: boolean +} + + +export interface WarpLog { + quest_id: number + quest_name: string + mastery_level: number + warp_count: number + averages: MissionAverageLogEntry[] + rewards: MissionReward[] +} + +export interface MissionAverageLogEntry { + symbol: string + average: number + average_cost: number +} + +export interface Stage { + grid_x: number + text: string +} + +export interface MissionChallenge { + id: number + name: string + grid_x: number + grid_y: number + skill: string + image: Icon + difficulty: number + children: number[] + locks: MissionLock[] + trait_bonuses: MissionTraitBonus[] + difficulty_by_mastery: number[] + critical?: MissionCritical +} + +export interface MissionLock { + trait?: string + success_on_node_id?: number +} + +export interface MissionTraitBonus { + trait: string + bonuses: number[] +} + +export interface MissionCritical { + claimed: boolean + reward: MissionReward[] + threshold: number + standard_loot: MissionLoot[] +} + + +export interface MissionLoot { + type: number + icon: Icon + rarity: number + potential_rewards: PotentialReward[] + quantity: number +} + +export interface CrewRequirement { + min_stars: number + max_stars: number + traits: string[] + description: string +} + +export interface MissionScreen { + speaker_name: string + speaker_image: SpeakerImage + text: string + responses: MissionResponse[] + index: number + prerequisites?: MissionPrerequisites + voice_over_bundle?: string +} + +export interface SpeakerImage { + file: string +} + +export interface MissionResponse { + text: string + button: number + rewards: MissionResponseRewards + index: number + loot_rewards: MissionResponseLootReward[] + prerequisites: any + paraphrase?: string +} + +export interface MissionResponseRewards { + mission_tags: string[] +} + +export interface MissionResponseLootReward { + type: number + symbol?: string + name: string + icon: Icon + quantity: number + quantity_as_percentage_increase?: number + id?: number +} + +export interface MissionPrerequisites { + mission_tags: string[][] +} diff --git a/src/datacore/player.ts b/src/datacore/player.ts new file mode 100644 index 0000000..380eb03 --- /dev/null +++ b/src/datacore/player.ts @@ -0,0 +1,1665 @@ + + +import { Ship } from "./ship"; +import { BossBattlesRoot } from "./boss"; +import { CaptainsBridgeRoot } from "./bridge"; +import { BaseSkills, ComputedBuff, CrewMember, CrossFuseTarget, EquipmentSlot, IntermediateSkillData, Skill } from "./crew" +import { ShipAction, ShipBonus } from "./ship"; +import { EquipmentCommon, EquipmentItem } from "./equipment"; +import { Collection, Icon } from "./game-elements" +import { ShuttleAdventure } from "./shuttle"; +import { Archetype17, ArchetypeRoot17, ArchetypeRoot20 } from "./archetype"; + +export interface AtlasIcon extends Icon { + atlas_info: string +} + +export type CiteEngine = 'original' | 'beta_tachyon_pulse'; + +export interface CiteMode { + rarities?: number[], + portal?: boolean, + nameFilter?: string, + customSorter?: (left: PlayerCrew, right: PlayerCrew) => number; + priSkills?: string[]; + secSkills?: string[]; + seatSkills?: string[]; + engine?: CiteEngine; +} + + +export interface PlayerData { + player: Player; + fleet_boss_battles_root?: BossBattlesRoot; + captains_bridge_root?: CaptainsBridgeRoot; + calc?: { lastImported?: string, lastModified?: Date; numImmortals?: number; }; + archetype_cache?: ArchetypeRoot20; + item_archetype_cache?: ArchetypeRoot17; + [key: string]: any; + version?: 17 | 20; + stripped?: boolean; + citeMode?: CiteMode; + calculatedDemands?: EquipmentItem[]; +} + +export interface Player { + id: number + dbid: number + lang: string + timezone: string + locale: string + display_name: string + money: number + premium_purchasable: number + premium_earnable: number + honor: number + shuttle_rental_tokens: number + vip_points: number + vip_level: number + currency_exchanges?: CurrencyExchange[] + replicator_uses_today: number + replicator_limit: number + replicator_ration_types: ReplicatorRationType[] + character: Character + fleet: Fleet + squad: Squad + mailbox?: Mailbox + fleet_invite?: FleetInvite + entitlements?: Entitlements + chats?: Chats + environment?: Environment + motd?: Motd + npe_complete?: boolean + community_links?: CommunityLink[] + legal_update: boolean + legal_popup_variant: number + ads_consent_required: boolean + consent: boolean + ccpa_opted_out: boolean + u_13: boolean + + } + + + + export interface CurrencyExchange { + id: number + amount: number + output: number + input: number + schedule: number[] + exchanges_today: number + bonus?: number + limit?: number + dynamic_amount?: DynamicAmount + disallow_sale_above_cap?: boolean + } + + export interface DynamicAmount { + enabled: boolean + max: number + } + + export interface ReplicatorRationType { + id: number + symbol: string + type: number + name: string + icon: Icon + flavor: string + rarity: number + item_sources: any[] + } + + export interface Character { + id: number + display_name: string + using_default_name?: boolean + level: number + max_level?: number + xp: number + xp_for_current_level: number + xp_for_next_level: number + location?: Location + destination?: Location + navmap?: Navmap + accepted_missions: AcceptedMission[] + active_conflict: any + shuttle_bays: number + next_shuttle_bay_cost: any + can_purchase_shuttle_bay?: boolean + crew_avatar: CrewAvatar + stored_immortals: StoredImmortal[] + c_stored_immortals?: number[] + replay_energy_max: number + replay_energy_rate?: number + seconds_from_replay_energy_basis?: number + replay_energy_overflow: number + boost_windows?: BoostWindow[] + seconds_from_last_boost_claim?: number + video_ad_chroniton_boost_reward?: Reward + cadet_tickets?: Tickets + pvp_tickets?: Tickets + event_tickets?: Tickets + cadet_schedule?: CadetSchedule + pvp_divisions?: PvpDivision[] + pvp_timer?: PvpTimer + fbb_difficulties: FbbDifficulty[] + crew: PlayerCrew[]; + unOwnedCrew?: PlayerCrew[]; + items: PlayerEquipmentItem[] + crew_borrows?: any[] + crew_shares?: any[] + crew_limit: number + crew_limit_increase_per_purchase?: number + next_crew_limit_increase_cost?: NextCrewLimitIncreaseCost + can_purchase_crew_limit_increase?: boolean + item_limit?: number + alert_item_limit: number + ships: Ship[] + current_ship_id: number + shuttle_adventures?: ShuttleAdventure[] + factions: Faction[] + disputes?: any[] + tng_the_game_level?: number + open_packs?: any[] + daily_activities: DailyActivity[] + next_daily_activity_reset?: number + next_starbase_donation_reset?: number + fleet_activities?: FleetActivity[] + next_fleet_activity_reset?: number + freestanding_quests?: any[] + daily_rewards_state?: DailyRewardsState + events?: GameEvent[] + dispute_histories: DisputeHistory[] + stimpack?: Stimpack + tutorials?: Tutorial[] + location_channel_prefix?: string + honor_reward_by_rarity?: number[] + voyage_descriptions?: VoyageDescription[] + voyage?: Voyage[] + voyage_summaries?: VoyageSummaries + cryo_collections: CryoCollection[] + crew_collection_buffs: AdvancementBuff[] + collection_buffs_cap_hash: CollectionBuffsCapHash + starbase_buffs: AdvancementBuff[] + starbase_buffs_cap_hash: StarbaseBuffsCapHash + captains_bridge_buffs: AdvancementBuff[] + captains_bridge_buffs_cap_hash: CaptainsBridgeBuffsCapHash + all_buffs_cap_hash: AllBuffsCapHash + all_buffs: AllBuff[] + total_marketplace_claimables: number + seasons: Season[] + } + + export interface ClientAsset { + system: string + place: string + } + + export interface Location extends ClientAsset { + setup: string + x: number + y: number + } + + export interface Navmap { + places: Place[] + systems: System[] + } + + export interface Place { + id: number + symbol: string + system: string + client_asset: ClientAsset + display_name?: string + visited?: boolean + } + + export interface System { + id: number + symbol: string + x: number + y: number + default_place: string + display_name?: string + star?: number + decorator?: number + faction?: string + scale?: number + active?: boolean + } + + export interface AcceptedMission extends DisputeHistory { + id: number + symbol: string + description?: string + episode?: number + episode_title?: string + episode_portrait?: Icon + marker?: number[] + marker_icon?: Icon + exclude_from_timeline?: boolean + stars_earned: number + total_stars: number + accepted: boolean + state: number + main_story?: boolean + cadet?: any; + } + + export interface CrewAvatar { + id: number + symbol: string + name: string + traits: any[] + traits_hidden: string[] + short_name: string + max_rarity: number + icon: Icon + portrait: Icon + full_body: Icon + default_avatar: boolean + hide_from_cryo: boolean + skills: any[] + } + + export interface StoredImmortal { + id: number + quantity: number + } + + export interface BoostWindow { + window: number[] + reward: Reward + } + + export interface Tickets { + current: number + max: number + spend_in: number + reset_in: number + } + + export interface CadetSchedule { + day: number + schedule: Schedule[] + missions: CadetMission[] + current: number + ends_in: number + next: number + next_starts_in: number + } + + export interface Schedule { + day: number + mission: number + } + + export interface CadetMission { + id: number + title: string + speaker: string + description: string + portrait: Icon + image: Icon + image_small: Icon + requirement: string + } + + export interface PvpDivision { + id: number + tier: number + name: string + description: string + min_ship_rarity: number + max_ship_rarity: number + max_crew_rarity: number + setup: PvpRefSetup + } + + export interface Setup { + ship_id: number; + slots: number[]; + } + + export interface PvpRefSetup extends Setup { + slot_info?: { [key: string]: PlayerCrew }; + } + + export interface PvpTimer { + supports_rewarding: boolean + pvp_allowed: boolean + changes_in: number + } + + export interface FbbDifficulty { + id: number + tier: number + name: string + description: string + color_code: string + min_ship_rarity: number + max_ship_rarity: number + max_crew_rarity: number + setup?: Setup + } + export enum CompletionState { + + /** + * Display as immortal, no way to reference. + * (Same as -2/DisplayAsImmortal but with different wording) + */ + DisplayAsImmortalOpponent=-10, + + /** + * Display as immortal, no way to reference. + * (Same as -2/DisplayAsImmortal but with different wording) + */ + DisplayAsImmortalStatic=-5, + + /** + * Display as immortal, owned crew. + */ + DisplayAsImmortalOwned=-4, + + /** + * Display as immortal, unowned crew. + * Also, generally for unowned crew. + */ + DisplayAsImmortalUnowned=-3, + + /** + * Display as immortal. Owned state not known/not needed. + */ + DisplayAsImmortal=-2, + + /** + * Crew is immortalized (owned) + */ + Immortalized=-1, + + /** + * Crew is frozen (1 or greater is the count) + */ + Frozen=1, + + /** + * Crew is owned, not completed. + */ + NotComplete=0 + } + + /** + * This object is the smallest representation of a crew member, + * and contains only minimal information. + * + * PlayerCrew derives from this and CrewMember + */ + export interface CompactCrew { + symbol: string; + name?: string; + archetype_id?: number; + level: number; + max_level?: number; + rarity: number; + equipment: number[][] | number[]; + base_skills?: BaseSkills; + skills?: BaseSkills; + favorite?: boolean; + ship_battle?: ShipBonus; + active_status?: number; + } + + /** + * This is the model for crew that has come from the player's roster + * and either been merged with the main crew.json source (CrewMember), or whittled + * down into CompactCrew. + * + * This interface inherits from both CrewMember and CompactCrew + */ + export interface PlayerCrew extends CrewMember, CompactCrew, IntermediateSkillData { + id: number + symbol: string + name: string + short_name: string + flavor: string + archetype_id: number + xp: number + xp_for_current_level: number + xp_for_next_level: number + bonus: number + max_xp: number + favorite: boolean + level: number + + /** + * This means the crew is in the recycle-bin and are eligible for re-enlistment in exchange for honor + */ + in_buy_back_state: boolean + max_level: number + rarity: number + max_rarity: number + equipment_rank: number + max_equipment_rank: number + equipment_slots: EquipmentSlot[] + + /** + * Input equipment slots are nested arrays, + * they are mapped to 1-dimensional arrays during processing if the crew is frozen + */ + equipment: number[][] | number[] + + kwipment: number[][] + kwipment_expiration: number[] + q_bits: number + + icon: Icon + portrait: Icon + full_body: Icon + voice_over?: string + expires_in: any + active_status: number + active_id?: number + active_index: number + passive_status: number + passive_id?: number + passive_index: number + traits: string[] + traits_hidden: string[] + /** This typically lists the current in-game skills with buffs applied */ + skills: BaseSkills + /** This typically lists the immortalized skills (without buffs) */ + base_skills: BaseSkills + + /** Ship battle ability. Is a superclass of Ship */ + ship_battle: ShipBonus + + /** Ship action */ + action: ShipAction + default_avatar: boolean + /** If this crew can be fused with other crew */ + cross_fuse_targets: CrossFuseTarget; + cap_achiever: CapAchiever + + /** Highest rarity from out of all copies of crew owned by the player */ + highest_owned_rarity?: number; + + /** Highest level from out of all copies of crew owned by the player */ + highest_owned_level?: number; + + /** + * Immortalized count or CompletionState. + * + * If this value is greater than zero, that's the number of + * frozen copies. + * + * If this number is less than zero, this character is immortalized or shown immortalized. + * + * If this number is zero, this character is not immortalized. + * + * To determine a specific value other than a positive number, consult CompletionState + */ + immortal: CompletionState | number; + + /** + * Return the ID numbers of all the collections the crew is a member of + */ + collectionIds?: number[]; + + /** Used internally. Not part of source data. */ + unmaxedIds?: number[]; + + /** Collection rewards for immortalizing this crew. Used internally. Not part of source data. */ + immortalRewards?: ImmortalReward[]; + + /** Crew is an inserted prospect on the crew table. Used internally. Not part of source data. */ + prospect?: boolean; + + /** + * Indicates whether the crew is owned by the player or not. + * Used internally. Not part of source data. + */ + have?: boolean; + + /** Used internally. Not part of source data. */ + traits_matched?: string[]; + /** Used internally. Not part of source data. */ + only_frozen?: boolean; + + /** Reserved for Combo Matches */ + nodes?: number[]; + /** Reserved for Combo Matches */ + node_matches?: NodeMatches; + /** Reserved for Combo Matches */ + nodes_rarity?: number; + + /** Used internally. Not part of source data. */ + variants?: string[]; + + + /** Citation Optimizer */ + + /** Used internally. Not part of source data. */ + addedEV?: number; + /** Used internally. Not part of source data. */ + totalEVContribution?: number; + /** Used internally. Not part of source data. */ + totalEVRemaining?: number; + /** Used internally. Not part of source data. */ + evPerCitation?: number; + /** Used internally. Not part of source data. */ + voyagesImproved?: string[]; + /** Used internally. Not part of source data. */ + amTraits?: string[]; + /** Used internally. Not part of source data. */ + voyScores?: { [key: string]: number }; + /** Used internally. Not part of source data. */ + collectionsIncreased?: string[]; + + /** Used internally. Not part of source data. */ + ssId?: string; + + /** Used internally by gauntlets. Not part of source data. */ + score?: number; + + /** Used internally by gauntlets. Not part of source data. */ + scoreTrip?: number; + + /** Used internally by gauntlets. Not part of source data. */ + pairScores?: GauntletPairScore[]; + + /** Used internally by gauntlets. Not part of source data. */ + isOpponent?: boolean; + + /** Used internally by gauntlets. Not part of source data. */ + isDebuffed?: boolean; + + /** Used internally by gauntlets. Not part of source data. */ + isDisabled?: boolean; + + /** Used internally. Not part of source data. */ + utility?: PlayerUtility + + // used for exports + /** Used for exports and internally. Not part of source data. */ + command_skill?: ComputedBuff; + /** Used for exports and internally. Not part of source data. */ + diplomacy_skill?: ComputedBuff; + /** Used for exports and internally. Not part of source data. */ + security_skill?: ComputedBuff; + /** Used for exports and internally. Not part of source data. */ + science_skill?: ComputedBuff; + /** Used for exports and internally. Not part of source data. */ + medicine_skill?: ComputedBuff; + /** Used for exports and internally. Not part of source data. */ + engineering_skill?: ComputedBuff; + } + export interface GauntletPairScore { + score: number; + pair: Skill[]; + } + export interface PlayerUtilityRanks { + [key: string]: number[]; + } + + export interface PlayerUtility { + ranks: PlayerUtilityRanks; + thresholds: string[]; + counts: { + shuttle: number; + gauntlet: number; + voyage: number; + } + } + + export interface NodeMatch { + index: number, + traits: string[]; + combos: string[][]; + nodes?: number[]; + } + + export interface NodeMatches { + [key: string]: NodeMatch; + } + + export interface CapAchiever { + name: string + date: number + } + + export interface PlayerEquipmentItem extends BuffBase { + id?: number + type?: number + symbol: string + name?: string + flavor?: string + archetype_id: number + quantity?: number + icon?: Icon + rarity: number + expires_in?: number + short_name?: string + bonuses?: Bonuses + time_modifier?: number + cr_modifier?: number + reward_modifier?: number + crafting_bonuses?: Bonuses + imageUrl?: string; + } + + export interface Bonuses { + [key: number]: number; + } + + export interface NextCrewLimitIncreaseCost { + currency: number + amount: number + } + + export interface Faction { + id: number + name: string + reputation: number + discovered?: number + completed_shuttle_adventures: number + icon?: Icon + representative_icon?: Icon + representative_full_body?: Icon + reputation_icon?: Icon + reputation_item_icon?: Icon + home_system?: string + shop_layout?: string + shuttle_token_id?: number + shuttle_token_preview_item?: ShuttleTokenPreviewItem + event_winner_rewards?: any[] + } + + export interface ShuttleTokenPreviewItem extends PlayerEquipmentItem { + type: number + id: number + symbol: string + item_type: number + name: string + full_name: string + flavor: string + icon: Icon + quantity: number + rarity: number + } + + export interface DailyActivity { + id?: number + name: string + description: string + icon?: AtlasIcon + area?: string + weight?: number + category?: any + lifetime?: number + rewards?: Reward[] + goal?: number + min_level?: number + rarity?: number + progress?: number + status?: string + } + + + export interface FleetActivity { + id: number + name: string + description: string + icon: AtlasIcon + area: string + sort_priority: number + category: string + total_points: number + current_points: number + milestones: Milestone[] + claims_available_count: number + } + + export interface Milestone { + goal: number | "n/a" + rewards?: Reward[] + claimed?: boolean + claimable?: boolean + buffs?: MilestoneBuff[]; + } + + + export interface DailyRewardsState { + seconds_until_next_reward: number + today_reward_day_index: number + season_points_per_day: number + ism_subcoin_per_day: number + reward_days: RewardDay[] + } + + export interface RewardDay { + id: number + symbol: string + rewards: Reward[] + double_at_vip?: number + } + + export interface GameEvent { + id: number + symbol: string + name: string + description: string + rules: string + bonus_text: string + rewards_teaser: string + shop_layout: string + featured_crew: FeaturedCrew[] + threshold_rewards: ThresholdReward[] + ranked_brackets: RankedBracket[] + squadron_ranked_brackets: SquadronRankedBracket[] + content: Content + instance_id: number + status: number + seconds_to_start: number + content_types: string[] + seconds_to_end: number + phases: Phase[] + opened?: boolean + opened_phase?: number + victory_points?: number + bonus_victory_points?: number + claimed_threshold_reward_points?: number + unclaimed_threshold_rewards?: any[] + last_threshold_points?: number + next_threshold_points?: number + next_threshold_rewards?: any[] + bonus?: string[]; + } + + // export interface IEventData { + // symbol: string; + // name: string; + // description: string; + // bonus_text: string; + // content_types: string[]; /* shuttles, gather, etc. */ + // seconds_to_start: number; + // seconds_to_end: number; + // image: string; + // bonus: string[]; /* ALL bonus crew by symbol */ + // featured: string[]; /* ONLY featured crew by symbol */ + // bonusGuessed?: boolean; + // eventDate: Date; + // }; + + + export interface FeaturedCrew extends CrewMember { + type: number + id: number + symbol: string + name: string + full_name: string + flavor: string + icon: Icon + portrait: Icon + rarity: number + full_body: Icon + skills: BaseSkills + traits: string[] + action: ShipAction + quantity: number + } + + export interface ThresholdReward { + points: number + rewards: Reward[] + } + + export interface RankedBracket { + first: number + last: number + rewards: Reward[] + quantity: number + } + + export interface SquadronRankedBracket { + first: number + last: number + rewards: Reward[] + quantity: number + } + + export interface Content { + content_type: string + crew_bonuses?: CrewBonuses + gather_pools?: GatherPool[] + craft_bonus?: number + refresh_cost?: RefreshCost + supports_boosts?: boolean + shuttles?: Shuttle[] + bonus_crew?: string[] + bonus_traits?: string[] + } + + export interface CrewBonuses { + [key: string]: number; + } + + export interface GatherPool { + id: number + adventures: Adventure[] + goal_index: number + rewards: PoolReward[] + golden_octopus_rewards: GoldenOctopusReward[] + } + + export interface Adventure { + id: number + name: string + description: string + demands: Demand[] + golden_octopus: boolean + } + + export interface Demand { + archetype_id: number + count: number + } + + export interface PoolReward { + type: number + symbol: string + name: string + icon: Icon + flavor: string + quantity: number + faction_id: number + } + + export interface GoldenOctopusReward { + type: number + symbol: string + name: string + icon: Icon + flavor: string + quantity: number + faction_id: number + } + + export interface RefreshCost { + currency: number + amount: number + } + + export interface Shuttle { + token: number + allow_borrow: boolean + crew_bonuses: CrewBonuses + shuttle_mission_rewards: ShuttleMissionReward[] + } + + export interface ShuttleMissionReward { + type: number + icon: Icon + rarity?: number + potential_rewards?: PotentialReward[] + quantity: number + symbol?: string + name?: string + flavor?: string + faction_id?: number + id?: number + } + + export interface PotentialReward { + type: number + icon: Icon + rarity: number + potential_rewards?: PotentialRewardDetails[] + quantity: number + id?: number + symbol?: string + item_type?: number + name?: string + full_name?: string + flavor?: string + bonuses?: Bonuses + ship?: Ship + } + + export interface PotentialRewardDetails { + type: number + id: number + symbol: string + name: string + full_name: string + flavor: string + icon: AtlasIcon + quantity: number + rarity: number + portrait?: Icon + full_body?: Icon + skills?: BaseSkills + traits?: string[] + action?: ShipAction + item_type?: number + bonuses?: Bonuses + } + + export interface Phase { + splash_image: Icon + goals: Goal[] + id: number + seconds_to_end: number + } + + export interface Goal { + id: number + faction_id: number + flavor: string + rewards: GoalReward[] + winner_rewards?: WinnerRewards + victory_points: number + claimed_reward_points?: number + } + + export interface GoalReward { + points: number + rewards: GoalRewardDetails[] + } + + export interface GoalRewardDetails { + type: number + id: number + symbol: string + name: string + full_name: string + flavor: string + icon: Icon + portrait?: Icon + rarity: number + full_body?: Icon + skills?: Skill + traits?: string[] + action?: ShipAction + quantity: number + } + + export interface WinnerRewards { + bonuses: Bonuses + time_modifier: number + cr_modifier: number + reward_modifier: number + rewards: Reward[] + } + + export interface DisputeHistory { + id: number + symbol: string + name?: string + episode?: number + marker?: number[] + completed: boolean + mission_ids?: number[] + stars_earned: number + total_stars: number + exclude_from_timeline?: boolean + faction_id?: number; + } + + export interface Stimpack { + energy_discount: number + nonpremium_currency_multiplier: number + crew_xp_multiplier: number + ends_in: number + } + + export interface Tutorial { + id: number + symbol: string + state: string + } + + export interface VoyageDescription { + id: number + symbol: string + name: string + description: string + icon: string + skills: VoyageSkills + ship_trait: string + crew_slots: CrewSlot[] + potential_rewards: PotentialRewardDetails[] + } + + export interface VoyageSkills { + primary_skill: string + secondary_skill: string + } + + export interface CrewSlot { + symbol: string + name: string + skill: string + trait: string + } + + export interface Voyage { + id: number + name: string + description: string + icon: string + skills: VoyageSkills + ship_trait: string + state: string + ship_name: any + max_hp: number + hp: number + log_index: number + pending_rewards: PendingRewards + granted_rewards: any + seed: number + created_at: string + recalled_at: string + completed_at: any + voyage_duration: number + skill_aggregates: BaseSkills + seconds_between_dilemmas: number + seconds_since_last_dilemma: number + first_leave: boolean + time_to_next_event: number + ship_id: number + crew_slots: VoyageCrewSlot[] + } + + export interface PendingRewards { + loot: Loot[] + } + + export interface Loot { + type: number + id: number + symbol: string + item_type?: number + name: string + full_name: string + flavor: string + icon: AtlasIcon + quantity: number + rarity: number + portrait?: Icon + full_body?: Icon + skills?: BaseSkills + traits?: string[] + action?: ShipAction + } + + export interface VoyageCrewSlot { + symbol: string + name: string + skill: string + trait: string + crew: PlayerCrew + } + + export interface VoyageSummaries { + summaries: Summary[] + flavor_amount: number + } + + export interface Summary { + name: string + min: number + max: number + } + + export interface CryoCollection extends Collection { + id: number + type_id?: number + name: string + image?: string + description?: string + progress: number | "n/a" + traits?: string[] + extra_crew?: number[] + claimable_milestone_index?: number + milestone: Milestone + } + + export interface PlayerCollection extends CryoCollection { + crew?: string[]; + simpleDescription?: string; + progressPct?: number; + neededPct?: number; + needed?: number; + neededCost?: number; + totalRewards?: number; + owned: number; + } + +export interface BuffBase { + symbol?: string + name?: string + icon?: Icon | AtlasIcon; + flavor?: string + quantity?: number; + rarity?: number; + } + + export interface ImmortalReward extends BuffBase { + quantity: number; + icon?: AtlasIcon; + } + + export interface Reward extends BuffBase { + type: number + id: number + full_name: string + quantity: number + rarity: number + portrait?: Icon + full_body?: Icon + skills?: BaseSkills + traits?: string[] + action?: ShipAction + ship?: Ship + icon?: AtlasIcon; + item_type?: number + bonuses?: Bonuses + faction_id?: number + } + + export interface MilestoneBuff extends BuffBase { + id: number + type: number + rarity: number + item_sources: any[] + } + + export interface AdvancementBuff extends BuffBase { + short_name?: string + operator: string + value: number + stat: string + source?: string + } + + export interface CollectionBuffsCapHash { + "science_skill_core,percent_increase": number + "engineering_skill_core,percent_increase": number + "medicine_skill_range_min,percent_increase": number + "medicine_skill_range_max,percent_increase": number + "science_skill_range_min,percent_increase": number + "science_skill_range_max,percent_increase": number + "engineering_skill_range_min,percent_increase": number + "engineering_skill_range_max,percent_increase": number + "diplomacy_skill_core,percent_increase": number + "command_skill_core,percent_increase": number + "diplomacy_skill_range_min,percent_increase": number + "diplomacy_skill_range_max,percent_increase": number + "command_skill_range_min,percent_increase": number + "command_skill_range_max,percent_increase": number + "security_skill_core,percent_increase": number + "security_skill_range_min,percent_increase": number + "security_skill_range_max,percent_increase": number + "medicine_skill_core,percent_increase": number + "replicator_fuel_cost,percent_decrease": number + "chroniton_max,increment": number + "crew_experience_training,percent_increase": number + "replicator_uses,increment": number + } + + export interface StarbaseBuffsCapHash { + "replicator_uses,increment": number + "replicator_cost,percent_decrease": number + "chroniton_max,increment": number + "command_skill_core,percent_increase": number + "command_skill_range_min,percent_increase": number + "command_skill_range_max,percent_increase": number + "diplomacy_skill_core,percent_increase": number + "diplomacy_skill_range_min,percent_increase": number + "diplomacy_skill_range_max,percent_increase": number + "security_skill_core,percent_increase": number + "security_skill_range_min,percent_increase": number + "security_skill_range_max,percent_increase": number + "science_skill_core,percent_increase": number + "science_skill_range_min,percent_increase": number + "science_skill_range_max,percent_increase": number + "medicine_skill_core,percent_increase": number + "medicine_skill_range_min,percent_increase": number + "medicine_skill_range_max,percent_increase": number + "engineering_skill_core,percent_increase": number + "engineering_skill_range_min,percent_increase": number + "engineering_skill_range_max,percent_increase": number + } + + + export interface CaptainsBridgeBuffsCapHash { + "ship_attack,percent_increase": number + "ship_shields,percent_increase": number + "fbb_player_ship_attack,percent_increase": number + "ship_accuracy,percent_increase": number + "ship_hull,percent_increase": number + "ship_evasion,percent_increase": number + "fbb_boss_ship_attack,percent_decrease": number + "ship_antimatter,percent_increase": number + } + + export interface AllBuffsCapHash { + "science_skill_core,percent_increase": number + "engineering_skill_core,percent_increase": number + "medicine_skill_range_min,percent_increase": number + "medicine_skill_range_max,percent_increase": number + "science_skill_range_min,percent_increase": number + "science_skill_range_max,percent_increase": number + "engineering_skill_range_min,percent_increase": number + "engineering_skill_range_max,percent_increase": number + "diplomacy_skill_core,percent_increase": number + "command_skill_core,percent_increase": number + "diplomacy_skill_range_min,percent_increase": number + "diplomacy_skill_range_max,percent_increase": number + "command_skill_range_min,percent_increase": number + "command_skill_range_max,percent_increase": number + "security_skill_core,percent_increase": number + "security_skill_range_min,percent_increase": number + "security_skill_range_max,percent_increase": number + "medicine_skill_core,percent_increase": number + "replicator_fuel_cost,percent_decrease": number + "chroniton_max,increment": number + "crew_experience_training,percent_increase": number + "replicator_uses,increment": number + "replicator_cost,percent_decrease": number + "ship_attack,percent_increase": number + "ship_shields,percent_increase": number + "fbb_player_ship_attack,percent_increase": number + "ship_accuracy,percent_increase": number + "ship_hull,percent_increase": number + "ship_evasion,percent_increase": number + "fbb_boss_ship_attack,percent_decrease": number + "ship_antimatter,percent_increase": number + } + + export interface AllBuff { + name: string + short_name: string + flavor: string + icon: Icon + operator: string + value: number + stat: string + source: string + symbol: string + } + + export interface Season { + id: number + symbol: string + title: string + description: string + exclusive_crew: ExclusiveCrew[] + tiers: Tier[] + points_per_tier: number + tier_dilithium_cost: number + start_at: number + end_at: number + premium_tier_offer_store_symbol: string + premium_tier_entitlement_symbol: string + premium_tier_entitlement_specialization: string + supremium_tier_offer_store_symbol: string + supremium_tier_entitlement_symbol: string + supremium_tier_entitlement_specialization: string + supremium_tier_combo_offer_store_symbol: string + opened: boolean + points: number + redeemed_points: number + redeemed_premium: number + redeemed_supremium: number + acknowledged: boolean + concluded: boolean + } + + export interface ExclusiveCrew { + name: string + max_rarity: number + full_body: AtlasIcon + archetype_id: number + } + + export interface Tier { + points: number + rewards: Reward[] + premium_rewards: Reward[] + supremium_rewards: Reward[] + } + + + export interface Fleet { + id: number + rlevel: number + sinsignia: string + nicon_index: number + nleader_player_dbid: number + nstarbase_level: number + nleader_login: number + slabel: string + cursize: number + maxsize: number + created: number + enrollment: string + nmin_level: number + rank: string + epoch_time: number + } + + export interface Squad { + id: number + rank: string + } + + export interface Mailbox { + status: string + sendable: number + sent: number + accepted: number + stores: Stores + received: number + } + + export interface Stores { + [key: string]: number; + } + + export interface FleetInvite { + status: string + sendable: number + sent: number + accepted: number + stores: Stores + received: number + } + + export interface Entitlements { + granted: Granted[] + claimed: Claimed[] + } + + export interface Granted { + uuid: string + gamerTag: number + symbol: string + state: string + updated: number + history: History[] + specialized?: string + } + + export interface History { + what: string + when: string + to?: string + from?: string + reason?: string + } + + export interface Claimed { + uuid: string + gamerTag: number + symbol: string + state: string + updated: number + history: ClaimedHistory[] + specialized?: string + cwin?: Cwin + cwinSecsTillOpen?: number + cwinSecsTillClose?: number + ttl?: number + } + + export interface ClaimedHistory { + what: string + when: string + to?: string + from?: string + gift_quantity?: string + who?: string + quantity?: string + image?: string + ecount?: string + reward_image?: string + obtain?: string + } + + export interface Cwin { + open: number + close: number + } + + export interface Chats {} + + export interface Environment { + tutorials: string[] + level_requirement_123s: number + restrictions: any + background_idle_period: number + fleet_request_purge_threshold: number + fleet_request_purge_expiration_days: number + event_refresh_min_seconds: number + event_refresh_max_seconds: number + allow_webgl_looping_audio: boolean + display_server_environment: boolean + video_ad_campaign_limit: VideoAdCampaignLimit + fleet_activities_restriction_enabled: boolean + shuttle_rental_dil_cost: number + location_updates_enabled: boolean + location_chat_enabled: boolean + enable_server_toasts: boolean + minimum_toast_delay_in_seconds: number + starbase_refresh: number + detect_conflict_mastery_errors: boolean + dilithium_purchase_popup_enabled: boolean + dilithium_purchase_popup_threshold: number + honor_purchase_popup_enabled: boolean + honor_purchase_popup_threshold: number + help_center_button_enabled: boolean + anti_macro: AntiMacro + use_updated_speed_up_cost: boolean + rental_shuttles_enabled: boolean + ship_battle_assist_character_level: number + ship_battle_speedup_multipliers: number[] + hud_popup_queue: HudPopupQueue + limited_time_offers_v2: LimitedTimeOffersV2 + load_with_equipment_rank_caching: boolean + currency_gained_analytic_enabled: boolean + fix_chroniton_ad_boost: boolean + season_123_tier_threshold: number + season_123_no_premium_tier_threshold: number + webgl_debug_cohort: boolean + ratings_whitelist: string[] + ironsource_ios_app_id: string + ironsource_android_app_id: string + ironsource_underage_ios_app_id: string + ironsource_underage_android_app_id: string + offerwall_enabled: boolean + create_player_forte_wallet_on_login: boolean + replicate_forte_wallet_on_login: boolean + replicate_forte_wallet_on_update: boolean + crew_crafting: CrewCrafting + dusting_enabled: boolean + ism_for_polestar_dusting: number + ism_for_constellation_dusting: number + collect_entitlement_claim_result_data: boolean + publish_entitlement_claim_results: boolean + handle_entitlement_claim_result_publications: boolean + privacy_policy_version: number + terms_service_version: number + event_hub_historical_event_limit: number + nerf_refresh_all: boolean + track_battles_at_start: boolean + track_battles_at_end: boolean + retargeting: Retargeting + ccpa_opt_out_url: string + age_gate: boolean + consent_age: number + log_errors_to_analytics: boolean + offer_location_on_hud: string + marketplace_enabled: boolean + maximum_quantity_per_order: number + maximum_orders_per_type_per_player: number + order_lifetime_value: number + order_lifetime_unit: string + maximum_price_per_order: number + use_market_transaction_notifications: boolean + market_receipt_count: number + quick_order_unfilled_is_error: boolean + marketplace_txn_history_caching: MarketplaceTxnHistoryCaching + firebase_analytics_enabled: boolean + daily_missions_repair_enabled: boolean + enable_photo_mode_ui: boolean + include_faction_shops_as_item_sources: boolean + enable_voyage_analytics_tracking: boolean + enable_voyage_analytics_client_tracking: boolean + display_dabo_spin_flash: boolean + quantum_card_enabled: boolean + report_mail_list_benchmarks: boolean + xsolla_guard: boolean + pause_xsolla_giveaway: boolean + fleet_boss_battles_enabled: boolean + fleet_boss_battles: FleetBossBattles + continuum_mission_enabled: boolean + continuum_containers?: ContinuumContainer[]; + use_v2_activities_panel: boolean + grant_current_season_entitlement: boolean + should_reject_disabled_activities: boolean + should_repair_progress: boolean + ism_daily_rewards_reward_start_date: string + fleet_activity_complete_all_daily_activities_start_date: string + scanning_v2: ScanningV2 + allow_forte_inventory_access: boolean + xsolla_giveaway: XsollaGiveaway[] + } + + export interface VideoAdCampaignLimit { + master_limit: Chance + stt_rewarded_scan: Chance + stt_rewarded_warp: Chance + stt_cadet_warp: Chance + stt_rewarded_shuttle: Chance + stt_rewarded_credits: Chance + stt_rewarded_dabo: Chance + stt_rewarded_chroniton_boost: Chance + stt_rewarded_double_rewards: Chance + } + + export interface Chance { + chance: number + period_minutes: number + } + + export interface AntiMacro { + min_minutes_to_popup: number + variable_minutes_to_popup: number + } + + export interface HudPopupQueue { + max_sequential_popups: number + popup_cooldown_seconds: number + } + + export interface LimitedTimeOffersV2 extends HudPopupQueue { + enabled: boolean + force_popup_at_login: boolean + } + + export interface CrewCrafting { + enabled: boolean + crew_source_stores: string[] + } + + export interface Retargeting { + enabled: boolean + lapsed_days: number + spec_name: string + } + + export interface MarketplaceTxnHistoryCaching { + enabled: boolean + duration_mins: number + } + + export interface FleetBossBattles { + battle_start_disabled: BattleStartDisabled + battle_start_restricted_by_rank: boolean + } + + export interface BattleStartDisabled { + active: boolean + use_notification: boolean + message: Message + } + + export interface Message { + [key: string]: string; + } + + export interface ScanningV2 { + enabled: boolean + } + + export interface XsollaGiveaway { + sku: string + quantity: number + } + + export interface Motd { + title: string + text: string + priority: number + image: Icon + url: string + additional_motds: any[] + } + + export interface CommunityLink { + symbol: string + image: LinkImage + title: string + date: string + url: string + } + + export interface LinkImage { + file: string + url: string + version: string + } + + export interface CrewRoster { + key: number; + rarity: number; + name: string; + total: number; + owned: number; + ownedPct: number; + portalPct?: number; + progress: number; + progressPct: number; + immortal: number; + unfrozen: number; + frozen: number; + dupes: number; + + } + export interface ContinuumContainer { + fill_cap: number; + fill_rate: FillRate; + cooldown_time: number; + cooldown_skip_cost_per_hour: number; + unlock_cost: number; + unlock_currency: string; +} + +export interface FillRate { + quantity: number; + time_unit: string; +} diff --git a/src/datacore/ship.ts b/src/datacore/ship.ts new file mode 100644 index 0000000..02953ee --- /dev/null +++ b/src/datacore/ship.ts @@ -0,0 +1,117 @@ +import { Icon } from "./game-elements"; +import { CompletionState } from "./player"; + + +export interface Schematics { + id: number; + icon: Icon; + cost: number; + ship: Ship; + rarity: number; +} + +/** Ship bonuses. Ship derives from this, and PlayerCrew/CrewMember directly reference this */ +export interface ShipBonus { + accuracy?: number; + evasion?: number; + crit_chance?: number; + crit_bonus?: number; +} + +/** + * Ship + */ +export interface Ship extends ShipBonus { + archetype_id?: number; + symbol: string; + name?: string; + rarity: number; + icon?: Icon; + flavor?: string; + model?: string; + max_level?: number; + actions?: ShipAction[]; + shields: number; + hull: number; + attack: number; + evasion: number; + accuracy: number; + crit_chance: number; + crit_bonus: number; + attacks_per_second: number; + shield_regen: number; + traits?: string[]; + traits_hidden?: string[]; + antimatter: number; + id: number; + level: number; + schematic_gain_cost_next_level?: number; + schematic_id?: number; + schematic_icon?: Icon; + battle_stations?: BattleStation[]; + traits_named?: string[]; + owned?: boolean; + tier?: number; + index?: { left: number, right: number }; + immortal?: CompletionState | number; + score?: number; +} + + +export interface BattleStation { + skill: string; +} + + + +export interface ShipAction { + bonus_amount: number; + name: string; + symbol: string; + cooldown: number; + initial_cooldown: number; + duration: number; + + /** Used internally. Not part of source data. */ + cycle_time?: number; + + bonus_type: number; + crew: number; + crew_archetype_id: number; + icon: Icon; + special: boolean; + penalty?: Penalty; + limit?: number; + status?: number; + ability?: Ability; + charge_phases?: ChargePhase[]; + + ability_text?: string; + ability_trigger?: string; + charge_text?: string; + + /** Not part of data, used internally */ + source?: string; +} + +export interface Penalty { + type: number; + amount: number; +} + +export interface Ability extends Penalty { + condition: number; +} + +export interface ChargePhase { + charge_time: number; + ability_amount?: number; + cooldown?: number; + bonus_amount?: number; + duration?: number; +} + +export interface BattleStations { + symbol: string; + battle_stations: BattleStation[] +} \ No newline at end of file diff --git a/src/datacore/shuttle.ts b/src/datacore/shuttle.ts new file mode 100644 index 0000000..34a6ff2 --- /dev/null +++ b/src/datacore/shuttle.ts @@ -0,0 +1,71 @@ +import { Icon } from "./game-elements" +import { Bonuses, PotentialReward, Reward } from "./player" + +export interface ShuttleAdventure { + id: number + symbol: string + name: string + faction_id: number + token_archetype_id: number + challenge_rating: number + shuttles: Shuttle[] + completes_in_seconds: number + x: number + y: number + } + + export interface Shuttle { + id: number + name: string + description: string + state: number + expires_in: number + faction_id: number + slots: Slot[] + rewards: Reward[] + is_rental: boolean + } + + export interface Slot { + level: any + required_trait: any + skills: string[] + trait_bonuses: TraitBonuses + crew_symbol?: string; + } + + export interface TraitBonuses { + [key: string]: any; + } + + export interface Faction { + id: number + name: string + reputation: number + discovered: number + completed_shuttle_adventures: number + icon: Icon + representative_icon: Icon + representative_full_body: Icon + reputation_icon: Icon + reputation_item_icon: Icon + home_system: string + shop_layout: string + shuttle_token_id: number + shuttle_token_preview_item: ShuttleTokenPreviewItem + event_winner_rewards: any[] + } + + export interface ShuttleTokenPreviewItem { + type: number + id: number + symbol: string + item_type: number + name: string + full_name: string + flavor: string + icon: Icon + quantity: number + rarity: number + } + \ No newline at end of file diff --git a/src/datacore/traits.ts b/src/datacore/traits.ts new file mode 100644 index 0000000..4fba830 --- /dev/null +++ b/src/datacore/traits.ts @@ -0,0 +1,329 @@ +export interface AllTraits { + trait_names: TraitNames + ship_trait_names: ShipTraitNames + crew_archetypes: CrewArchetype[] + ship_archetypes: ShipArchetype[] + } + + export interface TraitNames { + [key: string]: string + artist: string + athlete: string + betelgeusian: string + brutal: string + caregiver: string + casual: string + chef: string + civilian: string + clone: string + communicator: string + costumed: string + counselor: string + crafty: string + criminal: string + cultural_figure: string + desperate: string + displaced: string + duelist: string + emerald_chain: string + empath: string + engineered: string + explorer: string + gambler: string + gardener: string + hero: string + hunter: string + innovator: string + inspiring: string + interrogator: string + investigator: string + jury_rigger: string + marksman: string + maverick: string + merchant: string + mirror_universe: string + musician: string + pilot: string + primal: string + prisoner: string + prodigy: string + resourceful: string + romantic: string + royalty: string + saboteur: string + scoundrel: string + shapeshifter: string + smuggler: string + spiritual: string + survivalist: string + tactician: string + telekinetic: string + telepath: string + temporal_agent: string + thief: string + tribbled: string + undercover_operative: string + villain: string + augment: string + dominion: string + federation: string + imperial_guard: string + kca: string + maco: string + maquis: string + obsidian_order: string + qowat_milat: string + section31: string + starfleet: string + tal_shiar: string + tardigrade: string + terran_empire: string + terran_rebellion: string + zhat_vash: string + ambassador: string + astrophysicist: string + bartender: string + botanist: string + constable: string + courier: string + cyberneticist: string + dahar_master: string + diplomat: string + doctor: string + exoarchaeology: string + exobiology: string + exomycologist: string + geneticist: string + geologist: string + high_command: string + kai: string + linguist: string + neurologist: string + nurse: string + politician: string + quantum_mechanics: string + theoretical_engineer: string + timekeeper: string + vedek: string + veteran: string + warp_theorist: string + writer: string + xenoanthropology: string + aenar: string + allasomorph: string + andorian: string + android: string + angosian: string + antedian: string + archon: string + argelian: string + aurelian: string + automated_unit: string + bajoran: string + baku: string + barzan: string + baul: string + benzite: string + beta_annari: string + betazoid: string + borg: string + breen: string + brunali: string + bynar: string + caitian: string + cardassian: string + chameloid: string + changeling: string + control: string + deltan: string + denobulan: string + doopler: string + dosi: string + douwd: string + dramen: string + edosian: string + efrosian: string + elaurian: string + elaysian: string + excalbian: string + ferengi: string + gorn: string + hirogen: string + hologram: string + human: string + historian: string + ikaaran: string + jahsepp: string + jemhadar: string + jnaii: string + kaelon: string + kalandan: string + kantare: string + kataan: string + kazon: string + kelpien: string + klingon: string + kiley: string + kobali: string + kukulkan: string + kraylor: string + krenim: string + kriosian: string + ktarian: string + kwejian: string + kzinti: string + kyrian: string + loqueeque: string + lotian: string + lurian: string + m113_creature: string + malon: string + mintakan: string + mugato: string + mylean: string + nacene: string + nakuhl: string + nasat: string + nausicaan: string + neural: string + ocampa: string + orion: string + pakled: string + pandronian: string + photonic: string + presage: string + probe: string + prophet: string + q: string + rakhari: string + ramatis_3_native: string + reman: string + risian: string + romulan: string + rongovian: string + sarpeidon: string + saurian: string + sentient_computer: string + serilian: string + serpent: string + sikarian: string + silicon_lifeform: string + sona: string + species_8472: string + suliban: string + syrrannite: string + talaxian: string + talosian: string + tamarian: string + tandaran: string + tanugan: string + taresian: string + tellarite: string + terrellian: string + tholian: string + tkon: string + tosk: string + tribble: string + trill: string + vedala: string + vidiian: string + vorta: string + voth: string + vulcan: string + wadi: string + xahean: string + xindi: string + yaderan: string + yridian: string + zahl: string + zibelian: string + advocate: string + astronomer: string + boomer: string + brat: string + chancellor: string + cetacean_biologist: string + cursed: string + empress: string + engineer: string + evolved: string + fenris_ranger: string + khanuttu: string + lord: string + torchbearer: string + mimetic_symbiote: string + multi_dimensional: string + president: string + rich: string + scientist: string + senator: string + shepherd: string + special_envoy: string + spy: string + tailor: string + warrior: string + zhiantara: string + beanlike: string + firefighter: string + cool: string + handsome: string + } + + export interface ShipTraitNames { + [key: string]: string + hirogen: string + borg: string + federation: string + ferengi: string + cardassian: string + klingon: string + romulan: string + terran: string + maquis: string + dominion: string + andorian: string + orion_syndicate: string + vulcan: string + breen: string + tholian: string + malon: string + gorn: string + xindi: string + reman: string + sikarian: string + warship: string + cloaking_device: string + battle_cruiser: string + freighter: string + explorer: string + fighter: string + scout: string + transwarp: string + ruthless: string + war_veteran: string + emp: string + historic: string + pioneer: string + spore_drive: string + hologram: string + raider: string + } + + export interface CrewArchetype { + symbol: string + name: string + short_name: string + } + + export interface ShipArchetype { + symbol: string + name: string + flavor: string + actions: Action[] + } + + export interface Action { + symbol: string + name: string + } + \ No newline at end of file diff --git a/src/datacore/voyage.ts b/src/datacore/voyage.ts new file mode 100644 index 0000000..04d16de --- /dev/null +++ b/src/datacore/voyage.ts @@ -0,0 +1,88 @@ +import { BaseSkills } from './crew'; +import { CrewSlot, PlayerCrew, VoyageCrewSlot, VoyageSkills } from './player'; + +// Voyage calculator require crew.skills +export interface IVoyageCrew extends PlayerCrew { + skills: BaseSkills; +}; + +// The slimmest possible version of voyageConfig, as expected as input by calculator +// Use Voyage for a config from player data when voyage started +// Use VoyageDescription for a config from player data when voyage not yet started +export interface IVoyageInputConfig { + skills: VoyageSkills; + ship_trait: string; + crew_slots: CrewSlot[]; +}; + +// Extends IVoyageInputConfig to include calculation result +export interface IVoyageCalcConfig extends IVoyageInputConfig { + state: string; + max_hp: number; + skill_aggregates: BaseSkills; + crew_slots: VoyageCrewSlot[]; +}; + +export interface IVoyageHistory { + voyages: ITrackedVoyage[]; + crew: ITrackedAssignmentsByCrew; +}; + +export interface ITrackedVoyage { + tracker_id: number; // Used to match tracked voyage with tracked crew + voyage_id: number; // Used to match tracked voyage with in-game voyage + skills: VoyageSkills; + ship_trait: string; + ship: string; + max_hp: number; + skill_aggregates: BaseSkills; + estimate: ITrackedFlatEstimate; + created_at: number; // Date.now() | voyage.created_at + checkpoint: ITrackedCheckpoint; + revivals: number; +}; + +export interface ITrackedFlatEstimate { + median: number; + minimum: number; + moonshot: number; + dilemma: { + hour: number; + chance: number; + }; +}; + +export interface ITrackedCheckpoint { + state: string; + runtime: number; + hp: number; + estimate: ITrackedFlatEstimate; + checked_at: number; // Date.now() +}; + +export interface ITrackedAssignmentsByCrew { + [key: string]: ITrackedAssignment[]; // key is crew.symbol +}; + +export interface ITrackedAssignment { + tracker_id: number; + slot: number; // Slot index where crew is seated + trait: string; // Matched trait or empty string if no match +}; + +export interface ITrackedAssignmentsBySkill { + [key: string]: { + ids: number[], + usage: number + }; +}; + +export interface ITrackedCrewMember extends PlayerCrew { + assignments: ITrackedAssignment[]; + average_estimate: number; + skill_assignments: ITrackedAssignmentsBySkill; + last_assignment: { + tracker_id: number, + created_at: number + }; +}; diff --git a/src/datacore/worker.ts b/src/datacore/worker.ts new file mode 100644 index 0000000..48e5675 --- /dev/null +++ b/src/datacore/worker.ts @@ -0,0 +1,161 @@ +import { BossBattlesRoot } from "./boss"; +import { BaseSkills, Skill } from "./crew"; +import { PlayerCollection, PlayerCrew, PlayerData } from "./player"; +import { Ship } from "./ship"; + +import { EquipmentCommon, EquipmentItem } from "./equipment"; + + +/* TODO: move IBuffStat, calculateBuffConfig to crewutils.ts (currently not used by voyage calculator) */ +export interface IBuffStat { + multiplier: number; + percent_increase: number; +} + +export interface BuffStatTable { + [key: string]: IBuffStat; +} + +export interface GameWorkerOptionsList { + key: number; + value: number; + text: string; +} +export interface VoyageStatsConfig { + others?: number[]; + numSims: number; + startAm: number; + currentAm: number; + elapsedSeconds: number; + variance: number; + ps?: Skill; + ss?: Skill; +} + +export interface GameWorkerOptions { + strategy?: string; + searchDepth?: number; + extendsTarget?: number; +} + +export interface CalculatorProps { + playerData: PlayerData; + allCrew: PlayerCrew[]; +} + +export interface AllData extends CalculatorProps { + allShips?: Ship[]; + playerShips?: Ship[]; + useInVoyage?: boolean; + bossData?: BossBattlesRoot; + buffConfig?: BuffStatTable; +} + +export interface VoyageConsideration { + ship: Ship; + score: number; + traited: boolean; + bestIndex: number; + archetype_id: number; +} + +export interface Calculation { + id: string; + requestId: string; + name: string; + calcState: number; + result?: CalcResult; + trackState?: number; + confidenceState?: number; +} + +export interface CalcResult { + estimate: Estimate; + entries: CalcResultEntry[]; + aggregates: Aggregates; + startAM: number; +} + +export interface Estimate { + refills: Refill[]; + dilhr20: number; + refillshr20: number; + final: boolean; + deterministic?: boolean; + antimatter?: number; +} + +export interface Refill { + all: number[]; + result: number; + safeResult: number; + saferResult: number; + moonshotResult: number; + lastDil: number; + dilChance: number; + refillCostResult: number; +} + +export interface CalcResultEntry { + slotId: number; + choice: PlayerCrew; + hasTrait: boolean | number; +} + +export interface Aggregates { + command_skill: AggregateSkill; + science_skill: AggregateSkill; + security_skill: AggregateSkill; + engineering_skill: AggregateSkill; + diplomacy_skill: AggregateSkill; + medicine_skill: AggregateSkill; +} + +export interface AggregateSkill extends Skill { + skill: string; +} + +export interface CalcConfig { + estimate: number; + minimum: number; + moonshot: number; + antimatter: number; + dilemma: { + hour: number; + chance: number; + }; + refills?: Refill[]; + confidence?: number; +} + +export interface JohnJayBest { + key: string; + crew: JJBestCrewEntry[]; + traits: number[]; + skills: BaseSkills; + estimate: Estimate; +} + +export interface JJBestCrewEntry { + id: number; + name: string; + score: number; +} + +export interface ExportCrew { + id: number; + name: string; + traitBitMask: number; + max_rarity: number; + skillData: number[]; +} + +export interface EquipmentWorkerConfig { + items: EquipmentItem[]; + playerData: PlayerData; + addNeeded?: boolean; +} + +export interface EquipmentWorkerResults { + items: (EquipmentCommon | EquipmentItem)[]; +} diff --git a/src/index.ts b/src/index.ts index 59616b9..578c763 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import fs from 'fs'; -import { Client, Intents } from 'discord.js'; +import { Client, Partials } from 'discord.js'; import { parseCommandInput, Logger, prepareArgParser, getUrl, escapeRegExp } from './utils'; import { MessageCache, sendAndCache } from './utils/discord'; @@ -13,8 +13,15 @@ const Yargs = require('yargs/yargs'); require('dotenv').config(); const client = new Client({ - intents: [Intents.NON_PRIVILEGED], - partials: ['CHANNEL'], + intents: ['Guilds', + 'GuildMessages', + 'MessageContent', + 'GuildEmojisAndStickers', + 'GuildMessageTyping', + 'GuildIntegrations', + 'GuildMessageReactions', + ], + partials: [Partials.Channel, Partials.Message, Partials.GuildMember], }); /* @@ -49,6 +56,13 @@ client.on('ready', () => { Logger.info(`Registering commands globally`); client?.application?.commands.set(slashCommands); } else { + + if (!!process.env.DEFAULT_GUILD) { + const gid = process.env.DEFAULT_GUILD; + Logger.info(`Registering commands for guild ${gid}`); + client.guilds.cache.get(gid)?.commands.set(slashCommands); + } + for (const gid of devGuilds) { Logger.info(`Registering commands for guild ${gid}`); client.guilds.cache.get(gid)?.commands.set(slashCommands); @@ -56,7 +70,7 @@ client.on('ready', () => { } }); -client.on('interaction', (interaction) => { +client.on('interactionCreate', (interaction) => { // If the interaction isn't a slash command, return if (!interaction.isCommand()) return; @@ -65,7 +79,7 @@ client.on('interaction', (interaction) => { let args = { message: interaction, }; - interaction.options.forEach((op) => { + interaction.options.data.forEach((op: any) => { args[op.name] = op.value; }) cmd.handler(args); @@ -93,7 +107,7 @@ client.on('messageDelete', (message) => { } }); -client.on('message', (message) => { +client.on('messageCreate', (message) => { if (message.author.id === client.user?.id) { return; } @@ -135,6 +149,7 @@ client.on('message', (message) => { const prefix = message.content.match(prefixRegex); let usedPrefix = ''; + if (prefix === null) { // special case for attached images (for behold / voyage) let cmdConfig = guildConfig && guildConfig.commands ? guildConfig.commands.find((c: any) => c.command === 'imageAnalysis') : undefined; diff --git a/src/utils/beholdcalc.ts b/src/utils/beholdcalc.ts index 7075f61..a848487 100644 --- a/src/utils/beholdcalc.ts +++ b/src/utils/beholdcalc.ts @@ -1,4 +1,4 @@ -import { Message, MessageEmbed } from 'discord.js'; +import { Message, Embed, EmbedBuilder } from 'discord.js'; import { DCData } from '../data/DCData'; import { formatStatLine, formatCrewCoolRanks, colorFromRarity } from './crew'; @@ -46,13 +46,13 @@ export function isPossibleBehold(data: any, threshold: number = 10) { return true; } -export function formatCrewField(message: Message, crew: Definitions.BotCrew, stars: number, custom: string) { +export function formatCrewField(message: Message, crew: Definitions.BotCrew, stars: number, custom: string, collections: string[]) { let reply = ''; if (crew.bigbook_tier) { reply += `Big Book **tier ${crew.bigbook_tier}** ([link](https://www.bigbook.app/crew/${crew.symbol})), `; } if (crew.cab_ov) { - reply += `CAB **rating ${crew.cab_ov} (rank #${crew.cab_ov_rank})**, `; + reply += `CAB **grade ${crew.cab_ov_grade} (rank #${crew.cab_ov_rank}, rating: ${crew.cab_ov})**, `; } reply += `Voyage #${crew.ranks.voyRank}, Gauntlet #${crew.ranks.gauntletRank}, ${crew.events || 0} event${ @@ -69,7 +69,7 @@ export function formatCrewField(message: Message, crew: Definitions.BotCrew, sta if (custom) { reply += `\n\n**${custom}**`; } - + return reply; } @@ -86,6 +86,7 @@ function recommendations(crew: CrewFromBehold[]) { let best = crew.sort((a, b) => a.crew.bigbook_tier - b.crew.bigbook_tier); let bestCab = [...crew].sort((a, b) => parseFloat(b.crew.cab_ov) - parseFloat(a.crew.cab_ov)); let starBest = crew.filter(c => c.stars > 0 && c.stars < c.crew.max_rarity); + let bestCrew: Definitions.BotCrew = best[0].crew; if (starBest.length > 0) { starBest = starBest.sort((a, b) => a.crew.bigbook_tier - b.crew.bigbook_tier); @@ -115,6 +116,7 @@ function recommendations(crew: CrewFromBehold[]) { } else if (starBest.length > 0 && ff(best[0])) { if (best[1].crew.bigbook_tier < 6 && !ff(best[1])) { title = `${best[1].crew.name} is your best bet, unless you want to start another ${best[0].crew.name}`; + bestCrew = best[1].crew; } else { title = `It may be worth starting another ${best[0].crew.name}, pick ${starBest[0].crew.name} if you don't want dupes`; } @@ -135,11 +137,16 @@ CAB Ratings recommendation: ${bestCab[0].crew.name}` } return { - best: best[0].crew, + best: bestCrew, description: title }; } +function formatCollections(collections: any[]) { + if (!collections?.length) return "None"; + return collections.map(c => `[${c}](${CONFIG.DATACORE_URL}collections?select=${encodeURIComponent(c)})`).join(', ') + ""; +} + function applyCrew(increw: Definitions.BotCrew, buffConfig: Definitions.BuffConfig): Definitions.BotCrew { let crew: Definitions.BotCrew = JSON.parse(JSON.stringify(increw)); crew.base_skills = applyCrewBuffs(crew.base_skills, buffConfig, false); @@ -163,7 +170,7 @@ export async function calculateBehold(message: Message, beholdResult: any, fromC return false; } - if (crew1.max_rarity != crew2.max_rarity || crew2.max_rarity != crew3.max_rarity) { + if ([crew1, crew2, crew3].some(crew => !crew || crew.max_rarity < 4)) { // Not a behold, or couldn't find the crew if (fromCommand) { sendAndCache( @@ -175,7 +182,7 @@ export async function calculateBehold(message: Message, beholdResult: any, fromC return false; } - let embed = new MessageEmbed() + let embed = new EmbedBuilder() .setTitle('Detailed comparison') .setColor(colorFromRarity(crew1.max_rarity)) .setURL(`${CONFIG.DATACORE_URL}behold/?crew=${crew1.symbol}&crew=${crew2.symbol}&crew=${crew3.symbol}`); @@ -198,9 +205,16 @@ export async function calculateBehold(message: Message, beholdResult: any, fromC let found = [1, 1, 1]; for (let entry of profile.crew) { for (let i = 0; i < 3; i++) { - if (entry.id === bcrew[i].archetype_id && entry.rarity && entry.rarity < bcrew[i].max_rarity) { - entry.rarity++; - found[i] = entry.rarity; + if (entry.id === bcrew[i].archetype_id) { + + if (entry.rarity && entry.rarity < bcrew[i].max_rarity) { + entry.rarity++; + found[i] = entry.rarity; + } + + if (!beholdResult["crew" + (i + 1).toString()].stars) { + beholdResult["crew" + (i + 1).toString()].stars = (entry.rarity ?? 1) - 1; + } } } } @@ -224,10 +238,10 @@ export async function calculateBehold(message: Message, beholdResult: any, fromC 1}, Gauntlet #${gauntletranks[i] + 1}`; } - embed = embed.addField( - user.profiles[0].captainName, - `Stats are customized for [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid})'s buffs` - ); + embed = embed.addFields({ + name: user.profiles[0].captainName, + value: `Stats are customized for [your profile](${CONFIG.DATACORE_URL}profile/?dbid=${user.profiles[0].dbid})'s buffs` + }); } } } @@ -238,17 +252,21 @@ export async function calculateBehold(message: Message, beholdResult: any, fromC { crew: crew3, stars: beholdResult.crew3.stars } ]); + embed = embed .setThumbnail(`${CONFIG.ASSETS_URL}${best.imageUrlPortrait}`) - .setDescription(description) - .addField(crew1.name, formatCrewField(message, crew1, beholdResult.crew1.stars, customranks[0])) - .addField(crew2.name, formatCrewField(message, crew2, beholdResult.crew2.stars, customranks[1])) - .addField(crew3.name, formatCrewField(message, crew3, beholdResult.crew3.stars, customranks[2])) - .setFooter( - customranks[0] + .setDescription(description) + .addFields({ name: crew1.name, value: formatCrewField(message, crew1, beholdResult.crew1.stars, customranks[0], crew1.collections)}) + .addFields({ name: "Collections", value: formatCollections(crew1.collections)}) + .addFields({ name: crew2.name, value: formatCrewField(message, crew2, beholdResult.crew2.stars, customranks[1], crew2.collections)}) + .addFields({ name: "Collections", value: formatCollections(crew2.collections)}) + .addFields({ name: crew3.name, value: formatCrewField(message, crew3, beholdResult.crew3.stars, customranks[2], crew3.collections)}) + .addFields({ name: "Collections", value: formatCollections(crew3.collections)}) + .setFooter({ + text: customranks[0] ? 'Make sure to re-upload your profile frequently to get accurate custom recommendations' : `Upload your profile to get custom recommendations` - ); + }); sendAndCache(message, '', {embeds: [embed]}); diff --git a/src/utils/config.ts b/src/utils/config.ts index c219c7a..a457ac9 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -3,7 +3,7 @@ require('dotenv').config(); export default class CONFIG { static readonly DATACORE_URL = process.env.DATACORE_URL; static readonly ASSETS_URL = process.env.ASSETS_URL; - static readonly IMAGE_ANALYSIS_URL = 'http://localhost:5000'; + static readonly IMAGE_ANALYSIS_URL = process.env.IMAGE_ANALYSIS_URL ?? 'http://localhost:5000'; static readonly SKILLS: { [key in Definitions.SkillName]: string } = { command_skill: 'Command', diff --git a/src/utils/crew.ts b/src/utils/crew.ts index b7a2c21..ddf4822 100644 --- a/src/utils/crew.ts +++ b/src/utils/crew.ts @@ -1,5 +1,6 @@ -import { Message } from 'discord.js'; +import { ColorResolvable, Message } from 'discord.js'; import { getEmoteOrString } from './discord'; +import CONFIG from './config'; function formatSkill(skill: Definitions.Skill, useSpace: boolean, forGauntlet: boolean = false) { if (forGauntlet) { @@ -236,7 +237,7 @@ export function chargePhasesToString(action: Definitions.CrewAction): string[] { } } -export function colorFromRarity(rarity: number): 'LIGHT_GREY' | [number, number, number] { +export function colorFromRarity(rarity: number): ColorResolvable { switch (rarity) { case 1: // Common return [155, 155, 155]; @@ -254,7 +255,7 @@ export function colorFromRarity(rarity: number): 'LIGHT_GREY' | [number, number, return [253, 210, 106]; default: - return 'LIGHT_GREY'; + return 'LightGrey'; } } @@ -273,3 +274,8 @@ export function formatStatLine(message: Message, crew: Definitions.BotCrew, rari formatCrewStatsWithEmotes(message, crew) ); } + +export function formatCollectionName(collection: string): string { + + return `[${collection}](${CONFIG.DATACORE_URL}collections?select=${encodeURIComponent(collection)})`; +} \ No newline at end of file diff --git a/src/utils/definitions.d.ts b/src/utils/definitions.d.ts index cb6815e..f64fab2 100644 --- a/src/utils/definitions.d.ts +++ b/src/utils/definitions.d.ts @@ -158,6 +158,7 @@ declare namespace Definitions { bigbook_tier: number; cab_ov: string; cab_ov_rank: string; + cab_ov_grade: string; events: number; ranks: BotCrewRanks; base_skills: Skills; @@ -170,9 +171,13 @@ declare namespace Definitions { cleverThing: string; creator?: string; }[]; - + date_added: Date | string; + obtained: string; // Added by the loading code traits_pseudo: string[]; + traits: string[]; + traits_hidden: string[]; + traits_named?: string[]; } export interface RecipeItem { @@ -223,4 +228,40 @@ declare namespace Definitions { traits: string[]; }; } + + export interface EventInstance { + instance_id: number + fixed_instance_id: number + event_id: number + event_name: string + image: string + event_details?: boolean + } + + + export interface EventDetails { + id: number + symbol: string + name: string + description: string + rules: string + bonus_text: string + rewards_teaser: string + shop_layout: string + featured_crew: BotCrew[] + threshold_rewards: Item[] + ranked_brackets: any[] + squadron_ranked_brackets: any[] + content: any[] + instance_id: number + status: number + seconds_to_start: number + content_types: string[] + seconds_to_end: number + phases: any[] + quest: any[] + bonus?: string[]; + featured?: string[]; + image?: string; + } } diff --git a/src/utils/discord.ts b/src/utils/discord.ts index 0440bbb..b844e9c 100644 --- a/src/utils/discord.ts +++ b/src/utils/discord.ts @@ -1,16 +1,37 @@ -import { APIUser } from 'discord-api-types'; -import { CommandInteraction, GuildMember, Message, MessageEmbed, ReplyMessageOptions, User } from 'discord.js'; + +import { CommandInteraction, GuildMember, Message, EmbedBuilder, MessageReplyOptions, User, GuildChannel, NonThreadGuildBasedChannel, Embed, MessageFlags, APIUser } from 'discord.js'; import NodeCache from 'node-cache'; export function getEmoteOrString(message: Message | CommandInteraction, emojiName: string, defaultString: string): string { - if (message instanceof CommandInteraction) { - if (message.guild && !message.guild.roles.everyone.permissionsIn(message.channel!).has('USE_EXTERNAL_EMOJIS')) { - let emoji = message.guild.emojis.cache.find(emoji => emoji.name === emojiName); - if (emoji) { - return emoji.toString(); - } + // + // Old Code + // + //if (message instanceof CommandInteraction) { + // if (message.guild && !message.guild.roles.everyone.permissionsIn(message.channel! as NonThreadGuildBasedChannel).has('UseExternalEmojis')) { + // let emoji = message.guild.emojis.cache.find(emoji => emoji.name === emojiName); + // if (emoji) { + // return emoji.toString(); + // } + // } + //} + + // New code addresses github issues: + + // https://github.com/discord/discord-api-docs/issues/5524 + // https://github.com/discord/discord-api-docs/issues/5279 + + // Cannot seem to sync external emoji on bots, right now. + // This bug has been opened for over a year (with no current resolutions) + + // Instead of checking if there are any guild permissions for external emoji + // Just use this server's emoji by default, if available. + if (message.guild) { + let emoji = message.guild.emojis.cache.find(emoji => emoji.name === emojiName); + if (emoji) { + return emoji.toString(); } } + switch (emojiName) { case 'credits': @@ -45,12 +66,7 @@ export function getEmoteOrString(message: Message | CommandInteraction, emojiNam export let MessageCache = new NodeCache({ stdTTL: 600 }); export async function sendSplitText(message: Message, content: any) { - let myReply = await message.channel.send(content, { - split: { - prepend: '```\n', - append: '```\n' - } - }); + let myReply = await message.channel.send('```\n' + content + '```\n'); if (myReply instanceof Message) { let entries = MessageCache.get(message.id); @@ -64,7 +80,7 @@ export async function sendSplitText(message: Message, content: any) { } export function discordUserFromMessage(message: Message | CommandInteraction): APIUser | User | null | undefined { - let user = null; + let user: User | APIUser | null | undefined = null; if (message instanceof Message) user = message.author; else if (message instanceof CommandInteraction) { @@ -73,7 +89,7 @@ export function discordUserFromMessage(message: Message | CommandInteraction): A else if (message.member instanceof GuildMember) user = message.member.user; else - user = message.member?.user; + user = message.member?.user as APIUser; } return user; } @@ -82,46 +98,48 @@ type SendOptions = { asReply?: boolean ephemeral?: boolean isFollowUp?: boolean - embeds?: MessageEmbed[] + embeds?: EmbedBuilder[] + maxEmbeds?: number; } export async function sendAndCache(message: Message | CommandInteraction, content: string, options?: SendOptions) { // Slash Commands have their own flow. if (message instanceof CommandInteraction) { - let flags = { ephemeral: options?.ephemeral, embeds: options?.embeds?.splice(0,10) }; + let max = options?.maxEmbeds ?? 10; + let flags = options?.ephemeral ? MessageFlags.Ephemeral : 0; // { ephemeral: options?.ephemeral, embeds: options?.embeds?.splice(0,10) }; if (options?.isFollowUp) - message.followUp(content, flags) + await message.followUp({ content, flags, embeds: options?.embeds?.splice(0,max)?.map((e) => e.toJSON()) }) else - message.reply(content, flags) + await message.reply({ content, flags, embeds: options?.embeds?.splice(0,max)?.map((e) => e.toJSON()) }) while ((options?.embeds?.length ?? 0) > 0){ - flags = { ephemeral: options?.ephemeral, embeds: options?.embeds?.splice(0,10) }; - message.followUp(flags); + let msg = { ephemeral: options?.ephemeral, embeds: options?.embeds?.splice(0,max)?.map((e) => e.toJSON()) }; + await message.followUp(msg); } return; } - const flags: ReplyMessageOptions = { split: true }; + let flags: MessageReplyOptions = {}; - // if (content instanceof MessageEmbed){ - // options?.embeds - // } + flags.content = content; let nEmbeds = options?.embeds?.length ?? 0; + if (nEmbeds > 0) { - flags.embed = options?.embeds![0]; + flags.embeds = options?.embeds!.slice(0, 1)?.map((e) => e.toJSON()); } - if (options?.asReply || message.channel == null) { - cache(await message.reply(content, flags as ReplyMessageOptions)); + flags.content = content; + cache(await message.reply(flags)); } else { - cache(await (message.channel as any).send(content, flags)); + cache(await (message.channel as any).send(flags)); } if (nEmbeds > 1) { for (let additionalEmbed of options!.embeds!.slice(1)){ - cache(await (message.channel as any).send(additionalEmbed)); + flags = { embeds: [additionalEmbed] }; + cache(await (message.channel as any).send(flags)); } } diff --git a/src/utils/events.ts b/src/utils/events.ts new file mode 100644 index 0000000..5d6284e --- /dev/null +++ b/src/utils/events.ts @@ -0,0 +1,226 @@ + +import { IEventData } from '../datacore/events'; +import { Content, GameEvent, Shuttle } from '../datacore/player'; +import fs from 'fs'; + +export function getEventData(activeEvent: GameEvent, allCrew: Definitions.BotCrew[]): IEventData | undefined { + const result = {} as IEventData; + result.symbol = activeEvent.symbol; + result.name = activeEvent.name; + result.description = activeEvent.description; + result.bonus_text = activeEvent.bonus_text; + result.content_types = activeEvent.content_types; + result.seconds_to_start = activeEvent.seconds_to_start; + result.seconds_to_end = activeEvent.seconds_to_end; + + let types = [] as string[]; + + if (activeEvent.rules.includes("Faction")) types.push("Faction");; + if (activeEvent.rules.includes("Skirmish")) types.push("Skirmish"); + if (activeEvent.rules.includes("Supply")) types.push("Galaxy"); + + if (types.length === 2) { + let atype = types[0] === 'Galaxy' ? 'Supply' : types[0]; + let btype = types[1] === 'Galaxy' ? 'Supply' : types[1]; + let a = activeEvent.rules.indexOf(atype); + let b = activeEvent.rules.indexOf(btype); + if (b < a) { + types = [ types[1], types[0] ]; + } + } + result.type = types.join("/"); + + // We can get event image more definitively by fetching from events/instance_id.json rather than player data + result.image = activeEvent.phases[0].splash_image.file.slice(1).replace(/\//g, '_') + '.png'; + + result.featured = []; + result.bonus = []; + + // Content is active phase of started event or first phase of unstarted event + // This may not catch all bonus crew in hybrids, e.g. "dirty" shuttles while in phase 2 skirmish + const activePhase = (Array.isArray(activeEvent.content) ? activeEvent.content[activeEvent.content.length-1] : activeEvent.content) as Content; + + if (!activePhase) return result; + + if (activePhase.content_type === 'shuttles' && activePhase.shuttles) { + activePhase.shuttles.forEach((shuttle: Shuttle) => { + for (let symbol in shuttle.crew_bonuses) { + if (!result.bonus.includes(symbol)) { + result.bonus.push(symbol); + if (shuttle.crew_bonuses[symbol] === 3) result.featured.push(symbol); + } + } + }); + } + else if (activePhase.content_type === 'gather' && activePhase.crew_bonuses) { + for (let symbol in activePhase.crew_bonuses) { + if (!result.bonus.includes(symbol)) { + result.bonus.push(symbol); + if (activePhase.crew_bonuses[symbol] === 10) result.featured.push(symbol); + } + } + } + else if (activePhase.content_type === 'skirmish') { + if (activePhase.bonus_crew) { + for (let i = 0; i < activePhase.bonus_crew.length; i++) { + let symbol = activePhase.bonus_crew[i]; + if (!result.bonus.includes(symbol)) { + result.bonus.push(symbol); + result.featured.push(symbol); + } + } + } + // Skirmish uses activePhase.bonus_traits to identify smaller bonus event crew + if (activePhase.bonus_traits) { + activePhase.bonus_traits.forEach(trait => { + const perfectTraits = allCrew.filter(crew => crew.traits.includes(trait) || crew.traits_hidden.includes(trait)); + perfectTraits.forEach(crew => { + if (!result.bonus.includes(crew.symbol)) { + result.bonus.push(crew.symbol); + } + }); + }); + } + } + + // Guess featured crew when not explicitly listed in event data (e.g. pre-start skirmish or hybrid w/ phase 1 skirmish) + if (result.bonus.length === 0) { + const { bonus, featured } = guessBonusCrew(activeEvent, allCrew); + result.bonus = bonus; + result.featured = featured; + result.bonusGuessed = true; + } + + return result; +} + +// Current event here refers to an ongoing event, or the next event if none is ongoing +function guessCurrentEventId(start: number, allEvents: Definitions.EventInstance[]): number { + // Use penultimate event instance if current time is: + // >= Wednesday Noon ET (approx time when game data is updated with next week's event) + // and < Monday Noon ET (when event ends) + // Otherwise use ultimate event + // Note: DataCore autosyncs events at ~1PM ET every day, so there might be some lag on Wednesday + const currentIndex = start < 24*60*60 ? 2 : 1; + return allEvents[allEvents.length-currentIndex].instance_id; +} + +// Get seconds to event start, end from current time +function getCurrentStartEndTimes(): { start: number, end: number, startTime: Date, endTime: Date } { + const currentTime = new Date(); + const utcDay = currentTime.getUTCDay(), utcHour = currentTime.getUTCHours(); + + // Event "week" starts and ends on Monday at Noon ET + let eventDay = [6, 0, 1, 2, 3, 4, 5][utcDay]; + eventDay = utcHour < 16 ? (eventDay-1 < 0 ? 6 : eventDay-1) : eventDay; + + // Event end time is Monday Noon ET (Event Day "7", 0:00:00) + let endTime = new Date(); + endTime.setDate(endTime.getDate()+(6-eventDay)); + endTime.setUTCHours(16, 0, 0, 0); // Noon ET is 16:00:00 UTC + if (endTime.getUTCDay() === 0) { + endTime.setDate(endTime.getDate()+1); + } + // Event start time is Thursday Noon ET (Event Day 3, 0:00:00) + // aka exactly 4 days before endTime + let startTime = new Date(endTime.getTime()); + startTime.setDate(startTime.getDate()-4); + + let start = 0; + let diff = endTime.getTime() - currentTime.getTime(); + const end = Math.floor((diff)/1000); + + // Event hasn't started yet + if (eventDay < 3) { + start = Math.floor((diff)/1000); + } + + return { start, end, startTime, endTime }; +} + +export function getRecentEvents(allCrew: Definitions.BotCrew[], allEvents: Definitions.EventInstance[]): IEventData[] { + const recentEvents = [] as IEventData[]; + + const { start, end, startTime, endTime } = getCurrentStartEndTimes(); + const currentEventId = guessCurrentEventId(start, allEvents); + + let index = 1; + while (recentEvents.length < 2) { + const eventId = allEvents[allEvents.length-index].instance_id; + const response = fs.readFileSync(process.env.DC_DATA_PATH! + '/events/'+eventId+'.json', 'utf8'); + const json = JSON.parse(response); + const eventData = getEventData(json, allCrew) as IEventData; + if (eventId === currentEventId) { + eventData.seconds_to_start = start; + eventData.seconds_to_end = end; + eventData.startDate = startTime; + eventData.endDate = endTime; + // Assume in phase 2 of ongoing event + if (eventData.content_types.length === 2 && end < 2*24*60*60) { + eventData.content_types = [eventData.content_types[1]]; + } + } + else { + eventData.startDate = new Date(startTime.getTime() + (1000 * 24 * 60 * 60 * 7)); + eventData.endDate = new Date(endTime.getTime() + (1000 * 24 * 60 * 60 * 7)); + } + recentEvents.unshift(eventData); + index++; + if (eventId === currentEventId) break; + } + + return recentEvents; +} + +function guessBonusCrew(activeEvent: GameEvent, allCrew: Definitions.BotCrew[]): { bonus: string[], featured: string[] } { + const bonus = [] as string[]; + const featured = [] as string[]; + + // Guess bonus crew from bonus_text + // bonus_text seems to be reliably available, but might be inconsistently written + if (activeEvent.bonus_text !== '') { + const words = activeEvent.bonus_text.replace('Crew Bonus: ', '').replace(' crew', '').replace(/\sor\s/, ',').split(',').filter(word => word !== ''); + words.forEach(trait => { + // Search for exact name first + const testName = trait.trim(); + const perfectName = allCrew.find(crew => crew.name === testName); + if (perfectName) { + featured.push(perfectName.symbol); + if (!bonus.includes(perfectName.symbol)) + bonus.push(perfectName.symbol); + } + // Otherwise search for matching trait + else { + const testTrait = testName.replace(/[\.\s'’]/g, '').toLowerCase(); + const perfectTraits = allCrew.filter(crew => crew.traits.includes(testTrait) || crew.traits_hidden.includes(testTrait)); + if (perfectTraits.length > 0) { + perfectTraits.forEach(crew => { + if (!bonus.includes(crew.symbol)) + bonus.push(crew.symbol); + }); + } + // Otherwise try matching last name only (e.g. J. Archer should be Archer) + else { + if (/\s/.test(testName)) { + const imperfectTrait = testName.replace(/^.+\s/, '').toLowerCase(); + const imperfectTraits = allCrew.filter(crew => crew.traits.includes(imperfectTrait) || crew.traits_hidden.includes(imperfectTrait)); + imperfectTraits.forEach(crew => { + if (!bonus.includes(crew.symbol)) + bonus.push(crew.symbol); + }); + } + } + } + // Identify featured from matching featured_crew + // These usually include the event's legendary ranked reward, so check against the bonus crew we identified above + activeEvent.featured_crew.forEach(crew => { + if (bonus.includes(crew.symbol)) { + if (!featured.includes(crew.symbol)) + featured.push(crew.symbol); + } + }); + }); + } + + return { bonus, featured }; +} diff --git a/src/utils/profile.ts b/src/utils/profile.ts index f08befc..7c4f4a5 100644 --- a/src/utils/profile.ts +++ b/src/utils/profile.ts @@ -169,14 +169,14 @@ export async function createUserFromMessage(message: Message) { if (!userDB) { userDB = await User.create({ - discordUserName: message.author.username, - discordUserDiscriminator: message.author.discriminator, + discordUserName: message.member?.user.username, + discordUserDiscriminator: message.member?.user.discriminator, discordUserId: message.author.id, userRole: UserRole.DISCORDONLY }); - } else { - userDB.discordUserName = message.author.username; - userDB.discordUserDiscriminator = message.author.discriminator; + } else if (message.member) { + userDB.discordUserName = message.member.user.username; + userDB.discordUserDiscriminator = message.member.user.discriminator; await userDB.save(); } @@ -313,8 +313,22 @@ export async function loadRemoteProfile(dbid: string): Promise { export function loadFullProfile(dbid: string): any { let profileData = JSON.parse(fs.readFileSync(process.env.PROFILE_DATA_PATH + dbid, 'utf8')); if (profileData && profileData.player.dbid.toString() === dbid) { + let stat = fs.statSync(process.env.PROFILE_DATA_PATH + dbid); + if (stat?.mtime) { + profileData.lastModified = stat.mtime; + } return profileData; } return undefined; +} + +export function toTimestamp(date: Date, format: 'd' | 'D' | 'f' | 'F' | 't' | 'T' | 'R' | undefined = 'D') { + let n = Math.round(date.getTime() / 1000); + if (format) { + return ``; + } + else { + return ``; + } } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 1606c1e..c28f7f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,34 @@ { - "compilerOptions": { - "target": "ES2018", - "module": "commonjs", - "outDir": "./build", - "strict": true, - "resolveJsonModule": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true - } -} + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "rootDir": "./src/", + "outDir": "./build/", + "strict": true, + "moduleResolution": "node", + "importHelpers": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "typeRoots": [ + "node_modules/@types" + ], + "sourceMap": true, + "baseUrl": "./" + }, + "files": [ + "src/index.ts" + ], + "include": [ + "./**/*.ts" + ], + "exclude": [ + "node_modules", + "build" + ], +} \ No newline at end of file