From 862b9850381abf8a379bd86ba457d27843f30bd2 Mon Sep 17 00:00:00 2001 From: Coder-Tavi <66774833+Coder-Tavi@users.noreply.github.com> Date: Sat, 10 Jun 2023 16:09:43 -0700 Subject: [PATCH 1/8] major: initial commit * Add files * Include files not ready for others to review Co-authored-by: Phil --- .eslintrc.json | 52 +- .gitignore | 90 +- .husky/.gitignore | 1 + .husky/pre-commit | 4 + .prettierignore | 24 + .prettierrc.json | 8 + changelog.md | 16 + changelog.txt | 23 - classes/banManager.js | 68 - commands/about.js | 16 - commands/alias.js | 62 - commands/archive/checkpermissions.js | 4 - commands/archive/lookup.js | 217 - commands/archive/punish-handler.js | 44 - commands/archive/punishsettings-handler.js | 38 - commands/archive/unban.js | 59 - commands/avatar.js | 29 - commands/banner.js | 22 - commands/broadcast.js | 39 - commands/changelog.js | 16 - commands/checkallusers.js | 92 - commands/eval.js | 31 - commands/guild.js | 48 - commands/guild/disable.js | 23 - commands/guild/enable.js | 33 - commands/guild/setup.js | 72 - commands/guild/stats.js | 35 - commands/guildmgr.js | 58 - commands/guildmgr/add.js | 32 - commands/guildmgr/block.js | 17 - commands/guildmgr/info.js | 33 - commands/guildmgr/remove.js | 19 - commands/help.js | 16 - commands/lookup.js | 234 - config.json | 35 - config/main.json | 41 - database/models/Ban.js | 27 - database/models/Maintainer.js | 9 - database/models/OfflineStat.js | 9 - database/models/ParticipatingServer.js | 25 - database/models/PointList.js | 21 - database/models/PunishmentLevel.js | 17 - database/models/ServerSetting.js | 23 - database/models/UserAlias.js | 21 - database/models/UserIDAssociation.js | 24 - database/models/UserPoint.js | 28 - database/models/UserPunnishmentTicker.js | 25 - database/models/Warn.js | 21 - database/models/discardDeprecationWarning.js | 8 - deno.json | 15 + deno.lock | 2182 ++++++++ functions/AUTOCOMPLETE/RESOLVE/channel.js | 31 - functions/AUTOCOMPLETE/RESOLVE/role.js | 30 - functions/AUTOCOMPLETE/RESOLVE/server.js | 27 - functions/AUTOCOMPLETE/guildmgr.js | 16 - functions/AUTOCOMPLETE/syncbans.js | 18 - functions/CHECK/DB/perms.js | 20 - functions/EVENT/guildBanAdd.js | 116 - functions/EVENT/guildBanRemove.js | 15 - functions/EVENT/guildCreate.js | 61 - functions/EVENT/guildDelete.js | 20 - functions/EVENT/guildMemberAdd.js | 78 - functions/EVENT/interaction/isAutocomplete.js | 9 - functions/EVENT/interaction/isCommand.js | 44 - functions/EVENT/interactionCreate.js | 15 - functions/GET/DB/alias.js | 28 - functions/GET/DB/registered.js | 10 - functions/GET/DB/server.js | 14 - functions/HEARTBEAT/BOTLIST/botsondiscord.js | 24 - functions/HEARTBEAT/BOTLIST/discordbotlist.js | 23 - functions/HEARTBEAT/BOTLIST/discordlist.js | 24 - functions/HEARTBEAT/BOTLIST/discords.js | 24 - functions/HEARTBEAT/BOTLIST/disordbots.js | 24 - .../HEARTBEAT/BOTLIST/motiondevelopment.js | 24 - functions/HEARTBEAT/uptime.js | 23 - functions/SET/DB/userTagRecord.js | 29 - functions/SETUP/heartbeat.js | 21 - functions/SETUP/offlineStat.js | 41 - functions/SETUP/status.js | 14 - functions/STARTUP/DBConnection.js | 24 - functions/STARTUP/initCommands.js | 64 - functions/STARTUP/initFunctions.js | 46 - functions/archive/CMD_punish_add.js | 8 - functions/archive/CMD_punish_list.js | 8 - .../archive/CMD_punish_listPunnishments.js | 8 - functions/archive/CMD_punish_manualAdd.js | 8 - functions/archive/CMD_punish_manualRemove.js | 8 - functions/archive/CMD_punish_remove.js | 8 - functions/archive/CMD_punish_stats.js | 8 - functions/archive/CMD_punish_userStats.js | 8 - .../CMD_punishsettings_addPunnishment.js | 8 - .../archive/CMD_punishsettings_addReason.js | 8 - .../archive/CMD_punishsettings_enable.js | 56 - .../archive/CMD_punishsettings_forceReason.js | 40 - .../CMD_punishsettings_listPunnishment.js | 8 - .../archive/CMD_punishsettings_listReasons.js | 8 - .../CMD_punishsettings_listSettings.js | 42 - .../CMD_punishsettings_pointLifetime.js | 8 - .../CMD_punishsettings_removePunnishment.js | 8 - .../CMD_punishsettings_removeReason.js | 8 - functions/archive/FUNC_checkUserPunishment.js | 10 - .../archive/FUNC_userPunishmentHandler.js | 13 - functions/archive/TCKR_punishmentTimer.js | 9 - functions/globalFuncs.js | 33 - functions/richEmbedMessage.js | 24 - index.js | 100 - package-lock.json | 4778 +++++++++++++---- package.json | 55 +- src/classes/banManager.ts | 116 + src/commands/about.ts | 16 + src/commands/alias.ts | 55 + src/commands/alias/add.ts | 77 + src/commands/alias/remove.ts | 23 + src/commands/alias/update.ts | 25 + src/commands/avatar.ts | 24 + src/commands/banner.ts | 24 + src/commands/broadcast.ts | 67 + src/commands/changelog.ts | 16 + src/commands/checkallusers.ts | 63 + src/commands/checkallusers/handler.ts | 42 + src/commands/eval.ts | 43 + src/commands/guild.ts | 56 + src/commands/guild/disable.ts | 25 + src/commands/guild/enable.ts | 25 + src/commands/guild/setup.ts | 35 + src/commands/guild/stats.ts | 52 + src/commands/guildmgr.ts | 86 + src/commands/guildmgr/add.ts | 45 + src/commands/guildmgr/block.ts | 26 + src/commands/guildmgr/info.ts | 57 + src/commands/guildmgr/remove.ts | 20 + src/commands/help.ts | 14 + src/commands/lookup.ts | 29 + .../commands/maintainer.ts | 6 +- .../add.js => src/commands/maintainer/add.ts | 0 .../commands/maintainer/info.ts | 0 .../commands/maintainer/remove.ts | 0 commands/ping.js => src/commands/ping.ts | 2 +- .../commands/syncallbans.ts | 2 +- .../syncbans.js => src/commands/syncbans.ts | 4 +- commands/unban.js => src/commands/unban.ts | 2 +- commands/warn.js => src/commands/warn.ts | 10 +- .../warn/add.js => src/commands/warn/add.ts | 0 .../warn/edit.js => src/commands/warn/edit.ts | 0 src/configs/config.json | 27 + {config => src/configs}/example_config.json | 0 src/configs/main.json | 31 + src/database/models/alias.ts | 102 + src/database/models/ban.ts | 96 + src/database/models/guild.ts | 105 + src/database/models/user.ts | 61 + src/database/models/warn.ts | 96 + src/functions/READY/commandInit.ts | 52 + src/functions/STARTUP/dbInit.ts | 29 + src/functions/STARTUP/functionInit.ts | 34 + src/index.ts | 42 + src/typings/Bitfield.ts | 205 + src/typings/Extensions.ts | 30 + src/typings/Models.ts | 70 + src/typings/StaffFlags.ts | 30 + src/typings/StaffFlagsBitField.ts | 91 + testdata.json | 56 + 162 files changed, 8261 insertions(+), 4326 deletions(-) create mode 100644 .husky/.gitignore create mode 100644 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 changelog.md delete mode 100644 changelog.txt delete mode 100644 classes/banManager.js delete mode 100644 commands/about.js delete mode 100644 commands/alias.js delete mode 100644 commands/archive/checkpermissions.js delete mode 100644 commands/archive/lookup.js delete mode 100644 commands/archive/punish-handler.js delete mode 100644 commands/archive/punishsettings-handler.js delete mode 100644 commands/archive/unban.js delete mode 100644 commands/avatar.js delete mode 100644 commands/banner.js delete mode 100644 commands/broadcast.js delete mode 100644 commands/changelog.js delete mode 100644 commands/checkallusers.js delete mode 100644 commands/eval.js delete mode 100644 commands/guild.js delete mode 100644 commands/guild/disable.js delete mode 100644 commands/guild/enable.js delete mode 100644 commands/guild/setup.js delete mode 100644 commands/guild/stats.js delete mode 100644 commands/guildmgr.js delete mode 100644 commands/guildmgr/add.js delete mode 100644 commands/guildmgr/block.js delete mode 100644 commands/guildmgr/info.js delete mode 100644 commands/guildmgr/remove.js delete mode 100644 commands/help.js delete mode 100644 commands/lookup.js delete mode 100644 config.json delete mode 100644 config/main.json delete mode 100644 database/models/Ban.js delete mode 100644 database/models/Maintainer.js delete mode 100644 database/models/OfflineStat.js delete mode 100644 database/models/ParticipatingServer.js delete mode 100644 database/models/PointList.js delete mode 100644 database/models/PunishmentLevel.js delete mode 100644 database/models/ServerSetting.js delete mode 100644 database/models/UserAlias.js delete mode 100644 database/models/UserIDAssociation.js delete mode 100644 database/models/UserPoint.js delete mode 100644 database/models/UserPunnishmentTicker.js delete mode 100644 database/models/Warn.js delete mode 100644 database/models/discardDeprecationWarning.js create mode 100644 deno.json create mode 100644 deno.lock delete mode 100644 functions/AUTOCOMPLETE/RESOLVE/channel.js delete mode 100644 functions/AUTOCOMPLETE/RESOLVE/role.js delete mode 100644 functions/AUTOCOMPLETE/RESOLVE/server.js delete mode 100644 functions/AUTOCOMPLETE/guildmgr.js delete mode 100644 functions/AUTOCOMPLETE/syncbans.js delete mode 100644 functions/CHECK/DB/perms.js delete mode 100644 functions/EVENT/guildBanAdd.js delete mode 100644 functions/EVENT/guildBanRemove.js delete mode 100644 functions/EVENT/guildCreate.js delete mode 100644 functions/EVENT/guildDelete.js delete mode 100644 functions/EVENT/guildMemberAdd.js delete mode 100644 functions/EVENT/interaction/isAutocomplete.js delete mode 100644 functions/EVENT/interaction/isCommand.js delete mode 100644 functions/EVENT/interactionCreate.js delete mode 100644 functions/GET/DB/alias.js delete mode 100644 functions/GET/DB/registered.js delete mode 100644 functions/GET/DB/server.js delete mode 100644 functions/HEARTBEAT/BOTLIST/botsondiscord.js delete mode 100644 functions/HEARTBEAT/BOTLIST/discordbotlist.js delete mode 100644 functions/HEARTBEAT/BOTLIST/discordlist.js delete mode 100644 functions/HEARTBEAT/BOTLIST/discords.js delete mode 100644 functions/HEARTBEAT/BOTLIST/disordbots.js delete mode 100644 functions/HEARTBEAT/BOTLIST/motiondevelopment.js delete mode 100644 functions/HEARTBEAT/uptime.js delete mode 100644 functions/SET/DB/userTagRecord.js delete mode 100644 functions/SETUP/heartbeat.js delete mode 100644 functions/SETUP/offlineStat.js delete mode 100644 functions/SETUP/status.js delete mode 100644 functions/STARTUP/DBConnection.js delete mode 100644 functions/STARTUP/initCommands.js delete mode 100644 functions/STARTUP/initFunctions.js delete mode 100644 functions/archive/CMD_punish_add.js delete mode 100644 functions/archive/CMD_punish_list.js delete mode 100644 functions/archive/CMD_punish_listPunnishments.js delete mode 100644 functions/archive/CMD_punish_manualAdd.js delete mode 100644 functions/archive/CMD_punish_manualRemove.js delete mode 100644 functions/archive/CMD_punish_remove.js delete mode 100644 functions/archive/CMD_punish_stats.js delete mode 100644 functions/archive/CMD_punish_userStats.js delete mode 100644 functions/archive/CMD_punishsettings_addPunnishment.js delete mode 100644 functions/archive/CMD_punishsettings_addReason.js delete mode 100644 functions/archive/CMD_punishsettings_enable.js delete mode 100644 functions/archive/CMD_punishsettings_forceReason.js delete mode 100644 functions/archive/CMD_punishsettings_listPunnishment.js delete mode 100644 functions/archive/CMD_punishsettings_listReasons.js delete mode 100644 functions/archive/CMD_punishsettings_listSettings.js delete mode 100644 functions/archive/CMD_punishsettings_pointLifetime.js delete mode 100644 functions/archive/CMD_punishsettings_removePunnishment.js delete mode 100644 functions/archive/CMD_punishsettings_removeReason.js delete mode 100644 functions/archive/FUNC_checkUserPunishment.js delete mode 100644 functions/archive/FUNC_userPunishmentHandler.js delete mode 100644 functions/archive/TCKR_punishmentTimer.js delete mode 100644 functions/globalFuncs.js delete mode 100644 functions/richEmbedMessage.js delete mode 100644 index.js create mode 100644 src/classes/banManager.ts create mode 100644 src/commands/about.ts create mode 100644 src/commands/alias.ts create mode 100644 src/commands/alias/add.ts create mode 100644 src/commands/alias/remove.ts create mode 100644 src/commands/alias/update.ts create mode 100644 src/commands/avatar.ts create mode 100644 src/commands/banner.ts create mode 100644 src/commands/broadcast.ts create mode 100644 src/commands/changelog.ts create mode 100644 src/commands/checkallusers.ts create mode 100644 src/commands/checkallusers/handler.ts create mode 100644 src/commands/eval.ts create mode 100644 src/commands/guild.ts create mode 100644 src/commands/guild/disable.ts create mode 100644 src/commands/guild/enable.ts create mode 100644 src/commands/guild/setup.ts create mode 100644 src/commands/guild/stats.ts create mode 100644 src/commands/guildmgr.ts create mode 100644 src/commands/guildmgr/add.ts create mode 100644 src/commands/guildmgr/block.ts create mode 100644 src/commands/guildmgr/info.ts create mode 100644 src/commands/guildmgr/remove.ts create mode 100644 src/commands/help.ts create mode 100644 src/commands/lookup.ts rename commands/maintainer.js => src/commands/maintainer.ts (80%) rename commands/maintainer/add.js => src/commands/maintainer/add.ts (100%) rename commands/maintainer/info.js => src/commands/maintainer/info.ts (100%) rename commands/maintainer/remove.js => src/commands/maintainer/remove.ts (100%) rename commands/ping.js => src/commands/ping.ts (98%) rename commands/syncallbans.js => src/commands/syncallbans.ts (98%) rename commands/syncbans.js => src/commands/syncbans.ts (94%) rename commands/unban.js => src/commands/unban.ts (98%) rename commands/warn.js => src/commands/warn.ts (90%) rename commands/warn/add.js => src/commands/warn/add.ts (100%) rename commands/warn/edit.js => src/commands/warn/edit.ts (100%) create mode 100644 src/configs/config.json rename {config => src/configs}/example_config.json (100%) create mode 100644 src/configs/main.json create mode 100644 src/database/models/alias.ts create mode 100644 src/database/models/ban.ts create mode 100644 src/database/models/guild.ts create mode 100644 src/database/models/user.ts create mode 100644 src/database/models/warn.ts create mode 100644 src/functions/READY/commandInit.ts create mode 100644 src/functions/STARTUP/dbInit.ts create mode 100644 src/functions/STARTUP/functionInit.ts create mode 100644 src/index.ts create mode 100644 src/typings/Bitfield.ts create mode 100644 src/typings/Extensions.ts create mode 100644 src/typings/Models.ts create mode 100644 src/typings/StaffFlags.ts create mode 100644 src/typings/StaffFlagsBitField.ts create mode 100644 testdata.json diff --git a/.eslintrc.json b/.eslintrc.json index d9f1353..da945bf 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,36 +1,18 @@ { - "env": { - "browser": true, - "es6": true - }, - "extends": [ - "airbnb-base" - ], - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, - "rules": { - "consistent-return": 0, - "no-console": 0, - "max-len": 0, - "no-useless-return": 0, - "linebreak-style": 0, - "no-case-declarations": 0, - "no-shadow": 0, - "no-restricted-globals": 0, - "no-plusplus": 0, - "camelcase": 0, - "global-require":0, - "import/no-dynamic-require": 0, - "no-unused-expressions": 0, - "no-unused-vars": 0, - "prefer-destructuring": 0, - "no-return-assign": 0, - "no-undef": 0 - } -} \ No newline at end of file + "env": { + "es2021": true, + "node": true + }, + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "overrides": [], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error", { "destructuredArrayIgnorePattern": "^_" }] + } +} diff --git a/.gitignore b/.gitignore index 94fc1be..249459a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,48 +1,8 @@ # Logs logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release # Dependency directories node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ # TypeScript cache *.tsbuildinfo @@ -53,58 +13,12 @@ typings/ # Optional eslint cache .eslintcache -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - # dotenv environment variables file .env .env.test -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt +# TS Output dist -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - # Custom -test_token.json -config/config.json -.vscode/settings.json -.vsls.json \ No newline at end of file +.vscode/settings.json \ No newline at end of file diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 0000000..31354ec --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..36af219 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..249459a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,24 @@ +# Logs +logs + +# Dependency directories +node_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# dotenv environment variables file +.env +.env.test + +# TS Output +dist + +# Custom +.vscode/settings.json \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..b14cf56 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "trailingComma": "none", + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "endOfLine": "lf", + "printWidth": 120 +} \ No newline at end of file diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..fd0b39c --- /dev/null +++ b/changelog.md @@ -0,0 +1,16 @@ +# Agent Black Changelog + +## 4.0.0 - New Beginnings +### Additions +* Add typings for models and functions +* Add TypeScript configuration files + +### Changes +* Fixed some typos +* Updated string concatenation +* Upgraded and version locked all dependencies +* Changed file structure to support TS compiler + +### Deletions +* Removed all archive files +* Removed unneeded gitignore entries \ No newline at end of file diff --git a/changelog.txt b/changelog.txt deleted file mode 100644 index da03556..0000000 --- a/changelog.txt +++ /dev/null @@ -1,23 +0,0 @@ -**Changelog:** -__Bot update - 3.0.0 - Discord-App-y-fyed the bot__ -New Stuff: -- A new command to retrieve user banners -- Added bot to status monitoring: status.flipped.codes - -Important Changes: -- completely remade agent-black with the new slash-commands (complete remake of backend) -- the help comamnd has been stripped down to just display a simple message to now use the build in slash command help provided by discord (Temporary) ---> **You now need use the slash commands to interact with the bot** -- Ban command removed: Discord already provides a Ban command with the same functionality EDIT: Ban reason correction cannot be done this way, so a implementation of the old ban command will come -- Free-Search for user tags has been disabled temporarily as not working properly with slash commands - -Boring Bug Fixes: -- Updated dependencies to new versions -- added failsafe to not demote own maintainer account -- Now using genrelized embed colors for easyer coding -- Better error handling with output in support server for devs to stop issues more quickly -- Blacklisting Bot ID from ban recording - -Planned for the Future: -- Hard mode: kick/ban everyone on global ban list; kick every unverified bot;... -- everything else \ No newline at end of file diff --git a/classes/banManager.js b/classes/banManager.js deleted file mode 100644 index f3e943f..0000000 --- a/classes/banManager.js +++ /dev/null @@ -1,68 +0,0 @@ -const { Guild, GuildBan } = require('discord.js'); - -const { Sequelize } = require('sequelize'); - -module.exports.BanManager = class BanManager { - /** - * @typedef {Object} ManagerData - * @property {Array} bans Array of bans - * @property {Sequelize} sequelize Sequelize instance - */ - /** - * @param {ManagerData} data Data to initialize the manager with - */ - constructor(data) { - if (Array.isArray(data.bans) === false) throw new SyntaxError('Invalid bans array'); - this.bans = data.bans; - if (!data.sequelize || data.sequelize instanceof Sequelize === false || !data.sequelize.models.Ban) throw new SyntaxError('Invalid Sequelize instance'); - this.sequelize = data.sequelize; - } - - /** - * @description Adds a ban to the manager - * @param {GuildBan} ban Ban to add to the manager - * @returns {Promise} Promise of the ban added - */ - addBan(ban) { - if (ban instanceof GuildBan === false) return Promise.reject(new SyntaxError('Invalid Ban instance')); - return Promise.resolve(this.bans.push(ban)); - } - - /** - * @description Adds multiple bans to the manager - * @param {Guild} guild Guild to add bans from - * @returns {Promise>} Array of bans added - */ - addGuildBans(guild) { - if (guild instanceof Guild === false) return Promise.reject(new SyntaxError('Invalid Guild instance')); - if (!guild.me.permissions.has('BAN_MEMBERS')) return Promise.reject(new SyntaxError('Missing BAN_MEMBERS in guild')); - return Promise.resolve(guild.bans.fetch().then((bans) => { - if (bans instanceof Collection === false) return this.addBan(bans.first()); - return Array.from(bans.values()).forEach((ban) => this.addBan(ban)); - })); - } - - /** - * @description Syncs the manager with the database, adding bans that don't exist in the database - * @returns {Promise>} Array of bans added - */ - sync() { - this.bans.forEach((ban) => { - if (ban.user.bot && ban.user.fetchFlags().then((f) => f.has('VERIFIED_BOT'))) return; // Ignore verified bots - this.sequelize.models.Ban.findOrCreate({ - where: { - serverID: ban.guild.id, - userID: ban.user.id, - reason: ban.reason, - }, - defaults: { - // userID: ban.user.id, - // serverID: ban.guild.id, - userTag: ban.user.tag, - // reason: ban.reason, - }, - }); - }) - .then(() => Promise.resolve(this.bans), (err) => Promise.reject(err)); - } -}; diff --git a/commands/about.js b/commands/about.js deleted file mode 100644 index 8cec434..0000000 --- a/commands/about.js +++ /dev/null @@ -1,16 +0,0 @@ -const fs = require('fs'); - -module.exports.run = async (interaction) => { - fs.readFile(config.commands.about.text, 'utf8', (err, body) => { - if (err) { - ERR(err); - messageFail(interaction, 'Something went wrong, try again another time!'); - return; - } - messageSuccess(interaction, body, null, true); - }); -}; - -module.exports.data = new CmdBuilder() - .setName('about') - .setDescription('Displays some information about the bot.'); diff --git a/commands/alias.js b/commands/alias.js deleted file mode 100644 index 5afa737..0000000 --- a/commands/alias.js +++ /dev/null @@ -1,62 +0,0 @@ -const UserAlias = require('../database/models/UserAlias'); - -function addAlias(userID, groupingID, addedBy) { - // const [output] = await UserAlias.findOrCreate({ - UserAlias.findOrCreate({ - where: { userID, groupingID }, - defaults: { addedBy }, - }).catch(ERR); - // return output; -} - -async function checkAlias(userID) { - const found = await UserAlias.findOne({ where: { userID } }) - .catch(ERR); - return found; -} - -module.exports.run = async (interaction) => { - // check permissions if user has teamrole - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id, 'staff', interaction.guild.id, interaction.member)) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - - const mainUser = interaction.options.getUser('mainuser').id; - const aliasUser = interaction.options.getUser('user2').id; - - // get entries for both IDs - const resultMainID = await checkAlias(mainUser); - const resultAliasID = await checkAlias(aliasUser); - // check if borth are already in aliases - if (resultMainID && resultAliasID) { - messageFail(interaction, 'Both users are already linked or in two different groupings!'); - return; - } - // add both if not found - if (!resultMainID && !resultAliasID) { - const groupingID = await interaction.id; - [mainUser, aliasUser].forEach((uID) => addAlias(uID, groupingID, interaction.user.id)); - messageSuccess(interaction, 'Entry added!'); - return; - } - // add mainUser if not found - if (!resultMainID && resultAliasID) { - addAlias(mainUser, resultAliasID.groupingID, interaction.user.id); - messageSuccess(interaction, 'Entry added!'); - return; - } - // add aliasUser if not found - if (resultMainID && !resultAliasID) { - console.log(resultAliasID); - addAlias(aliasUser, resultMainID.groupingID, interaction.user.id); - messageSuccess(interaction, 'Entry added!'); - return; - } -}; - -module.exports.data = new CmdBuilder() - .setName('alias') - .setDescription('Add an alias for secound accounts.') - .addUserOption((option) => option.setName('mainuser').setDescription('Provide the main user the person uses.').setRequired(true)) - .addUserOption((option) => option.setName('user2').setDescription('2. user').setRequired(true)); diff --git a/commands/archive/checkpermissions.js b/commands/archive/checkpermissions.js deleted file mode 100644 index 3f31846..0000000 --- a/commands/archive/checkpermissions.js +++ /dev/null @@ -1,4 +0,0 @@ -/* -A command to check if all the permissions are setup correctly. -It should take a server as a non reqiered argument -*/ diff --git a/commands/archive/lookup.js b/commands/archive/lookup.js deleted file mode 100644 index add3961..0000000 --- a/commands/archive/lookup.js +++ /dev/null @@ -1,217 +0,0 @@ -const { Op } = require('sequelize'); - -const { MessageEmbed } = require('discord.js'); - -const config = require('../../config/main.json'); - -const Ban = require('../../database/models/Ban'); - -const Warn = require('../../database/models/Warn'); - -const ParticipatingServer = require('../../database/models/ParticipatingServer'); - -const UserIDAssociation = require('../../database/models/UserIDAssociation'); - -// looksup usertag in list if recorded -async function checkTag(userTag) { - const found = await UserIDAssociation.findOne({ where: { userTag } }) - .catch(ERR); - return found; -} - -async function postUserinfo(message, userID, bans, warns) { - const embed = new MessageEmbed().setColor(message.member.displayColor); - let failed = false; - const discordUser = await client.users.fetch(userID, false) - .catch((err) => { - if (err.code === 10013) embed.setAuthor({ name: 'This user doesn\'t exist.' }); - else embed.setAuthor({ name: 'An error occurred!' }); - embed.addField('Stopcode', err.message); - failed = true; - return message.channel.send({ embed }); - }); - // get all server that the bot shares with the user - const sharedServers = await client.guilds.cache.filter((guild) => !!guild.member(discordUser)); - // post userinfo if no errors accour - if (!failed) { - let botBadge = ''; - if (discordUser.bot) botBadge = config.commands.lookup.botBadge; - embed - .addField('Usertag', `\`${discordUser.tag}\` ${botBadge}`) - .addField('ID', `\`${userID}\``) - .addField('Account Creation Date', discordUser.createdAt, true) - .setThumbnail(discordUser.displayAvatarURL({ format: 'png', dynamic: true, size: 1024 })); - if (bans) embed.addField('Bans', bans, true); - if (warns) embed.addField('Warns', warns, true); - if (sharedServers.size) embed.addField(`Shared servers - ${sharedServers.size}`, `\`\`\`${sharedServers.map((sharedMember) => sharedMember.name).join('\n')}\`\`\``, false); - return message.channel.send({ embed }); - } -} - -async function getBanns(userID) { - // adds a user to the Maintainer table - const found = await Ban.findAll({ where: { userID } }) - .catch(ERR); - return found; -} - -async function getWarns(userID) { - // adds a user to the Maintainer table - const found = await Warn.findAll({ where: { userID } }) - .catch(ERR); - return found; -} - -async function getServerName(serverID) { - // adds a user to the Maintainer table - const found = await ParticipatingServer.findOne({ where: { serverID } }) - .catch(ERR); - if (!found) return 'unknown server'; - return found.serverName; -} - -// final ban posting function -function postBans(message, banns) { - banns.forEach(async (ban) => { - const embed = new MessageEmbed() - .setDescription(`**Reason**:\n\`\`\`${ban.reason || 'None'}\`\`\``) - .addField('ServerID', `\`${ban.serverID}\``, true) - .addField('Is banned', `\`${ban.userBanned}\``, true) - .addField('BanID', `\`${ban.banID}\``, true) - .addField('Ban creation date', ban.createdAt, true) - .addField('Ban updated date', ban.updatedAt, true); - const serverName = await getServerName(ban.serverID); - // check if user is still banned - if (ban.userBanned) { - embed - .setColor('ORANGE') - .setAuthor({ name: `Banned on ${serverName}` }); - } else { - embed - .setColor('GREEN') - .setAuthor({ name: `Was banned on ${serverName}` }); - } - message.channel.send({ embed }); - }); -} - -// final warn posting function -function postWarns(message, warns) { - warns.forEach(async (warn) => { - const serverName = await getServerName(warn.serverID); - const embed = new MessageEmbed() - .setColor(16755456) // yellow - .setDescription(`**Reason**:\n\`\`\`${warn.reason || 'None'}\`\`\``) - .setAuthor({ name: `Warned on ${serverName}` }) - .addField('ServerID', `\`${warn.serverID}\``, true) - .addField('WarnID', `\`${warn.warnID}\``, true) - .addField('Warning creation date', warn.createdAt, true) - .addField('Warning updated date', warn.updatedAt, true); - message.channel.send({ embed }); - }); -} - -// prepares for bans and warnings from other servers -async function postInfractions(message, bans, warns) { - postBans(message, bans); - postWarns(message, warns); -} - -function getID(message, args) { - // check if mention is in content - if (message.mentions.members.first()) return message.mentions.members.first().id; - // get userID - const [userID] = args; - // check if id argument is present - if (!userID) return message.author.id; - // ckeck if content is not NaN - if (!isNaN(userID)) return userID; -} - -async function checkUserTag(uTag, IDArr) { - // adds a user to the Maintainer table - // FIXME: lowercase DB search - const results = await UserIDAssociation.findAll({ limit: 4, where: { userTag: { [Op.substring]: uTag } } }) - .catch(ERR); - if (!results) return; - results.forEach((result) => { - if (IDArr.includes(result.userID)) return; - IDArr.push(result.userID); - }); - return IDArr; -} - -async function postLookup(message, ID) { - const bans = await getBanns(ID); - const warns = await getWarns(ID); - await postUserinfo(message, ID, bans.length, warns.length); - await postInfractions(message, bans, warns); -} - -module.exports.run = async (message, args, config, prefix) => { - // check permissions if user has teamrole - if (!await client.functions.get('FUNC_checkPermissionsDB').run(message.author.id, 'staff', message.guild.id, message.member)) { - messageFail(message, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - - let IDArr = []; - const userID = getID(message, args); - if (userID) IDArr.push(userID); - else { - // parse username - const userTag = message.content.slice(prefix.length + module.exports.data.name.length + 1); - // check length - if (userTag.length < config.commands.lookup.lowerQuerryLimit) return messageFail(message, 'Your search querry must be at least 5 characters long.'); - // make DB search - await checkUserTag(userTag, IDArr); - } - // if no info is given, return author ID - if (IDArr.length === 0 && args.length === 0) IDArr.push(message.author.id); - if (IDArr.length === 0 && args.length !== 0) return messageFail(message, 'Couldn\'t find any results with your search querry.'); - - const orgID = IDArr[0]; - // check for aliases and overwrite array - if (IDArr.length === 1) { - const output = await client.functions.get('FUNC_checkAlias').run(IDArr[0]); - if (output) IDArr = output; - } - // only post the one that has the orginal user id - IDArr.forEach(async (ID) => { - if (ID === orgID) postLookup(message, ID); - }); - // if more then 1 entry in array... - if (IDArr.length !== 1) { - // ask if rest should be posted - const confirmMessage = await messageFail(message, `Show all (+${IDArr.length - 1}) results?`, true); - await confirmMessage.react('❌'); - await confirmMessage.react('✅'); - // start reaction collector - const filter = (reaction, user) => user.id === message.author.id; - const reactionCollector = confirmMessage.createReactionCollector(filter, { time: 10000 }); - reactionCollector.on('collect', async (reaction) => { - reactionCollector.stop(); - switch (reaction.emoji.name) { - case '❌': return; - case '✅': - // post bans - // post all besides orginal userID - IDArr.forEach(async (ID) => { - if (ID !== orgID) postLookup(message, ID); - }); - return; - default: - // wrong reaction - messageFail(message, 'Please only choose one of the two options! Try again.'); - return; - } - }); - reactionCollector.on('end', () => confirmMessage.delete()); - } -}; - -module.exports.data = new CmdBuilder() - .setName('lookup') - .setDescription('Uses the Discord API to lookup user information.') - .addUserOption((option) => option.setName('user').setDescription('Provide a user id or search from the drop down.')) - .addStringOption((option) => option.setName('search').setDescription('Search database for a user.')); diff --git a/commands/archive/punish-handler.js b/commands/archive/punish-handler.js deleted file mode 100644 index 730eada..0000000 --- a/commands/archive/punish-handler.js +++ /dev/null @@ -1,44 +0,0 @@ -// module.exports.run = async (message, args, config, prefix) => { -// // check permissions -// // check server settings (is punishing feature enabled?) -// // command handler for subcommands: manualAdd, manualRemove, stats, userStats (calls lookup), add, remove, list, listPunishments -// }; - -const ServerSetting = require('../../database/models/ServerSetting'); - -// prepares command usage message -function CommandUsage(prefix, cmdName, subcmd) { - return `Command usage: - \`\`\`/${cmdName} ${subcmd}\`\`\``; -} - -// check if server has feature enabled. -async function checkFeature(serverID) { - const found = await ServerSetting.findOne({ where: { serverID, pointsSystemEnabled: true } }) - .catch(ERR); - return found; -} - -// is used to configure settings -// if setting is not set, use default from config -module.exports.run = async (message, args, config, prefix) => { - // TODO: check permissions (Servermanager) - // check DM - if (message.channel.type === 'dm') return messageFail(message, 'This comamnd is for servers only.'); - // check if user is teammember - if (!message.member.roles.cache.find(({ id }) => id === config.teamRole)) return messageFail(message, `You are not authorized to use \`/${module.exports.data.name}\``); - const [subcmd] = args; - const commandValues = ['manualAdd', 'manualRemove', 'stats', 'userStats(callsLookup)', 'add', 'remove', 'list', 'listPunishments']; - const currentCMD = module.exports.help; - if (commandValues.toLowerCase().includes(subcmd)) { - if (subcmd === 'enable' || await checkFeature(message.guild.id)) { - client.functions.get(`CMD_${currentCMD.name}_${subcmd}`) - .run(message, args, config, prefix); - } else messageFail(message, `To use the comamnds, you need to enable the feature in this server first!\n${CommandUsage(prefix, currentCMD.name, 'enable true')}`); - } else messageFail(message, CommandUsage(prefix, currentCMD.name, commandValues.join('|'))); -}; - -module.exports.help = { - name: 'punish', - desc: 'Punishes a user.', -}; diff --git a/commands/archive/punishsettings-handler.js b/commands/archive/punishsettings-handler.js deleted file mode 100644 index cf31ee1..0000000 --- a/commands/archive/punishsettings-handler.js +++ /dev/null @@ -1,38 +0,0 @@ -const ServerSetting = require('../../database/models/ServerSetting'); - -// prepares command usage message -function CommandUsage(prefix, cmdName, subcmd) { - return `Command usage: - \`\`\`/${cmdName} ${subcmd}\`\`\``; -} - -// check if server has feature enabled. -async function checkFeature(serverID) { - const found = await ServerSetting.findOne({ where: { serverID, pointsSystemEnabled: true } }) - .catch(ERR); - return found; -} - -// is used to configure settings -// if setting is not set, use default from config -module.exports.run = async (message, args, config, prefix) => { - // TODO: check permissions (Servermanager) - // check DM - if (message.channel.type === 'dm') return messageFail(message, 'This comamnd is for servers only.'); - // check if user is teammember - if (!message.member.roles.cache.find(({ id }) => id === config.teamRole)) return messageFail(message, `You are not authorized to use \`/${module.exports.data.name}\``); - const [subcmd] = args; - const commandValues = ['enable', 'listSettings', 'forceReason', 'pointLifetime', 'listReasons', 'addReason', 'removeReason', 'listPunishment', 'addPunishment', 'removePunishment']; - const currentCMD = module.exports.help; - if (commandValues.toLowerCase().includes(subcmd)) { - if (subcmd === 'enable' || await checkFeature(message.guild.id)) { - client.functions.get(`CMD_${currentCMD.name}_${subcmd}`) - .run(message, args, config, prefix); - } else messageFail(message, `To use the comamnds, you need to enable the feature in this server first!\n${CommandUsage(prefix, currentCMD.name, 'enable true')}`); - } else messageFail(message, CommandUsage(prefix, currentCMD.name, commandValues.join('|'))); -}; - -module.exports.help = { - name: 'punishsettings', - desc: 'Managing command for setting up pointslists.', -}; diff --git a/commands/archive/unban.js b/commands/archive/unban.js deleted file mode 100644 index 2c06585..0000000 --- a/commands/archive/unban.js +++ /dev/null @@ -1,59 +0,0 @@ -// TODO: not yet completed beforehand - -// prepares command usage message -function CommandUsage(prefix, cmdName, subcmd) { - return `Command usage: - \`\`\`/${cmdName} ${subcmd}\`\`\``; -} - -module.exports.run = async (interaction) => { - // check permissions - if (!await client.functions.get('FUNC_checkPermissionsChannel').run(message.member, message, 'BAN_MEMBERS')) { - messageFail(message, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - // get args - const [userID, reasonTester] = args; - - // get member - const toBanMember = await message.guild.members.cache.get(userID); - // check if member is bannable - if (toBanMember) { - if (!toBanMember.bannable) { - messageFail(message, `The user \`${toBanMember.user.tag}\` can't be banned!\nHe owns the server, has higher permissions or is a system user!`); - return; - } - } - // check if user is already banned - const banList = await message.guild.fetchBans(); - const existingBan = await banList.find((ban) => ban.user.id === userID); - if (existingBan) { - // unbanning so reason gets updated - await message.guild.members.unban(userID); - // messageFail(message, `The user \`${toBanUser.tag}\` has been already banned!`); - // return; - } - // get complete reason - const slicedReason = await args.join(' ').slice(userID.length + 1); - // check ban reason length for discord max ban reason - if (slicedReason.length > 512) { - messageFail(message, 'Your ban reason is too long. Discord only allows a maximum length of 512 characters.'); - return; - } - // exec ban - const processedBanUser = await message.guild.members.ban(userID, { reason: slicedReason }); - // write confirmation - messageSuccess(message, `The user \`${processedBanUser.tag}\` has been banned!\nReason: \`${slicedReason}\``); -}; - -module.exports.help = { - name: 'unban', - usage: 'USERID REASON', - desc: '', -}; - -module.exports.data = new CmdBuilder() - .setName('unban') - .setDescription('Pardons a user by ID.') - .addUserOption((option) => option.setName('user').setDescription('Provide the user you wish to ban.').setRequired(true)) - .addStringOption((option) => option.setName('reason').setDescription('Reason for the server ban.').setRequired(true)); diff --git a/commands/avatar.js b/commands/avatar.js deleted file mode 100644 index 5504c6d..0000000 --- a/commands/avatar.js +++ /dev/null @@ -1,29 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -module.exports.run = async (interaction) => { - // needs to be local as settings overlap from dofferent embed-requests - const embedDefault = new MessageEmbed(); - const command = interaction.options; - // get user and ID - const rawUser = command.get('user', true); - const user = rawUser.user; - const member = rawUser.member; - const defaultPFP = user.displayAvatarURL({ format: 'png', dynamic: true, size: 4096 }); - embedDefault.setAuthor({ name: user.tag }) - .setImage(defaultPFP); - await reply(interaction, { embeds: [embedDefault] }); - - if (member && member.avatar) { - const embedServer = new MessageEmbed(); - const serverPFP = member.displayAvatarURL({ format: 'png', dynamic: true, size: 4096 }); - embedServer.setAuthor({ name: member.nickname }) - .setImage(serverPFP) - .setFooter({ text: 'Server profile picture' }); - interaction.followUp({ embeds: [embedServer] }); - } -}; - -module.exports.data = new CmdBuilder() - .setName('avatar') - .setDescription('Retrieves the profile picture of the provided user ID.') - .addUserOption((option) => option.setName('user').setDescription('Provide a user to get the avatar from.').setRequired(true)); diff --git a/commands/banner.js b/commands/banner.js deleted file mode 100644 index 11f6acf..0000000 --- a/commands/banner.js +++ /dev/null @@ -1,22 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -module.exports.run = async (interaction) => { - // needs to be local as settings overlap from dofferent embed-requests - const embed = new MessageEmbed(); - const command = interaction.options; - // get user and Pic - const user = command.getUser('user', true); - // need to be fetched so banner url can be generated - await user.fetch(true); - const pic = await user.bannerURL({ format: 'png', dynamic: true, size: 4096 }); - if (!pic) return messageFail(interaction, 'This user doesn\'t have a banner.'); - embed.setAuthor({ name: user.tag }); - embed.setImage(pic); - - reply(interaction, { embeds: [embed] }); -}; - -module.exports.data = new CmdBuilder() - .setName('banner') - .setDescription('Retrieves the banner of a users profile via user ID.') - .addUserOption((option) => option.setName('user').setDescription('Provide a user to get the bannner from.').setRequired(true)); diff --git a/commands/broadcast.js b/commands/broadcast.js deleted file mode 100644 index 691af10..0000000 --- a/commands/broadcast.js +++ /dev/null @@ -1,39 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -const ParticipatingServer = require('../database/models/ParticipatingServer'); - -function getChannels() { - return ParticipatingServer.findAll({ where: { active: true, blocked: false }, attributes: ['logChannelID'] }) - .catch(ERR); -} - -async function sendMessage(author, body) { - const channels = await getChannels(); - channels.forEach((DBchannel) => { - const channelID = DBchannel.logChannelID; - const channel = client.channels.cache.find((channel) => channel.id === channelID); - const embed = new MessageEmbed() - .setAuthor({ name: `${author} broadcasted` }) - .setDescription(body) - .setColor(4182379); - channel.send({ embeds: [embed] }); - }); -} - -module.exports.run = async (interaction) => { - // check maintainer permissions - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id)) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - const body = interaction.options.getString('message', true); - await messageSuccess(interaction, 'Sending messages...'); - await sendMessage(interaction.user.tag, body.replaceAll('\\n', ` - `)); - await messageSuccess(interaction, 'Sent messages to all servers!'); -}; - -module.exports.data = new CmdBuilder() - .setName('broadcast') - .setDescription('Broadcasts a message to all servers.') - .addStringOption((option) => option.setName('message').setDescription('Message that should be broadcasted').setRequired(true)); diff --git a/commands/changelog.js b/commands/changelog.js deleted file mode 100644 index 8122ea6..0000000 --- a/commands/changelog.js +++ /dev/null @@ -1,16 +0,0 @@ -const fs = require('fs'); - -module.exports.run = async (interaction) => { - fs.readFile(config.commands.changelog.text, 'utf8', (err, body) => { - if (err) { - ERR(err); - messageFail(interaction, 'Something went wrong, try again another time!'); - return; - } - messageSuccess(interaction, body, null, true); - }); -}; - -module.exports.data = new CmdBuilder() - .setName('changelog') - .setDescription('Displays information about the most recent bot changes and what\'s to come.'); diff --git a/commands/checkallusers.js b/commands/checkallusers.js deleted file mode 100644 index 6341d91..0000000 --- a/commands/checkallusers.js +++ /dev/null @@ -1,92 +0,0 @@ -const { MessageEmbed, MessageActionRow, MessageButton } = require('discord.js'); - -const ParticipatingServer = require('../database/models/ParticipatingServer'); - -const Ban = require('../database/models/Ban'); - -const buttons = new MessageActionRow() - .addComponents([ - new MessageButton() - .setCustomId('accept') - .setEmoji('✅') - .setLabel('Show \'em all') - .setStyle('PRIMARY'), - new MessageButton() - .setCustomId('deny') - .setEmoji('❌') - .setLabel('Abort') - .setStyle('SECONDARY'), - ]); - -async function getBanns(userID) { - const found = await Ban.findAll({ where: { userID } }).catch(ERR); - return found; -} - -// send message when user is banned -async function sendBanMessage(interaction, serverName, serverID, userID, userTag) { - const message = await new MessageEmbed() - .setDescription(`serverID: \`${serverID}\` - servername: \`${serverName}\` - userID: \`${userID}\` - username: \`${userTag}\``) - .setFooter({ text: `For more information use \`/lookup ${userID}\`` }) - .setColor('ORANGE'); - reply(interaction, { embeds: [message] }, true); -} - -async function getServerName(serverID) { - // adds a user to the Maintainer table - const found = await ParticipatingServer.findOne({ where: { serverID } }) - .catch(ERR); - if (!found) return 'unknown server'; - return found.serverName; -} - -async function postBans(allBans, interaction) { - await messageSuccess(interaction, 'Starting... Please note, because of Discords API limit, the messages take some time to process.'); - allBans.forEach(async (foundBan) => { - const serverID = foundBan.serverID; - sendBanMessage(interaction, await getServerName(serverID), serverID, foundBan.userID, foundBan.userTag); - }); -} - -module.exports.run = async (interaction) => { - // check MANAGE_GUILD permissions - if (!interaction.memberPermissions.has('MANAGE_GUILD')) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - - // get all userIDs - const users = await interaction.guild.members.fetch({ cache: false }); - const IDs = users.map((user) => user.id); - // get all user bans - const allBans = await getBanns(IDs); - if (allBans.length === 0) return messageSuccess(interaction, 'Your server is clear! No known users so far.'); - // check if up to 5 entries - if (allBans.length < 5) return postBans(allBans, interaction); - - const message = await new MessageEmbed() - .setDescription(`The bot is about to spam ${allBans.length} listed bans into this channel! This action can not be stopped midway through. \nAre you sure?`) - .setColor('ORANGE'); - const confirmMessage = await reply(interaction, { - embeds: [message], components: [buttons], fetchReply: true, ephemeral: true, - }); - - // start button collector - const filter = (i) => interaction.user.id === i.user.id; - const buttonCollector = confirmMessage.createMessageComponentCollector({ filter, time: 10000 }); - buttonCollector.on('collect', async (used) => { - buttonCollector.stop(); - if (used.customId === 'accept') return postBans(allBans, interaction); - return messageFail(interaction, 'Aborted!'); - }); - buttonCollector.on('end', async (collected) => { - if (collected.size === 0) messageFail(interaction, 'Your response took too long. Please run the command again.'); - }); -}; - -module.exports.data = new CmdBuilder() - .setName('checkallusers') - .setDescription('Checks all users in current server, if found on banlist.'); diff --git a/commands/eval.js b/commands/eval.js deleted file mode 100644 index 209055f..0000000 --- a/commands/eval.js +++ /dev/null @@ -1,31 +0,0 @@ -const clean = (text) => { - if (typeof (text) === 'string') { - Object.values(process.env).forEach((env) => { - if (env.length <= 3) return; - // eslint-disable-next-line no-param-reassign - text = text.replaceAll(env, '****NOPE****'); - }); - return text.replaceAll(/`/g, `\`${String.fromCharCode(8203)}`) - .replaceAll(/@/g, `@${String.fromCharCode(8203)}`); - } - return text; -}; - -module.exports.run = async (interaction) => { - // check owner permissions - if (interaction.user.id !== '172031697355800577') return messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``, null, false); - const code = interaction.options.getString('codeline', true); - try { - // eslint-disable-next-line no-eval - let evaled = eval(code); - - if (typeof evaled !== 'string') { evaled = require('util').inspect(evaled); } - - messageSuccess(interaction, `\`\`\`xl\n${clean(evaled)}\n\`\`\``, null, true); - } catch (err) { messageFail(interaction, `\`ERROR\` \`\`\`xl\n${clean(err)}\n\`\`\``); } -}; - -module.exports.data = new CmdBuilder() - .setName('eval') - .setDescription('Command used to run snippets of code. [OWNER ONLY].') - .addStringOption((option) => option.setName('codeline').setDescription('Commandline to execute').setRequired(true)); diff --git a/commands/guild.js b/commands/guild.js deleted file mode 100644 index 428dc71..0000000 --- a/commands/guild.js +++ /dev/null @@ -1,48 +0,0 @@ -const ParticipatingServer = require('../database/models/ParticipatingServer'); - -// check if server has feature enabled. -async function checkFeature(serverID) { - const found = await ParticipatingServer.findOne({ where: { serverID, active: true } }) - .catch(ERR); - return found; -} - -// is used to configure settings -// if setting is not set, use default from config -module.exports.run = async (interaction) => { - // check MANAGE_GUILD permissions - if (!interaction.memberPermissions.has('MANAGE_GUILD')) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - - const subName = interaction.options.getSubcommand(true); - if (subName === 'setup' || subName === 'enable' || await checkFeature(interaction.guild.id)) { - client.commands.get(`${module.exports.data.name}_${subName}`).run(interaction, ParticipatingServer); - } else messageFail(interaction, 'You can\'t use this command without setting up your server first!'); -}; - -module.exports.data = new CmdBuilder() - .setName('guild') - .setDescription('Config for setting up your server with the bot.') - .addSubcommand((SC) => SC - .setName('setup') - .setDescription('First time setup.') - .addChannelOption((option) => option - .setName('channel') - .setDescription('Provide a channel you want Agent Black to report to.') - .addChannelType(0) - .setRequired(true)) - .addRoleOption((option) => option - .setName('role') - .setDescription('Provide your teams role, so the bot know who to listen to.') - .setRequired(true))) - .addSubcommand((SC) => SC - .setName('stats') - .setDescription('View stats.')) - .addSubcommand((SC) => SC - .setName('enable') - .setDescription('Enable this guild.')) - .addSubcommand((SC) => SC - .setName('disable') - .setDescription('Disable this guild.')); diff --git a/commands/guild/disable.js b/commands/guild/disable.js deleted file mode 100644 index 9034ba1..0000000 --- a/commands/guild/disable.js +++ /dev/null @@ -1,23 +0,0 @@ -// removes a server from the ParticipatingServers table -async function removeServer(ParticipatingServer, serverID) { - const success = await ParticipatingServer.update( - { active: false }, - { where: { serverID, active: true } }, - ) - .catch(ERR); - return success[0]; -} - -module.exports.run = async (interaction, ParticipatingServer) => { - const serverID = interaction.guildId; - const serverRemoved = await removeServer(ParticipatingServer, serverID); - if (serverRemoved >= 1) { - messageSuccess(interaction, - `The server with the ID \`${serverID}\` got disabled from the participating Servers list.`); - } else { - messageFail(interaction, - `The server with the ID \`${serverID}\` couldn't be found of the list.`); - } -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/guild/enable.js b/commands/guild/enable.js deleted file mode 100644 index 50ab542..0000000 --- a/commands/guild/enable.js +++ /dev/null @@ -1,33 +0,0 @@ -// enables guild in ParticipatingServers table -async function enableServer(ParticipatingServer, serverID) { - const success = await ParticipatingServer.update( - { active: true }, - { where: { serverID, active: false, blocked: false } }, - ) - .catch(ERR); - return success[0]; -} - -// check if server has feature enabled. -async function checkData(ParticipatingServer, serverID) { - const found = await ParticipatingServer.findOne({ - where: { serverID }, - attributes: ['logChannelID', 'teamRoleID'], - }).catch(ERR); - return found; -} - -module.exports.run = async (interaction, ParticipatingServer) => { - const serverID = interaction.guildId; - if (!await checkData(ParticipatingServer, serverID)) return messageFail(interaction, 'You can\'t use this command without setting up your server first!'); - const serverRemoved = await enableServer(ParticipatingServer, serverID); - if (serverRemoved >= 1) { - messageSuccess(interaction, - `The server with the ID \`${serverID}\` got re-enabled in the participating Servers list.`); - } else { - messageFail(interaction, - `The server with the ID \`${serverID}\` couldn't be found of the list or is already active.`); - } -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/guild/setup.js b/commands/guild/setup.js deleted file mode 100644 index f6542e1..0000000 --- a/commands/guild/setup.js +++ /dev/null @@ -1,72 +0,0 @@ -const { MessageEmbed, MessageActionRow, MessageButton } = require('discord.js'); - -const buttons = new MessageActionRow() - .addComponents([ - new MessageButton() - .setCustomId('accept') - .setEmoji('✅') - .setLabel('Accept') - .setStyle('PRIMARY'), - new MessageButton() - .setCustomId('deny') - .setEmoji('❌') - .setLabel('Deny') - .setStyle('SECONDARY'), - new MessageButton() - .setLabel('ToS') - .setURL('https://github.com/FlippedCode/agent-black/wiki/ToS-and-Privacy-Policy') - .setStyle('LINK'), - ]); - -// adds a server to the ParticipatingServers table -async function addServer(ParticipatingServer, serverID, logChannelID, teamRoleID, serverName) { - await ParticipatingServer.destroy({ limit: 1, where: { serverID, active: false } }); - const added = await ParticipatingServer.findOrCreate( - { - where: { serverID }, - defaults: { - logChannelID, teamRoleID, serverName, active: true, - }, - }, - ).catch(ERR); - const created = await added[1]; - return created; -} - -module.exports.run = async (interaction, ParticipatingServer) => { - const message = await new MessageEmbed() - .setDescription('Please confirm that you have read the ToS and Privacy Policy.') - .setColor('ORANGE'); - const confirmMessage = await reply(interaction, { - embeds: [message], components: [buttons], fetchReply: true, ephemeral: true, - }); - // start button collector - const filter = (i) => interaction.user.id === i.user.id; - const buttonCollector = confirmMessage.createMessageComponentCollector({ filter, time: 10000 }); - buttonCollector.on('collect', async (used) => { - buttonCollector.stop(); - if (used.customId === 'accept') { - // confirm - const logChannelID = interaction.options.getChannel('channel', true).id; - const teamRoleID = interaction.options.getRole('role', true).id; - const serverName = interaction.guild.name; - const serverID = interaction.guild.id; - const serverAdded = await addServer(ParticipatingServer, serverID, logChannelID, teamRoleID, serverName); - // post outcome - if (serverAdded) { - messageSuccess(interaction, - `\`${serverName}\` with the ID \`${serverID}\` got added to / updated in the participating Servers list.\nYou can now use all the other commands in this server.\nConsider running \`/checkallusers\` in your log channel once.`); - } else { - messageFail(interaction, - `An active server entry for \`${serverName}\` with the ID \`${serverID}\` already exists! If you want to change info, remove it first with \`/${interaction.commandName} disable\``); - } - return; - } - return messageFail(interaction, 'The bot setup cannot be continued without accepting the ToS. Please run the command again.'); - }); - buttonCollector.on('end', async (collected) => { - if (collected.size === 0) messageFail(interaction, 'Your response took too long. Please run the command again.'); - }); -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/guild/stats.js b/commands/guild/stats.js deleted file mode 100644 index f779219..0000000 --- a/commands/guild/stats.js +++ /dev/null @@ -1,35 +0,0 @@ -const Ban = require('../../database/models/Ban'); - -// finds a server in the ParticipatingServers table -async function findServer(ParticipatingServer, serverID) { - const found = await ParticipatingServer.findOne({ where: { serverID } }) - .catch(ERR); - return found; -} - -async function getBanCount(serverID) { - const result = await Ban.findAndCountAll({ where: { serverID } }); - return result.count; -} - -module.exports.run = async (interaction, ParticipatingServer) => { - // get entry - const serverFound = await findServer(ParticipatingServer, interaction.guildId); - // if entry is found - if (serverFound) { - let content = ` - Servername: \`${serverFound.serverName}\` - Server ID: \`${serverFound.serverID}\` - Log Channel: <#${serverFound.logChannelID}> (\`${serverFound.logChannelID}\`) - Team Role ID: \`${serverFound.teamRoleID}\` - Submitted Bans: \`${await getBanCount(serverFound.serverID)}\` - Is server apart of Association: \`${serverFound.active}\``; - if (serverFound.active) content += `\nParticipating Server since \`${serverFound.updatedAt}\``; - messageSuccess(interaction, content); - } else { - messageFail(interaction, - `The server with the ID \`${serverID}\` couldn't be found.`); - } -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/guildmgr.js b/commands/guildmgr.js deleted file mode 100644 index adbc7b0..0000000 --- a/commands/guildmgr.js +++ /dev/null @@ -1,58 +0,0 @@ -const ParticipatingServer = require('../database/models/ParticipatingServer'); - -module.exports.run = async (interaction) => { - // check maintainer permissions - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id)) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - const subName = interaction.options.getSubcommand(true); - const serverID = interaction.options.getString('server'); - client.commands.get(`${module.exports.data.name}_${subName}`).run(interaction, ParticipatingServer, serverID); -}; - -module.exports.data = new CmdBuilder() - .setName('guildmgr') - .setDescription('Manages guilds. [MAINTAINER ONLY]') - .addSubcommand((SC) => SC - .setName('add') - .setDescription('Add guild. [MAINTAINER ONLY]') - .addStringOption((option) => option - .setName('server') - .setDescription('Provide a guild ID you want to edit.') - .setAutocomplete(true) - .setRequired(true)) - .addStringOption((option) => option - .setName('channel') - .setDescription('Provide a channel you want Agent Black to report to.') - .setAutocomplete(true) - .setRequired(true)) - .addStringOption((option) => option - .setName('role') - .setDescription('Provide your teams role, so the bot know who to listen to.') - .setAutocomplete(true) - .setRequired(true))) - .addSubcommand((SC) => SC - .setName('info') - .setDescription('Disply info about a guild. [MAINTAINER ONLY]') - .addStringOption((option) => option - .setName('server') - .setDescription('Provide a guild ID you want to edit.') - .setAutocomplete(true) - .setRequired(true))) - .addSubcommand((SC) => SC - .setName('remove') - .setDescription('Remove guild. [MAINTAINER ONLY]') - .addStringOption((option) => option - .setName('server') - .setDescription('Provide a guild ID you want to edit.') - .setAutocomplete(true) - .setRequired(true))) - .addSubcommand((SC) => SC - .setName('block') - .setDescription('Block guild. [MAINTAINER ONLY]') - .addStringOption((option) => option - .setName('server') - .setDescription('Provide a guild ID you want to edit.') - .setAutocomplete(true) - .setRequired(true))); diff --git a/commands/guildmgr/add.js b/commands/guildmgr/add.js deleted file mode 100644 index d6bb1bd..0000000 --- a/commands/guildmgr/add.js +++ /dev/null @@ -1,32 +0,0 @@ -async function addServer(ParticipatingServer, serverID, logChannelID, teamRoleID, serverName) { - await ParticipatingServer.destroy({ limit: 1, where: { serverID, active: false } }); - const added = await ParticipatingServer.findOrCreate( - { - where: { serverID }, - defaults: { - logChannelID, teamRoleID, serverName, active: true, - }, - }, - ).catch(ERR); - const created = await added[1]; - return created; -} - -module.exports.run = async (interaction, ParticipatingServer, serverID) => { - // FIXME: no valid check of provided IDs - const logChannelID = interaction.options.getString('channel', true); - const teamRoleID = interaction.options.getString('role', true); - const serverName = await interaction.client.guilds.cache.find((guild) => guild.id === serverID).name; - // add server - const serverAdded = await addServer(ParticipatingServer, serverID, logChannelID, teamRoleID, serverName); - // post outcome - if (serverAdded) { - messageSuccess(interaction, - `\`${serverName}\` with the ID \`${serverID}\` got added to / updated for the participating Servers list and marked as active.`); - } else { - messageFail(interaction, - `An active server entry for \`${serverName}\` with the ID \`${serverID}\` already exists! If you want to change info, remove it first.`); - } -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/guildmgr/block.js b/commands/guildmgr/block.js deleted file mode 100644 index 9b5e88a..0000000 --- a/commands/guildmgr/block.js +++ /dev/null @@ -1,17 +0,0 @@ -async function blacklistServer(ParticipatingServer, serverID) { - const success = await ParticipatingServer.update({ blocked: true }, { where: { serverID } }).catch(ERR); - return success[0]; -} - -module.exports.run = async (interaction, ParticipatingServer, serverID) => { - const serverBlocked = await blacklistServer(ParticipatingServer, serverID); - if (serverBlocked >= 1) { - messageSuccess(interaction, - `The server with the ID \`${serverID}\` got blocked from using the bot.`); - } else { - messageFail(interaction, - `The server with the ID \`${serverID}\` couldn't be found of the list.`); - } -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/guildmgr/info.js b/commands/guildmgr/info.js deleted file mode 100644 index fadb10f..0000000 --- a/commands/guildmgr/info.js +++ /dev/null @@ -1,33 +0,0 @@ -const Ban = require('../../database/models/Ban'); - -// finds a server in the ParticipatingServers table -async function findServer(ParticipatingServer, serverID) { - const found = await ParticipatingServer.findOne({ where: { serverID } }) - .catch(ERR); - return found; -} - -async function getBanCount(serverID) { - const result = await Ban.findAndCountAll({ where: { serverID } }); - return result.count; -} - -module.exports.run = async (interaction, ParticipatingServer, serverID) => { - const serverFound = await findServer(ParticipatingServer, serverID); - if (serverFound) { - let content = ` - Servername: \`${serverFound.serverName}\` - Server ID: \`${serverFound.serverID}\` - Log Channel: <#${serverFound.logChannelID}> (\`${serverFound.logChannelID}\`) - Team Role ID: \`${serverFound.teamRoleID}\` - Submitted Bans: \`${await getBanCount(serverID)}\` - Is server apart of Association: \`${serverFound.active}\``; - if (serverFound.active) content += `\nParticipating Server since \`${serverFound.updatedAt}\``; - messageSuccess(interaction, content); - } else { - messageFail(interaction, - `The server with the ID \`${serverID}\` couldn't be found in the list.`); - } -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/guildmgr/remove.js b/commands/guildmgr/remove.js deleted file mode 100644 index 45787b2..0000000 --- a/commands/guildmgr/remove.js +++ /dev/null @@ -1,19 +0,0 @@ -async function removeServer(ParticipatingServer, serverID) { - const success = await ParticipatingServer.update({ active: false }, - { where: { serverID, active: true } }) - .catch(ERR); - return success[0]; -} - -module.exports.run = async (interaction, ParticipatingServer, serverID) => { - const serverRemoved = await removeServer(ParticipatingServer, serverID); - if (serverRemoved >= 1) { - messageSuccess(interaction, - `The server with the ID \`${serverID}\` got disabled from the participating Servers list.`); - } else { - messageFail(interaction, - `The server with the ID \`${serverID}\` couldn't be found of the list.`); - } -}; - -module.exports.data = { subcommand: true }; diff --git a/commands/help.js b/commands/help.js deleted file mode 100644 index e386863..0000000 --- a/commands/help.js +++ /dev/null @@ -1,16 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -module.exports.run = async (interaction) => { - const embed = new MessageEmbed() - .setTitle('Halp') - .setColor(interaction.member.displayColor) - .setDescription('This command is deprecated, please use discord embedded slash-commands feature instead.') - .addField('Still need help?', ` - Read the wiki here: https://github.com/FlippedCode/agent-black/wiki - or join our server here: https://discord.gg/TqBwHtzzhD`); - return reply(interaction, { embeds: [embed] }); -}; - -module.exports.data = new CmdBuilder() - .setName('help') - .setDescription('Shows a list of commands. [Deprecated]'); diff --git a/commands/lookup.js b/commands/lookup.js deleted file mode 100644 index d19bbc2..0000000 --- a/commands/lookup.js +++ /dev/null @@ -1,234 +0,0 @@ -const { Op } = require('sequelize'); - -const { MessageEmbed, MessageActionRow, MessageButton } = require('discord.js'); - -const Ban = require('../database/models/Ban'); - -const Warn = require('../database/models/Warn'); - -const ParticipatingServer = require('../database/models/ParticipatingServer'); - -const UserIDAssociation = require('../database/models/UserIDAssociation'); - -const buttons = new MessageActionRow() - .addComponents([ - new MessageButton() - .setCustomId('show') - .setEmoji('✅') - .setLabel('Show all users') - .setStyle('PRIMARY'), - new MessageButton() - .setCustomId('dontshow') - .setEmoji('❌') - .setLabel('Nah, im good') - .setStyle('SECONDARY'), - ]); - -// looksup usertag in list if recorded -async function checkTag(userTag) { - const found = await UserIDAssociation.findOne({ where: { userTag } }) - .catch(ERR); - return found; -} - -async function postUserinfo(interaction, userID, bans, warns, followUp = false) { - const embed = new MessageEmbed().setColor(interaction.member.displayColor); - const discordUser = await client.users.fetch(userID, false); - // get all server that the bot shares with the user - const sharedServers = await client.guilds.cache.filter((guild) => !!guild.members.cache.get(discordUser.id)); - // There seems to be a bug on the discord api that doesnt allow intigers in body: 'RangeError [EMBED_FIELD_NAME]: MessageEmbed field names must be non-empty strings.' So a convertion needed to be done - embed - .addField('Usertag', `\`${discordUser.tag}\` ${discordUser.bot ? config.commands.lookup.botBadge : ''}`) - .addField('ID', `\`${userID}\``) - .addField('Account Creation Date', date(discordUser.createdAt), true) - .setThumbnail(discordUser.displayAvatarURL({ format: 'png', dynamic: true, size: 1024 })); - if (bans) embed.addField('Bans', `${bans}`, true); - if (warns) embed.addField('Warns', `${warns}`, true); - if (sharedServers.size) { - // FIXME: check if it really only shows one server - const serverlist = sharedServers.map((sharedMember) => sharedMember.name).join('\n'); - const cutServerlist = serverlist.length > 1024 ? `${serverlist.slice(0, 1021)}...` : serverlist; - let serverList = `\`\`\`${cutServerlist}\`\`\``; - // hide serverlist for bot if not maintainer - if (userID === client.user.id) { - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id)) serverList = 'REDACTED'; - } - embed.addField(`Shared servers - ${sharedServers.size}`, serverList, false); - } - return reply(interaction, { embeds: [embed] }, followUp); - // } -} - -async function getBanns(userID) { - // adds a user to the Maintainer table - const found = await Ban.findAll({ where: { userID } }) - .catch(ERR); - return found; -} - -async function getWarns(userID) { - // adds a user to the Maintainer table - const found = await Warn.findAll({ where: { userID } }) - .catch(ERR); - return found; -} - -async function getServerName(serverID) { - // adds a user to the Maintainer table - const found = await ParticipatingServer.findOne({ where: { serverID } }) - .catch(ERR); - if (!found) return 'unknown server'; - return found.serverName; -} - -// final ban posting function -function postBans(interaction, banns) { - banns.forEach(async (ban) => { - const embed = new MessageEmbed() - .setDescription(`**Reason**:\n\`\`\`${ban.reason || 'None'}\`\`\``) - .addField('ServerID', `\`${ban.serverID}\``, true) - .addField('Is banned', `\`${ban.userBanned}\``, true) - .addField('BanID', `\`${ban.banID}\``, true) - .addField('Ban creation date', date(ban.createdAt)); - if (date(ban.createdAt) !== date(ban.updatedAt)) embed.addField('Ban updated date', date(ban.updatedAt)); - const serverName = await getServerName(ban.serverID); - // check if user is still banned - if (ban.userBanned) { - embed - .setColor('ORANGE') // orange - .setAuthor({ name: `Banned on ${serverName}` }); - } else { - embed - .setColor('GREEN') // green - .setAuthor({ name: `Was banned on ${serverName}` }); - } - reply(interaction, { embeds: [embed] }, true); - }); -} - -// final warn posting function -function postWarns(interaction, warns) { - warns.forEach(async (warn) => { - const serverName = await getServerName(warn.serverID); - const embed = new MessageEmbed() - .setColor(16755456) // yellow - .setDescription(`**Reason**:\n\`\`\`${warn.reason || 'None'}\`\`\``) - .setAuthor({ name: `Warned on ${serverName}` }) - .addField('ServerID', `\`${warn.serverID}\``, true) - .addField('WarnID', `\`${warn.warnID}\``, true) - .addField('Warning creation date', date(warn.createdAt)); - if (date(warn.createdAt) !== date(warn.updatedAt)) embed.addField('Warning updated date', date(warn.updatedAt)); - reply(interaction, { embeds: [embed] }, true); - }); -} - -// prepares for bans and warnings from other servers -async function postInfractions(interaction, bans, warns) { - postBans(interaction, bans); - postWarns(interaction, warns); -} - -// function getID(interaction, args) { -// // check if mention is in content -// if (interaction.mentions.members.first()) return interaction.mentions.members.first().id; -// // get userID -// const [userID] = args; -// // check if id argument is present -// if (!userID) return interaction.author.id; -// // ckeck if content is not NaN -// if (!isNaN(userID)) return userID; -// } - -async function checkUserTag(uTag, IDArr) { - // adds a user to the Maintainer table - // FIXME: lowercase DB search - const results = await UserIDAssociation.findAll({ limit: 4, where: { userTag: { [Op.substring]: uTag } } }) - .catch(ERR); - if (!results) return; - results.forEach((result) => { - if (IDArr.includes(result.userID)) return; - IDArr.push(result.userID); - }); - return IDArr; -} - -async function postLookup(interaction, ID, followUp) { - const bans = await getBanns(ID); - const warns = await getWarns(ID); - await postUserinfo(interaction, ID, bans.length, warns.length, followUp); - await postInfractions(interaction, bans, warns); -} - -async function showAdditionalUsers(interaction, IDArr, orgID) { - const message = await new MessageEmbed() - .setDescription(`Show all (+${IDArr.length - 1}) results?`) - .setColor('ORANGE'); - const confirmMessage = await reply(interaction, { - embeds: [message], components: [buttons], fetchReply: true, - }); - // start button collector - const filter = (i) => interaction.user.id === i.user.id; - const buttonCollector = confirmMessage.createMessageComponentCollector({ filter, time: 20000 }); - buttonCollector.on('collect', async (used) => { - buttonCollector.stop(); - if (used.customId === 'show') { - // post all bans besides orginal userID - // FIXME: bad implementation of a array filter - IDArr.forEach(async (ID) => { - if (ID !== orgID) postLookup(interaction, ID, true); - }); - } - message.setFooter({ text: `Answered with '${used.component.label}'` }); - confirmMessage.edit({ embeds: [message], components: [] }); - }); - buttonCollector.on('end', async (collected) => { - if (collected.size !== 0) return; - message.setFooter({ text: 'Your response took too long. Please run the command again.' }); - confirmMessage.edit({ embeds: [message], components: [] }); - }); -} - -module.exports.run = async (interaction) => { - // check permissions if user has teamrole - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id, 'staff', interaction.guild.id, interaction.member)) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); - return; - } - - const requestedUser = interaction.options.getUser('user'); - let IDArr = [requestedUser.id]; - // if (userID) IDArr.push(userID); - // else { - // // parse username - // const userTag = message.content.slice(prefix.length + module.exports.data.name.length + 1); - // // check length - // if (userTag.length < config.commands.lookup.lowerQuerryLimit) return messageFail(message, 'Your search querry must be at least 5 characters long.'); - // // make DB search - // await checkUserTag(userTag, IDArr); - // } - - // DEPRECATED: if no info is given, return author ID - // if (IDArr.length === 0 && args.length === 0) IDArr.push(message.author.id); - // if (IDArr.length === 0 && args.length !== 0) return messageFail(message, 'Couldn\'t find any results with your search querry.'); - - const orgID = IDArr[0]; - // check for aliases and overwrite array - // if not needed of upper code is DEPRECATED: - if (IDArr.length === 1) { - const output = await client.functions.get('GET_DB_alias').run(IDArr[0]); - if (output) IDArr = output; - } - - const multipleAccounts = IDArr.length !== 1; - if (multipleAccounts) await showAdditionalUsers(interaction, IDArr, orgID); - // only post the one that has the orginal user id - // FIXME: bad implementation of a array filter - IDArr.forEach(async (ID, i) => { - if (ID === orgID) postLookup(interaction, ID, multipleAccounts); - }); -}; - -module.exports.data = new CmdBuilder() - .setName('lookup') - .setDescription('Uses the Discord API and ABB database to look up user information.') - .addUserOption((option) => option.setName('user').setDescription('Provide a user or a user id.').setRequired(true)); diff --git a/config.json b/config.json deleted file mode 100644 index 553d909..0000000 --- a/config.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "Agent Black", - "teamRole": "638670637052854282", - "logChannel": "638793508202741790", - "setup": { - "setupFunctions": [ - "SETUP_heartbeat", - "SETUP_offlineStat", - "SETUP_status" - ] - }, - "commands": { - "lookup": { - "lowerQuerryLimit": 5, - "botBadge": "<:system_bot_notifier:813101401646432298>" - }, - "about": { - "text": "./about.txt" - }, - "changelog": { - "text": "./changelog.txt" - } - }, - "functions": { - "userTagRecord": { - "maxCacheTimeout": 10800000 - }, - "heartbeat": { - "uptime": { - "interval": 50000, - "endpoint": "http://statuspage_app_sp_1:3001/api/push/" - } - } - } -} \ No newline at end of file diff --git a/config/main.json b/config/main.json deleted file mode 100644 index bd8a0c8..0000000 --- a/config/main.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Agent Black", - "prefix": { - "default": "a!", - "nicknameSpacer": " | " - }, - "setup": { - "moduleFolders": { - "functionsFolder": "functions", - "commandsFolder": "commands" - }, - "startupFunctions": [ - "STARTUP_initCommands", - "STARTUP_initFunctions", - "STARTUP_envPrep", - "STARTUP_DBConnection" - ], - "setupFunctions": [ - "SETUP_offlineStat", - "SETUP_status" - ], - "setupFunctionsOnce": [ - "TCKR_offlineStat" - ] - }, - "commands": { - "lookup": { - "lowerQuerryLimit": 5 - } - }, - "functions": { - "userTagRecord": { - "maxCacheTimeout": 10800000 - } - }, - "emojiLayout": "/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32-\ude3a]|[\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g", - "aboutText": "./config/about.txt", - "teamRole": "638670637052854282", - "logStatusChannel": "638793508202741790", - "lookupBotBadge": "<:system_bot_notifier:813101401646432298>" -} \ No newline at end of file diff --git a/database/models/Ban.js b/database/models/Ban.js deleted file mode 100644 index 9e9d83e..0000000 --- a/database/models/Ban.js +++ /dev/null @@ -1,27 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('Ban', { - banID: { - type: Sequelize.INTEGER(11), - primaryKey: true, - autoIncrement: true, - }, - userID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - serverID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - userTag: Sequelize.TEXT('tiny'), - reason: Sequelize.TEXT, - userBanned: Sequelize.BOOLEAN, -}, -{ - uniqueKeys: { - banUnique: { - fields: ['userID', 'serverID'], - }, - }, -}); diff --git a/database/models/Maintainer.js b/database/models/Maintainer.js deleted file mode 100644 index 5e0b343..0000000 --- a/database/models/Maintainer.js +++ /dev/null @@ -1,9 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('Maintainer', { - userID: { - type: Sequelize.STRING(30), - primaryKey: true, - unique: true, - }, -}); diff --git a/database/models/OfflineStat.js b/database/models/OfflineStat.js deleted file mode 100644 index c1017d5..0000000 --- a/database/models/OfflineStat.js +++ /dev/null @@ -1,9 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('OfflineStat', { - ID: { - type: Sequelize.STRING(30), - primaryKey: true, - }, - time: Sequelize.STRING(30), -}); diff --git a/database/models/ParticipatingServer.js b/database/models/ParticipatingServer.js deleted file mode 100644 index 578287f..0000000 --- a/database/models/ParticipatingServer.js +++ /dev/null @@ -1,25 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('ParticipatingServer', { - serverID: { - type: Sequelize.STRING(30), - primaryKey: true, - unique: true, - }, - logChannelID: Sequelize.STRING(30), - teamRoleID: Sequelize.STRING(30), - serverName: { - type: Sequelize.TEXT('tiny'), - allowNull: false, - }, - active: { - type: Sequelize.BOOLEAN, - allowNull: false, - defaultValue: false, - }, - blocked: { - type: Sequelize.BOOLEAN, - allowNull: false, - defaultValue: false, - }, -}); diff --git a/database/models/PointList.js b/database/models/PointList.js deleted file mode 100644 index 526eeb8..0000000 --- a/database/models/PointList.js +++ /dev/null @@ -1,21 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('PointList', { - ID: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - }, - name: { - type: Sequelize.TEXT('tiny'), - allowNull: false, - }, - description: { - type: Sequelize.TEXT, - allowNull: false, - }, - points: { - type: Sequelize.INTEGER, - allowNull: false, - }, -}); diff --git a/database/models/PunishmentLevel.js b/database/models/PunishmentLevel.js deleted file mode 100644 index 9255753..0000000 --- a/database/models/PunishmentLevel.js +++ /dev/null @@ -1,17 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('PunishmentLevel', { - ID: { - type: Sequelize.INTEGER, - primaryKey: true, - }, - name: { - type: Sequelize.TEXT('tiny'), - allowNull: false, - }, - command: { - type: Sequelize.TEXT('tiny'), - allowNull: false, - }, - amount: Sequelize.INTEGER, -}); diff --git a/database/models/ServerSetting.js b/database/models/ServerSetting.js deleted file mode 100644 index 5a2f74b..0000000 --- a/database/models/ServerSetting.js +++ /dev/null @@ -1,23 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('ServerSetting', { - serverID: { - type: Sequelize.STRING(30), - primaryKey: true, - }, - pointsSystemEnabled: { - type: Sequelize.BOOLEAN, - allowNull: false, - defaultValue: false, - }, - pointsSystemForceReason: { - type: Sequelize.BOOLEAN, - allowNull: false, - defaultValue: true, - }, - pointLifetime: { - type: Sequelize.STRING(30), - allowNull: false, - defaultValue: 1210000000, - }, -}); diff --git a/database/models/UserAlias.js b/database/models/UserAlias.js deleted file mode 100644 index 5f65e6a..0000000 --- a/database/models/UserAlias.js +++ /dev/null @@ -1,21 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('UserAlias', { - aliasID: { - type: Sequelize.INTEGER(11), - primaryKey: true, - autoIncrement: true, - }, - groupingID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - userID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - addedBy: { - type: Sequelize.STRING(30), - allowNull: false, - }, -}); diff --git a/database/models/UserIDAssociation.js b/database/models/UserIDAssociation.js deleted file mode 100644 index 8c804ba..0000000 --- a/database/models/UserIDAssociation.js +++ /dev/null @@ -1,24 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('UserIDAssociation', { - ID: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - }, - userID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - userTag: { - type: Sequelize.TEXT('tiny'), - allowNull: false, - }, -// }, -// { -// uniqueKeys: { -// uniqueUserTagID: { -// fields: ['userTag', 'userID'], -// }, -// }, -}); diff --git a/database/models/UserPoint.js b/database/models/UserPoint.js deleted file mode 100644 index 47c2971..0000000 --- a/database/models/UserPoint.js +++ /dev/null @@ -1,28 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('UserPoint', { - ID: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - }, - pointsID: { - type: Sequelize.INTEGER, - references: { - model: 'PointsList', - key: 'ID', - }, - }, - userID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - teamMember: { - type: Sequelize.STRING(30), - allowNull: false, - }, - note: { - type: Sequelize.TEXT, - allowNull: false, - }, -}); diff --git a/database/models/UserPunnishmentTicker.js b/database/models/UserPunnishmentTicker.js deleted file mode 100644 index a02eb4f..0000000 --- a/database/models/UserPunnishmentTicker.js +++ /dev/null @@ -1,25 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('UserPunishmentTicker', { - ID: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - }, - punishmentID: { - type: Sequelize.INTEGER, - allowNull: false, - references: { - model: 'PunishmentLevels', - key: 'ID', - }, - }, - userID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - amountLeft: { - type: Sequelize.INTEGER, - allowNull: false, - }, -}); diff --git a/database/models/Warn.js b/database/models/Warn.js deleted file mode 100644 index a283005..0000000 --- a/database/models/Warn.js +++ /dev/null @@ -1,21 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('Warn', { - warnID: { - type: Sequelize.INTEGER(11), - primaryKey: true, - autoIncrement: true, - }, - userID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - serverID: { - type: Sequelize.STRING(30), - allowNull: false, - }, - reason: { - type: Sequelize.TEXT, - allowNull: false, - }, -}); diff --git a/database/models/discardDeprecationWarning.js b/database/models/discardDeprecationWarning.js deleted file mode 100644 index bcf1f9f..0000000 --- a/database/models/discardDeprecationWarning.js +++ /dev/null @@ -1,8 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports = sequelize.define('discardDeprecationWarning', { - userID: { - type: Sequelize.STRING(30), - primaryKey: true, - }, -}); diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..3947358 --- /dev/null +++ b/deno.json @@ -0,0 +1,15 @@ +{ + "lock": true, + "imports": { + "axios": "npm:axios@1.4.0", + "bufferutil": "npm:bufferutil@4.0.7", + "bunyan": "npm:bunyan@1.8.15", + "discord.js": "npm:discord.js@14.11.1-dev.1686398626-6c2242f.0", + "html-to-image": "npm:html-to-image@1.11.11", + "mysql2": "npm:mysql2@3.3.1", + "pretty-ms": "npm:pretty-ms@8.0.0", + "sequelize": "npm:sequelize@6.31.1", + "utf-8-validate": "npm:utf-8-validate@6.0.3" + }, + "nodeModulesDir": true +} \ No newline at end of file diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..149aff1 --- /dev/null +++ b/deno.lock @@ -0,0 +1,2182 @@ +{ + "version": "2", + "remote": {}, + "npm": { + "specifiers": { + "@types/bunyan@1.8.8": "@types/bunyan@1.8.8", + "@types/node": "@types/node@18.11.18", + "@types/node@20.2.5": "@types/node@20.2.5", + "@typescript-eslint/eslint-plugin@5.59.6": "@typescript-eslint/eslint-plugin@5.59.6_@typescript-eslint+parser@5.59.6__eslint@8.40.0_eslint@8.40.0", + "@typescript-eslint/parser@5.59.6": "@typescript-eslint/parser@5.59.6_eslint@8.40.0", + "axios@1.4.0": "axios@1.4.0", + "bufferutil@4.0.7": "bufferutil@4.0.7", + "bunyan@1.8.15": "bunyan@1.8.15", + "discord.js@14.11.0": "discord.js@14.11.0", + "discord.js@14.11.1-dev.1686398626-6c2242f.0": "discord.js@14.11.1-dev.1686398626-6c2242f.0_bufferutil@4.0.7_utf-8-validate@6.0.3", + "eslint-config-airbnb-base@15.0.0": "eslint-config-airbnb-base@15.0.0_eslint@8.40.0_eslint-plugin-import@2.27.5__eslint@8.40.0", + "eslint-config-prettier@8.8.0": "eslint-config-prettier@8.8.0_eslint@8.40.0", + "eslint-plugin-import@2.27.5": "eslint-plugin-import@2.27.5_eslint@8.40.0", + "eslint@8.40.0": "eslint@8.40.0", + "html-to-image@1.11.11": "html-to-image@1.11.11", + "husky@8.0.3": "husky@8.0.3", + "lint-staged@13.2.2": "lint-staged@13.2.2", + "mysql2@3.3.1": "mysql2@3.3.1", + "prettier@2.8.8": "prettier@2.8.8", + "pretty-ms@8.0.0": "pretty-ms@8.0.0", + "sequelize@6.31.1": "sequelize@6.31.1", + "utf-8-validate@6.0.3": "utf-8-validate@6.0.3" + }, + "packages": { + "@discordjs/builders@1.6.3": { + "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", + "dependencies": { + "@discordjs/formatters": "@discordjs/formatters@0.3.1", + "@discordjs/util": "@discordjs/util@0.3.1", + "@sapphire/shapeshift": "@sapphire/shapeshift@3.9.2", + "discord-api-types": "discord-api-types@0.37.43", + "fast-deep-equal": "fast-deep-equal@3.1.3", + "ts-mixer": "ts-mixer@6.0.3", + "tslib": "tslib@2.5.3" + } + }, + "@discordjs/collection@1.5.1": { + "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==", + "dependencies": {} + }, + "@discordjs/formatters@0.3.1": { + "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", + "dependencies": { + "discord-api-types": "discord-api-types@0.37.43" + } + }, + "@discordjs/rest@1.7.1": { + "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", + "dependencies": { + "@discordjs/collection": "@discordjs/collection@1.5.1", + "@discordjs/util": "@discordjs/util@0.3.1", + "@sapphire/async-queue": "@sapphire/async-queue@1.5.0", + "@sapphire/snowflake": "@sapphire/snowflake@3.5.1", + "discord-api-types": "discord-api-types@0.37.43", + "file-type": "file-type@18.5.0", + "tslib": "tslib@2.5.3", + "undici": "undici@5.22.1" + } + }, + "@discordjs/util@0.3.1": { + "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==", + "dependencies": {} + }, + "@discordjs/ws@0.8.3": { + "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "dependencies": { + "@discordjs/collection": "@discordjs/collection@1.5.1", + "@discordjs/rest": "@discordjs/rest@1.7.1", + "@discordjs/util": "@discordjs/util@0.3.1", + "@sapphire/async-queue": "@sapphire/async-queue@1.5.0", + "@types/ws": "@types/ws@8.5.5", + "@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.2", + "discord-api-types": "discord-api-types@0.37.43", + "tslib": "tslib@2.5.3", + "ws": "ws@8.13.0" + } + }, + "@discordjs/ws@0.8.3_bufferutil@4.0.7_utf-8-validate@6.0.3": { + "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "dependencies": { + "@discordjs/collection": "@discordjs/collection@1.5.1", + "@discordjs/rest": "@discordjs/rest@1.7.1", + "@discordjs/util": "@discordjs/util@0.3.1", + "@sapphire/async-queue": "@sapphire/async-queue@1.5.0", + "@types/ws": "@types/ws@8.5.5", + "@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.2", + "discord-api-types": "discord-api-types@0.37.43", + "tslib": "tslib@2.5.3", + "ws": "ws@8.13.0_bufferutil@4.0.7_utf-8-validate@6.0.3" + } + }, + "@eslint-community/eslint-utils@4.4.0_eslint@8.40.0": { + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint": "eslint@8.40.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.1" + } + }, + "@eslint-community/regexpp@4.5.1": { + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dependencies": {} + }, + "@eslint/eslintrc@2.0.3": { + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dependencies": { + "ajv": "ajv@6.12.6", + "debug": "debug@4.3.4", + "espree": "espree@9.5.2_acorn@8.8.2", + "globals": "globals@13.20.0", + "ignore": "ignore@5.2.4", + "import-fresh": "import-fresh@3.3.0", + "js-yaml": "js-yaml@4.1.0", + "minimatch": "minimatch@3.1.2", + "strip-json-comments": "strip-json-comments@3.1.1" + } + }, + "@eslint/js@8.40.0": { + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dependencies": {} + }, + "@humanwhocodes/config-array@0.11.10": { + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dependencies": { + "@humanwhocodes/object-schema": "@humanwhocodes/object-schema@1.2.1", + "debug": "debug@4.3.4", + "minimatch": "minimatch@3.1.2" + } + }, + "@humanwhocodes/module-importer@1.0.1": { + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dependencies": {} + }, + "@humanwhocodes/object-schema@1.2.1": { + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dependencies": {} + }, + "@nodelib/fs.scandir@2.1.5": { + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", + "run-parallel": "run-parallel@1.2.0" + } + }, + "@nodelib/fs.stat@2.0.5": { + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dependencies": {} + }, + "@nodelib/fs.walk@1.2.8": { + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", + "fastq": "fastq@1.15.0" + } + }, + "@sapphire/async-queue@1.5.0": { + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "dependencies": {} + }, + "@sapphire/shapeshift@3.9.2": { + "integrity": "sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==", + "dependencies": { + "fast-deep-equal": "fast-deep-equal@3.1.3", + "lodash": "lodash@4.17.21" + } + }, + "@sapphire/snowflake@3.5.1": { + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", + "dependencies": {} + }, + "@tokenizer/token@0.3.0": { + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dependencies": {} + }, + "@types/bunyan@1.8.8": { + "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==", + "dependencies": { + "@types/node": "@types/node@20.3.0" + } + }, + "@types/debug@4.1.8": { + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "@types/ms@0.7.31" + } + }, + "@types/json-schema@7.0.12": { + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dependencies": {} + }, + "@types/json5@0.0.29": { + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dependencies": {} + }, + "@types/ms@0.7.31": { + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dependencies": {} + }, + "@types/node@18.11.18": { + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dependencies": {} + }, + "@types/node@20.2.5": { + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "dependencies": {} + }, + "@types/node@20.3.0": { + "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==", + "dependencies": {} + }, + "@types/semver@7.5.0": { + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dependencies": {} + }, + "@types/validator@13.7.17": { + "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==", + "dependencies": {} + }, + "@types/ws@8.5.5": { + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dependencies": { + "@types/node": "@types/node@20.3.0" + } + }, + "@typescript-eslint/eslint-plugin@5.59.6_@typescript-eslint+parser@5.59.6__eslint@8.40.0_eslint@8.40.0": { + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "dependencies": { + "@eslint-community/regexpp": "@eslint-community/regexpp@4.5.1", + "@typescript-eslint/parser": "@typescript-eslint/parser@5.59.6_eslint@8.40.0", + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@5.59.6", + "@typescript-eslint/type-utils": "@typescript-eslint/type-utils@5.59.6_eslint@8.40.0", + "@typescript-eslint/utils": "@typescript-eslint/utils@5.59.6_eslint@8.40.0", + "debug": "debug@4.3.4", + "eslint": "eslint@8.40.0", + "grapheme-splitter": "grapheme-splitter@1.0.4", + "ignore": "ignore@5.2.4", + "natural-compare-lite": "natural-compare-lite@1.4.0", + "semver": "semver@7.5.1", + "tsutils": "tsutils@3.21.0_typescript@5.1.3" + } + }, + "@typescript-eslint/parser@5.59.6_eslint@8.40.0": { + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "dependencies": { + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@5.59.6", + "@typescript-eslint/types": "@typescript-eslint/types@5.59.6", + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@5.59.6", + "debug": "debug@4.3.4", + "eslint": "eslint@8.40.0" + } + }, + "@typescript-eslint/scope-manager@5.59.6": { + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@5.59.6", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@5.59.6" + } + }, + "@typescript-eslint/type-utils@5.59.6_eslint@8.40.0": { + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "dependencies": { + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@5.59.6", + "@typescript-eslint/utils": "@typescript-eslint/utils@5.59.6_eslint@8.40.0", + "debug": "debug@4.3.4", + "eslint": "eslint@8.40.0", + "tsutils": "tsutils@3.21.0_typescript@5.1.3" + } + }, + "@typescript-eslint/types@5.59.6": { + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "dependencies": {} + }, + "@typescript-eslint/typescript-estree@5.59.6": { + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@5.59.6", + "@typescript-eslint/visitor-keys": "@typescript-eslint/visitor-keys@5.59.6", + "debug": "debug@4.3.4", + "globby": "globby@11.1.0", + "is-glob": "is-glob@4.0.3", + "semver": "semver@7.5.1", + "tsutils": "tsutils@3.21.0_typescript@5.1.3" + } + }, + "@typescript-eslint/utils@5.59.6_eslint@8.40.0": { + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "dependencies": { + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.4.0_eslint@8.40.0", + "@types/json-schema": "@types/json-schema@7.0.12", + "@types/semver": "@types/semver@7.5.0", + "@typescript-eslint/scope-manager": "@typescript-eslint/scope-manager@5.59.6", + "@typescript-eslint/types": "@typescript-eslint/types@5.59.6", + "@typescript-eslint/typescript-estree": "@typescript-eslint/typescript-estree@5.59.6", + "eslint": "eslint@8.40.0", + "eslint-scope": "eslint-scope@5.1.1", + "semver": "semver@7.5.1" + } + }, + "@typescript-eslint/visitor-keys@5.59.6": { + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "dependencies": { + "@typescript-eslint/types": "@typescript-eslint/types@5.59.6", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.1" + } + }, + "@vladfrangu/async_event_emitter@2.2.2": { + "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==", + "dependencies": {} + }, + "acorn-jsx@5.3.2_acorn@8.8.2": { + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dependencies": { + "acorn": "acorn@8.8.2" + } + }, + "acorn@8.8.2": { + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dependencies": {} + }, + "aggregate-error@3.1.0": { + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "clean-stack@2.2.0", + "indent-string": "indent-string@4.0.0" + } + }, + "ajv@6.12.6": { + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "fast-deep-equal@3.1.3", + "fast-json-stable-stringify": "fast-json-stable-stringify@2.1.0", + "json-schema-traverse": "json-schema-traverse@0.4.1", + "uri-js": "uri-js@4.4.1" + } + }, + "ansi-escapes@4.3.2": { + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "type-fest@0.21.3" + } + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dependencies": {} + }, + "ansi-regex@6.0.1": { + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dependencies": {} + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "color-convert@2.0.1" + } + }, + "ansi-styles@6.2.1": { + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dependencies": {} + }, + "argparse@2.0.1": { + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dependencies": {} + }, + "array-buffer-byte-length@1.0.0": { + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "is-array-buffer": "is-array-buffer@3.0.2" + } + }, + "array-includes@3.1.6": { + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2", + "get-intrinsic": "get-intrinsic@1.2.1", + "is-string": "is-string@1.0.7" + } + }, + "array-union@2.1.0": { + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dependencies": {} + }, + "array.prototype.flat@1.3.1": { + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2", + "es-shim-unscopables": "es-shim-unscopables@1.0.0" + } + }, + "array.prototype.flatmap@1.3.1": { + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2", + "es-shim-unscopables": "es-shim-unscopables@1.0.0" + } + }, + "astral-regex@2.0.0": { + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dependencies": {} + }, + "asynckit@0.4.0": { + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dependencies": {} + }, + "available-typed-arrays@1.0.5": { + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dependencies": {} + }, + "axios@1.4.0": { + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "follow-redirects@1.15.2", + "form-data": "form-data@4.0.0", + "proxy-from-env": "proxy-from-env@1.1.0" + } + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dependencies": {} + }, + "brace-expansion@1.1.11": { + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "balanced-match@1.0.2", + "concat-map": "concat-map@0.0.1" + } + }, + "braces@3.0.2": { + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "fill-range@7.0.1" + } + }, + "bufferutil@4.0.7": { + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "dependencies": { + "node-gyp-build": "node-gyp-build@4.6.0" + } + }, + "bunyan@1.8.15": { + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "dependencies": { + "dtrace-provider": "dtrace-provider@0.8.8", + "moment": "moment@2.29.4", + "mv": "mv@2.1.1", + "safe-json-stringify": "safe-json-stringify@1.2.0" + } + }, + "busboy@1.6.0": { + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "streamsearch@1.1.0" + } + }, + "call-bind@1.0.2": { + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "function-bind@1.1.1", + "get-intrinsic": "get-intrinsic@1.2.1" + } + }, + "callsites@3.1.0": { + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dependencies": {} + }, + "chalk@4.1.2": { + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "ansi-styles@4.3.0", + "supports-color": "supports-color@7.2.0" + } + }, + "chalk@5.2.0": { + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dependencies": {} + }, + "clean-stack@2.2.0": { + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dependencies": {} + }, + "cli-cursor@3.1.0": { + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "restore-cursor@3.1.0" + } + }, + "cli-truncate@2.1.0": { + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "slice-ansi@3.0.0", + "string-width": "string-width@4.2.3" + } + }, + "cli-truncate@3.1.0": { + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dependencies": { + "slice-ansi": "slice-ansi@5.0.0", + "string-width": "string-width@5.1.2" + } + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "color-name@1.1.4" + } + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dependencies": {} + }, + "colorette@2.0.20": { + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dependencies": {} + }, + "combined-stream@1.0.8": { + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "delayed-stream@1.0.0" + } + }, + "commander@10.0.1": { + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dependencies": {} + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dependencies": {} + }, + "confusing-browser-globals@1.0.11": { + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dependencies": {} + }, + "cross-spawn@7.0.3": { + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "path-key@3.1.1", + "shebang-command": "shebang-command@2.0.0", + "which": "which@2.0.2" + } + }, + "debug@3.2.7": { + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "ms@2.1.2" + } + }, + "debug@4.3.4": { + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "ms@2.1.2" + } + }, + "deep-is@0.1.4": { + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dependencies": {} + }, + "define-properties@1.2.0": { + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "has-property-descriptors@1.0.0", + "object-keys": "object-keys@1.1.1" + } + }, + "delayed-stream@1.0.0": { + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dependencies": {} + }, + "denque@2.1.0": { + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "dependencies": {} + }, + "dir-glob@3.0.1": { + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "path-type@4.0.0" + } + }, + "discord-api-types@0.37.43": { + "integrity": "sha512-bBhDWU3TF9KADxR/mHp1K4Bvu/LRtFQdGyBjADu4e66F3ZnD4kp12W/SJCttIaCcMXzPV3sfty6eDGRNRph51Q==", + "dependencies": {} + }, + "discord.js@14.11.0": { + "integrity": "sha512-CkueWYFQ28U38YPR8HgsBR/QT35oPpMbEsTNM30Fs8loBIhnA4s70AwQEoy6JvLcpWWJO7GY0y2BUzZmuBMepQ==", + "dependencies": { + "@discordjs/builders": "@discordjs/builders@1.6.3", + "@discordjs/collection": "@discordjs/collection@1.5.1", + "@discordjs/formatters": "@discordjs/formatters@0.3.1", + "@discordjs/rest": "@discordjs/rest@1.7.1", + "@discordjs/util": "@discordjs/util@0.3.1", + "@discordjs/ws": "@discordjs/ws@0.8.3", + "@sapphire/snowflake": "@sapphire/snowflake@3.5.1", + "@types/ws": "@types/ws@8.5.5", + "discord-api-types": "discord-api-types@0.37.43", + "fast-deep-equal": "fast-deep-equal@3.1.3", + "lodash.snakecase": "lodash.snakecase@4.1.1", + "tslib": "tslib@2.5.3", + "undici": "undici@5.22.1", + "ws": "ws@8.13.0" + } + }, + "discord.js@14.11.1-dev.1686398626-6c2242f.0_bufferutil@4.0.7_utf-8-validate@6.0.3": { + "integrity": "sha512-KCLYvTCKR3T9WuXjcaIaLhSObLiiepJ8Z6fwSK1AZLpFzVKjJSO0HrSz3XRw/iFRf8iUz6Ryzpy4ZC4b/eTg2A==", + "dependencies": { + "@discordjs/builders": "@discordjs/builders@1.6.3", + "@discordjs/collection": "@discordjs/collection@1.5.1", + "@discordjs/formatters": "@discordjs/formatters@0.3.1", + "@discordjs/rest": "@discordjs/rest@1.7.1", + "@discordjs/util": "@discordjs/util@0.3.1", + "@discordjs/ws": "@discordjs/ws@0.8.3_bufferutil@4.0.7_utf-8-validate@6.0.3", + "@sapphire/snowflake": "@sapphire/snowflake@3.5.1", + "@types/ws": "@types/ws@8.5.5", + "discord-api-types": "discord-api-types@0.37.43", + "fast-deep-equal": "fast-deep-equal@3.1.3", + "lodash.snakecase": "lodash.snakecase@4.1.1", + "tslib": "tslib@2.5.3", + "undici": "undici@5.22.1", + "ws": "ws@8.13.0_bufferutil@4.0.7_utf-8-validate@6.0.3" + } + }, + "doctrine@2.1.0": { + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "esutils@2.0.3" + } + }, + "doctrine@3.0.0": { + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "esutils@2.0.3" + } + }, + "dottie@2.0.4": { + "integrity": "sha512-iz64WUOmp/ECQhWMJjTWFzJN/wQ7RJ5v/a6A2OiCwjaGCpNo66WGIjlSf+IULO9DQd0b4cFawLOTbiKSrpKodw==", + "dependencies": {} + }, + "dtrace-provider@0.8.8": { + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "dependencies": { + "nan": "nan@2.17.0" + } + }, + "eastasianwidth@0.2.0": { + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dependencies": {} + }, + "emoji-regex@8.0.0": { + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dependencies": {} + }, + "emoji-regex@9.2.2": { + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dependencies": {} + }, + "es-abstract@1.21.2": { + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dependencies": { + "array-buffer-byte-length": "array-buffer-byte-length@1.0.0", + "available-typed-arrays": "available-typed-arrays@1.0.5", + "call-bind": "call-bind@1.0.2", + "es-set-tostringtag": "es-set-tostringtag@2.0.1", + "es-to-primitive": "es-to-primitive@1.2.1", + "function.prototype.name": "function.prototype.name@1.1.5", + "get-intrinsic": "get-intrinsic@1.2.1", + "get-symbol-description": "get-symbol-description@1.0.0", + "globalthis": "globalthis@1.0.3", + "gopd": "gopd@1.0.1", + "has": "has@1.0.3", + "has-property-descriptors": "has-property-descriptors@1.0.0", + "has-proto": "has-proto@1.0.1", + "has-symbols": "has-symbols@1.0.3", + "internal-slot": "internal-slot@1.0.5", + "is-array-buffer": "is-array-buffer@3.0.2", + "is-callable": "is-callable@1.2.7", + "is-negative-zero": "is-negative-zero@2.0.2", + "is-regex": "is-regex@1.1.4", + "is-shared-array-buffer": "is-shared-array-buffer@1.0.2", + "is-string": "is-string@1.0.7", + "is-typed-array": "is-typed-array@1.1.10", + "is-weakref": "is-weakref@1.0.2", + "object-inspect": "object-inspect@1.12.3", + "object-keys": "object-keys@1.1.1", + "object.assign": "object.assign@4.1.4", + "regexp.prototype.flags": "regexp.prototype.flags@1.5.0", + "safe-regex-test": "safe-regex-test@1.0.0", + "string.prototype.trim": "string.prototype.trim@1.2.7", + "string.prototype.trimend": "string.prototype.trimend@1.0.6", + "string.prototype.trimstart": "string.prototype.trimstart@1.0.6", + "typed-array-length": "typed-array-length@1.0.4", + "unbox-primitive": "unbox-primitive@1.0.2", + "which-typed-array": "which-typed-array@1.1.9" + } + }, + "es-set-tostringtag@2.0.1": { + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "get-intrinsic@1.2.1", + "has": "has@1.0.3", + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "es-shim-unscopables@1.0.0": { + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "has@1.0.3" + } + }, + "es-to-primitive@1.2.1": { + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "is-callable@1.2.7", + "is-date-object": "is-date-object@1.0.5", + "is-symbol": "is-symbol@1.0.4" + } + }, + "escape-string-regexp@4.0.0": { + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dependencies": {} + }, + "eslint-config-airbnb-base@15.0.0_eslint@8.40.0_eslint-plugin-import@2.27.5__eslint@8.40.0": { + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dependencies": { + "confusing-browser-globals": "confusing-browser-globals@1.0.11", + "eslint": "eslint@8.40.0", + "eslint-plugin-import": "eslint-plugin-import@2.27.5_eslint@8.40.0", + "object.assign": "object.assign@4.1.4", + "object.entries": "object.entries@1.1.6", + "semver": "semver@6.3.0" + } + }, + "eslint-config-prettier@8.8.0_eslint@8.40.0": { + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dependencies": { + "eslint": "eslint@8.40.0" + } + }, + "eslint-import-resolver-node@0.3.7": { + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dependencies": { + "debug": "debug@3.2.7", + "is-core-module": "is-core-module@2.12.1", + "resolve": "resolve@1.22.3" + } + }, + "eslint-module-utils@2.8.0": { + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "debug@3.2.7" + } + }, + "eslint-plugin-import@2.27.5_eslint@8.40.0": { + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dependencies": { + "array-includes": "array-includes@3.1.6", + "array.prototype.flat": "array.prototype.flat@1.3.1", + "array.prototype.flatmap": "array.prototype.flatmap@1.3.1", + "debug": "debug@3.2.7", + "doctrine": "doctrine@2.1.0", + "eslint": "eslint@8.40.0", + "eslint-import-resolver-node": "eslint-import-resolver-node@0.3.7", + "eslint-module-utils": "eslint-module-utils@2.8.0", + "has": "has@1.0.3", + "is-core-module": "is-core-module@2.12.1", + "is-glob": "is-glob@4.0.3", + "minimatch": "minimatch@3.1.2", + "object.values": "object.values@1.1.6", + "resolve": "resolve@1.22.3", + "semver": "semver@6.3.0", + "tsconfig-paths": "tsconfig-paths@3.14.2" + } + }, + "eslint-scope@5.1.1": { + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "esrecurse@4.3.0", + "estraverse": "estraverse@4.3.0" + } + }, + "eslint-scope@7.2.0": { + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "esrecurse@4.3.0", + "estraverse": "estraverse@5.3.0" + } + }, + "eslint-visitor-keys@3.4.1": { + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dependencies": {} + }, + "eslint@8.40.0": { + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "dependencies": { + "@eslint-community/eslint-utils": "@eslint-community/eslint-utils@4.4.0_eslint@8.40.0", + "@eslint-community/regexpp": "@eslint-community/regexpp@4.5.1", + "@eslint/eslintrc": "@eslint/eslintrc@2.0.3", + "@eslint/js": "@eslint/js@8.40.0", + "@humanwhocodes/config-array": "@humanwhocodes/config-array@0.11.10", + "@humanwhocodes/module-importer": "@humanwhocodes/module-importer@1.0.1", + "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", + "ajv": "ajv@6.12.6", + "chalk": "chalk@4.1.2", + "cross-spawn": "cross-spawn@7.0.3", + "debug": "debug@4.3.4", + "doctrine": "doctrine@3.0.0", + "escape-string-regexp": "escape-string-regexp@4.0.0", + "eslint-scope": "eslint-scope@7.2.0", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.1", + "espree": "espree@9.5.2_acorn@8.8.2", + "esquery": "esquery@1.5.0", + "esutils": "esutils@2.0.3", + "fast-deep-equal": "fast-deep-equal@3.1.3", + "file-entry-cache": "file-entry-cache@6.0.1", + "find-up": "find-up@5.0.0", + "glob-parent": "glob-parent@6.0.2", + "globals": "globals@13.20.0", + "grapheme-splitter": "grapheme-splitter@1.0.4", + "ignore": "ignore@5.2.4", + "import-fresh": "import-fresh@3.3.0", + "imurmurhash": "imurmurhash@0.1.4", + "is-glob": "is-glob@4.0.3", + "is-path-inside": "is-path-inside@3.0.3", + "js-sdsl": "js-sdsl@4.4.1", + "js-yaml": "js-yaml@4.1.0", + "json-stable-stringify-without-jsonify": "json-stable-stringify-without-jsonify@1.0.1", + "levn": "levn@0.4.1", + "lodash.merge": "lodash.merge@4.6.2", + "minimatch": "minimatch@3.1.2", + "natural-compare": "natural-compare@1.4.0", + "optionator": "optionator@0.9.1", + "strip-ansi": "strip-ansi@6.0.1", + "strip-json-comments": "strip-json-comments@3.1.1", + "text-table": "text-table@0.2.0" + } + }, + "espree@9.5.2_acorn@8.8.2": { + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dependencies": { + "acorn": "acorn@8.8.2", + "acorn-jsx": "acorn-jsx@5.3.2_acorn@8.8.2", + "eslint-visitor-keys": "eslint-visitor-keys@3.4.1" + } + }, + "esquery@1.5.0": { + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "estraverse@5.3.0" + } + }, + "esrecurse@4.3.0": { + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "estraverse@5.3.0" + } + }, + "estraverse@4.3.0": { + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dependencies": {} + }, + "estraverse@5.3.0": { + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dependencies": {} + }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dependencies": {} + }, + "execa@7.1.1": { + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dependencies": { + "cross-spawn": "cross-spawn@7.0.3", + "get-stream": "get-stream@6.0.1", + "human-signals": "human-signals@4.3.1", + "is-stream": "is-stream@3.0.0", + "merge-stream": "merge-stream@2.0.0", + "npm-run-path": "npm-run-path@5.1.0", + "onetime": "onetime@6.0.0", + "signal-exit": "signal-exit@3.0.7", + "strip-final-newline": "strip-final-newline@3.0.0" + } + }, + "fast-deep-equal@3.1.3": { + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dependencies": {} + }, + "fast-glob@3.2.12": { + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", + "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", + "glob-parent": "glob-parent@5.1.2", + "merge2": "merge2@1.4.1", + "micromatch": "micromatch@4.0.5" + } + }, + "fast-json-stable-stringify@2.1.0": { + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dependencies": {} + }, + "fast-levenshtein@2.0.6": { + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dependencies": {} + }, + "fastq@1.15.0": { + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "reusify@1.0.4" + } + }, + "file-entry-cache@6.0.1": { + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "flat-cache@3.0.4" + } + }, + "file-type@18.5.0": { + "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==", + "dependencies": { + "readable-web-to-node-stream": "readable-web-to-node-stream@3.0.2", + "strtok3": "strtok3@7.0.0", + "token-types": "token-types@5.0.1" + } + }, + "fill-range@7.0.1": { + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "to-regex-range@5.0.1" + } + }, + "find-up@5.0.0": { + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "locate-path@6.0.0", + "path-exists": "path-exists@4.0.0" + } + }, + "flat-cache@3.0.4": { + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "flatted@3.2.7", + "rimraf": "rimraf@3.0.2" + } + }, + "flatted@3.2.7": { + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dependencies": {} + }, + "follow-redirects@1.15.2": { + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dependencies": {} + }, + "for-each@0.3.3": { + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "is-callable@1.2.7" + } + }, + "form-data@4.0.0": { + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "asynckit@0.4.0", + "combined-stream": "combined-stream@1.0.8", + "mime-types": "mime-types@2.1.35" + } + }, + "fs.realpath@1.0.0": { + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dependencies": {} + }, + "function-bind@1.1.1": { + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dependencies": {} + }, + "function.prototype.name@1.1.5": { + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2", + "functions-have-names": "functions-have-names@1.2.3" + } + }, + "functions-have-names@1.2.3": { + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dependencies": {} + }, + "generate-function@2.3.1": { + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "is-property@1.0.2" + } + }, + "get-intrinsic@1.2.1": { + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "function-bind@1.1.1", + "has": "has@1.0.3", + "has-proto": "has-proto@1.0.1", + "has-symbols": "has-symbols@1.0.3" + } + }, + "get-stream@6.0.1": { + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dependencies": {} + }, + "get-symbol-description@1.0.0": { + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "get-intrinsic": "get-intrinsic@1.2.1" + } + }, + "glob-parent@5.1.2": { + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "is-glob@4.0.3" + } + }, + "glob-parent@6.0.2": { + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "is-glob@4.0.3" + } + }, + "glob@6.0.4": { + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "dependencies": { + "inflight": "inflight@1.0.6", + "inherits": "inherits@2.0.4", + "minimatch": "minimatch@3.1.2", + "once": "once@1.4.0", + "path-is-absolute": "path-is-absolute@1.0.1" + } + }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "fs.realpath@1.0.0", + "inflight": "inflight@1.0.6", + "inherits": "inherits@2.0.4", + "minimatch": "minimatch@3.1.2", + "once": "once@1.4.0", + "path-is-absolute": "path-is-absolute@1.0.1" + } + }, + "globals@13.20.0": { + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "type-fest@0.20.2" + } + }, + "globalthis@1.0.3": { + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "define-properties@1.2.0" + } + }, + "globby@11.1.0": { + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "array-union@2.1.0", + "dir-glob": "dir-glob@3.0.1", + "fast-glob": "fast-glob@3.2.12", + "ignore": "ignore@5.2.4", + "merge2": "merge2@1.4.1", + "slash": "slash@3.0.0" + } + }, + "gopd@1.0.1": { + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "get-intrinsic@1.2.1" + } + }, + "grapheme-splitter@1.0.4": { + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dependencies": {} + }, + "has-bigints@1.0.2": { + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dependencies": {} + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dependencies": {} + }, + "has-property-descriptors@1.0.0": { + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "get-intrinsic@1.2.1" + } + }, + "has-proto@1.0.1": { + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dependencies": {} + }, + "has-symbols@1.0.3": { + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dependencies": {} + }, + "has-tostringtag@1.0.0": { + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "has-symbols@1.0.3" + } + }, + "has@1.0.3": { + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "function-bind@1.1.1" + } + }, + "html-to-image@1.11.11": { + "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==", + "dependencies": {} + }, + "human-signals@4.3.1": { + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dependencies": {} + }, + "husky@8.0.3": { + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dependencies": {} + }, + "iconv-lite@0.6.3": { + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": "safer-buffer@2.1.2" + } + }, + "ieee754@1.2.1": { + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dependencies": {} + }, + "ignore@5.2.4": { + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dependencies": {} + }, + "import-fresh@3.3.0": { + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "parent-module@1.0.1", + "resolve-from": "resolve-from@4.0.0" + } + }, + "imurmurhash@0.1.4": { + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dependencies": {} + }, + "indent-string@4.0.0": { + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dependencies": {} + }, + "inflection@1.13.4": { + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "dependencies": {} + }, + "inflight@1.0.6": { + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "once@1.4.0", + "wrappy": "wrappy@1.0.2" + } + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dependencies": {} + }, + "internal-slot@1.0.5": { + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "get-intrinsic@1.2.1", + "has": "has@1.0.3", + "side-channel": "side-channel@1.0.4" + } + }, + "is-array-buffer@3.0.2": { + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "get-intrinsic": "get-intrinsic@1.2.1", + "is-typed-array": "is-typed-array@1.1.10" + } + }, + "is-bigint@1.0.4": { + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "has-bigints@1.0.2" + } + }, + "is-boolean-object@1.1.2": { + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-callable@1.2.7": { + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dependencies": {} + }, + "is-core-module@2.12.1": { + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "has@1.0.3" + } + }, + "is-date-object@1.0.5": { + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-extglob@2.1.1": { + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dependencies": {} + }, + "is-fullwidth-code-point@3.0.0": { + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dependencies": {} + }, + "is-fullwidth-code-point@4.0.0": { + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dependencies": {} + }, + "is-glob@4.0.3": { + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "is-extglob@2.1.1" + } + }, + "is-negative-zero@2.0.2": { + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dependencies": {} + }, + "is-number-object@1.0.7": { + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-number@7.0.0": { + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dependencies": {} + }, + "is-path-inside@3.0.3": { + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dependencies": {} + }, + "is-property@1.0.2": { + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dependencies": {} + }, + "is-regex@1.1.4": { + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-shared-array-buffer@1.0.2": { + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "call-bind@1.0.2" + } + }, + "is-stream@3.0.0": { + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dependencies": {} + }, + "is-string@1.0.7": { + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-symbol@1.0.4": { + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "has-symbols@1.0.3" + } + }, + "is-typed-array@1.1.10": { + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "available-typed-arrays@1.0.5", + "call-bind": "call-bind@1.0.2", + "for-each": "for-each@0.3.3", + "gopd": "gopd@1.0.1", + "has-tostringtag": "has-tostringtag@1.0.0" + } + }, + "is-weakref@1.0.2": { + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "call-bind@1.0.2" + } + }, + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dependencies": {} + }, + "js-sdsl@4.4.1": { + "integrity": "sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA==", + "dependencies": {} + }, + "js-yaml@4.1.0": { + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "argparse@2.0.1" + } + }, + "json-schema-traverse@0.4.1": { + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dependencies": {} + }, + "json-stable-stringify-without-jsonify@1.0.1": { + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dependencies": {} + }, + "json5@1.0.2": { + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "minimist@1.2.8" + } + }, + "levn@0.4.1": { + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "prelude-ls@1.2.1", + "type-check": "type-check@0.4.0" + } + }, + "lilconfig@2.1.0": { + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dependencies": {} + }, + "lint-staged@13.2.2": { + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "dependencies": { + "chalk": "chalk@5.2.0", + "cli-truncate": "cli-truncate@3.1.0", + "commander": "commander@10.0.1", + "debug": "debug@4.3.4", + "execa": "execa@7.1.1", + "lilconfig": "lilconfig@2.1.0", + "listr2": "listr2@5.0.8", + "micromatch": "micromatch@4.0.5", + "normalize-path": "normalize-path@3.0.0", + "object-inspect": "object-inspect@1.12.3", + "pidtree": "pidtree@0.6.0", + "string-argv": "string-argv@0.3.2", + "yaml": "yaml@2.3.1" + } + }, + "listr2@5.0.8": { + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dependencies": { + "cli-truncate": "cli-truncate@2.1.0", + "colorette": "colorette@2.0.20", + "log-update": "log-update@4.0.0", + "p-map": "p-map@4.0.0", + "rfdc": "rfdc@1.3.0", + "rxjs": "rxjs@7.8.1", + "through": "through@2.3.8", + "wrap-ansi": "wrap-ansi@7.0.0" + } + }, + "locate-path@6.0.0": { + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "p-locate@5.0.0" + } + }, + "lodash.merge@4.6.2": { + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dependencies": {} + }, + "lodash.snakecase@4.1.1": { + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dependencies": {} + }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dependencies": {} + }, + "log-update@4.0.0": { + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dependencies": { + "ansi-escapes": "ansi-escapes@4.3.2", + "cli-cursor": "cli-cursor@3.1.0", + "slice-ansi": "slice-ansi@4.0.0", + "wrap-ansi": "wrap-ansi@6.2.0" + } + }, + "long@5.2.3": { + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "dependencies": {} + }, + "lru-cache@6.0.0": { + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "yallist@4.0.0" + } + }, + "lru-cache@7.18.3": { + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dependencies": {} + }, + "lru-cache@8.0.5": { + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "dependencies": {} + }, + "merge-stream@2.0.0": { + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dependencies": {} + }, + "merge2@1.4.1": { + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dependencies": {} + }, + "micromatch@4.0.5": { + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "braces@3.0.2", + "picomatch": "picomatch@2.3.1" + } + }, + "mime-db@1.52.0": { + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dependencies": {} + }, + "mime-types@2.1.35": { + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "mime-db@1.52.0" + } + }, + "mimic-fn@2.1.0": { + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dependencies": {} + }, + "mimic-fn@4.0.0": { + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dependencies": {} + }, + "minimatch@3.1.2": { + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "brace-expansion@1.1.11" + } + }, + "minimist@1.2.8": { + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dependencies": {} + }, + "mkdirp@0.5.6": { + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "minimist@1.2.8" + } + }, + "moment-timezone@0.5.43": { + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "dependencies": { + "moment": "moment@2.29.4" + } + }, + "moment@2.29.4": { + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dependencies": {} + }, + "ms@2.1.2": { + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dependencies": {} + }, + "mv@2.1.1": { + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "dependencies": { + "mkdirp": "mkdirp@0.5.6", + "ncp": "ncp@2.0.0", + "rimraf": "rimraf@2.4.5" + } + }, + "mysql2@3.3.1": { + "integrity": "sha512-UD84/AvLwO5qmSABEsBTZ7y7JKv3sM8JzWGhuL4tDkJwVsClVVAcelNSR5Unyhxj6/KHBAkjS7qe5/c+gEmNvA==", + "dependencies": { + "denque": "denque@2.1.0", + "generate-function": "generate-function@2.3.1", + "iconv-lite": "iconv-lite@0.6.3", + "long": "long@5.2.3", + "lru-cache": "lru-cache@8.0.5", + "named-placeholders": "named-placeholders@1.1.3", + "seq-queue": "seq-queue@0.0.5", + "sqlstring": "sqlstring@2.3.3" + } + }, + "named-placeholders@1.1.3": { + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "lru-cache@7.18.3" + } + }, + "nan@2.17.0": { + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dependencies": {} + }, + "natural-compare-lite@1.4.0": { + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dependencies": {} + }, + "natural-compare@1.4.0": { + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dependencies": {} + }, + "ncp@2.0.0": { + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dependencies": {} + }, + "node-gyp-build@4.6.0": { + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "dependencies": {} + }, + "normalize-path@3.0.0": { + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dependencies": {} + }, + "npm-run-path@5.1.0": { + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "path-key@4.0.0" + } + }, + "object-inspect@1.12.3": { + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dependencies": {} + }, + "object-keys@1.1.1": { + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dependencies": {} + }, + "object.assign@4.1.4": { + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "has-symbols": "has-symbols@1.0.3", + "object-keys": "object-keys@1.1.1" + } + }, + "object.entries@1.1.6": { + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2" + } + }, + "object.values@1.1.6": { + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2" + } + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "wrappy@1.0.2" + } + }, + "onetime@5.1.2": { + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "mimic-fn@2.1.0" + } + }, + "onetime@6.0.0": { + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "mimic-fn@4.0.0" + } + }, + "optionator@0.9.1": { + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "deep-is@0.1.4", + "fast-levenshtein": "fast-levenshtein@2.0.6", + "levn": "levn@0.4.1", + "prelude-ls": "prelude-ls@1.2.1", + "type-check": "type-check@0.4.0", + "word-wrap": "word-wrap@1.2.3" + } + }, + "p-limit@3.1.0": { + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "yocto-queue@0.1.0" + } + }, + "p-locate@5.0.0": { + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "p-limit@3.1.0" + } + }, + "p-map@4.0.0": { + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "aggregate-error@3.1.0" + } + }, + "parent-module@1.0.1": { + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "callsites@3.1.0" + } + }, + "parse-ms@3.0.0": { + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "dependencies": {} + }, + "path-exists@4.0.0": { + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dependencies": {} + }, + "path-is-absolute@1.0.1": { + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dependencies": {} + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dependencies": {} + }, + "path-key@4.0.0": { + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dependencies": {} + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dependencies": {} + }, + "path-type@4.0.0": { + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dependencies": {} + }, + "peek-readable@5.0.0": { + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "dependencies": {} + }, + "pg-connection-string@2.6.0": { + "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==", + "dependencies": {} + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dependencies": {} + }, + "pidtree@0.6.0": { + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dependencies": {} + }, + "prelude-ls@1.2.1": { + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dependencies": {} + }, + "prettier@2.8.8": { + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dependencies": {} + }, + "pretty-ms@8.0.0": { + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "dependencies": { + "parse-ms": "parse-ms@3.0.0" + } + }, + "proxy-from-env@1.1.0": { + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dependencies": {} + }, + "punycode@2.3.0": { + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dependencies": {} + }, + "queue-microtask@1.2.3": { + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dependencies": {} + }, + "readable-stream@3.6.2": { + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "inherits@2.0.4", + "string_decoder": "string_decoder@1.3.0", + "util-deprecate": "util-deprecate@1.0.2" + } + }, + "readable-web-to-node-stream@3.0.2": { + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "readable-stream@3.6.2" + } + }, + "regexp.prototype.flags@1.5.0": { + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "functions-have-names": "functions-have-names@1.2.3" + } + }, + "resolve-from@4.0.0": { + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dependencies": {} + }, + "resolve@1.22.3": { + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "dependencies": { + "is-core-module": "is-core-module@2.12.1", + "path-parse": "path-parse@1.0.7", + "supports-preserve-symlinks-flag": "supports-preserve-symlinks-flag@1.0.0" + } + }, + "restore-cursor@3.1.0": { + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "onetime@5.1.2", + "signal-exit": "signal-exit@3.0.7" + } + }, + "retry-as-promised@7.0.4": { + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==", + "dependencies": {} + }, + "reusify@1.0.4": { + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dependencies": {} + }, + "rfdc@1.3.0": { + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dependencies": {} + }, + "rimraf@2.4.5": { + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "dependencies": { + "glob": "glob@6.0.4" + } + }, + "rimraf@3.0.2": { + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "glob@7.2.3" + } + }, + "run-parallel@1.2.0": { + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": { + "queue-microtask": "queue-microtask@1.2.3" + } + }, + "rxjs@7.8.1": { + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "tslib@2.5.3" + } + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dependencies": {} + }, + "safe-json-stringify@1.2.0": { + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "dependencies": {} + }, + "safe-regex-test@1.0.0": { + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "get-intrinsic": "get-intrinsic@1.2.1", + "is-regex": "is-regex@1.1.4" + } + }, + "safer-buffer@2.1.2": { + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dependencies": {} + }, + "semver@6.3.0": { + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dependencies": {} + }, + "semver@7.5.1": { + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "lru-cache@6.0.0" + } + }, + "seq-queue@0.0.5": { + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==", + "dependencies": {} + }, + "sequelize-pool@7.1.0": { + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "dependencies": {} + }, + "sequelize@6.31.1": { + "integrity": "sha512-cahWtRrYLjqoZP/aurGBoaxn29qQCF4bxkAUPEQ/ozjJjt6mtL4Q113S3N39mQRmX5fgxRbli+bzZARP/N51eg==", + "dependencies": { + "@types/debug": "@types/debug@4.1.8", + "@types/validator": "@types/validator@13.7.17", + "debug": "debug@4.3.4", + "dottie": "dottie@2.0.4", + "inflection": "inflection@1.13.4", + "lodash": "lodash@4.17.21", + "moment": "moment@2.29.4", + "moment-timezone": "moment-timezone@0.5.43", + "pg-connection-string": "pg-connection-string@2.6.0", + "retry-as-promised": "retry-as-promised@7.0.4", + "semver": "semver@7.5.1", + "sequelize-pool": "sequelize-pool@7.1.0", + "toposort-class": "toposort-class@1.0.1", + "uuid": "uuid@8.3.2", + "validator": "validator@13.9.0", + "wkx": "wkx@0.5.0" + } + }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "shebang-regex@3.0.0" + } + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dependencies": {} + }, + "side-channel@1.0.4": { + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "get-intrinsic": "get-intrinsic@1.2.1", + "object-inspect": "object-inspect@1.12.3" + } + }, + "signal-exit@3.0.7": { + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dependencies": {} + }, + "slash@3.0.0": { + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dependencies": {} + }, + "slice-ansi@3.0.0": { + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "ansi-styles@4.3.0", + "astral-regex": "astral-regex@2.0.0", + "is-fullwidth-code-point": "is-fullwidth-code-point@3.0.0" + } + }, + "slice-ansi@4.0.0": { + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "ansi-styles@4.3.0", + "astral-regex": "astral-regex@2.0.0", + "is-fullwidth-code-point": "is-fullwidth-code-point@3.0.0" + } + }, + "slice-ansi@5.0.0": { + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dependencies": { + "ansi-styles": "ansi-styles@6.2.1", + "is-fullwidth-code-point": "is-fullwidth-code-point@4.0.0" + } + }, + "sqlstring@2.3.3": { + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "dependencies": {} + }, + "streamsearch@1.1.0": { + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dependencies": {} + }, + "string-argv@0.3.2": { + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dependencies": {} + }, + "string-width@4.2.3": { + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "emoji-regex@8.0.0", + "is-fullwidth-code-point": "is-fullwidth-code-point@3.0.0", + "strip-ansi": "strip-ansi@6.0.1" + } + }, + "string-width@5.1.2": { + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "eastasianwidth@0.2.0", + "emoji-regex": "emoji-regex@9.2.2", + "strip-ansi": "strip-ansi@7.1.0" + } + }, + "string.prototype.trim@1.2.7": { + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2" + } + }, + "string.prototype.trimend@1.0.6": { + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2" + } + }, + "string.prototype.trimstart@1.0.6": { + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "define-properties": "define-properties@1.2.0", + "es-abstract": "es-abstract@1.21.2" + } + }, + "string_decoder@1.3.0": { + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "safe-buffer@5.2.1" + } + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "ansi-regex@5.0.1" + } + }, + "strip-ansi@7.1.0": { + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "ansi-regex@6.0.1" + } + }, + "strip-bom@3.0.0": { + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dependencies": {} + }, + "strip-final-newline@3.0.0": { + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dependencies": {} + }, + "strip-json-comments@3.1.1": { + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dependencies": {} + }, + "strtok3@7.0.0": { + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dependencies": { + "@tokenizer/token": "@tokenizer/token@0.3.0", + "peek-readable": "peek-readable@5.0.0" + } + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "has-flag@4.0.0" + } + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dependencies": {} + }, + "text-table@0.2.0": { + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dependencies": {} + }, + "through@2.3.8": { + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dependencies": {} + }, + "to-regex-range@5.0.1": { + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "is-number@7.0.0" + } + }, + "token-types@5.0.1": { + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dependencies": { + "@tokenizer/token": "@tokenizer/token@0.3.0", + "ieee754": "ieee754@1.2.1" + } + }, + "toposort-class@1.0.1": { + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==", + "dependencies": {} + }, + "ts-mixer@6.0.3": { + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==", + "dependencies": {} + }, + "tsconfig-paths@3.14.2": { + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dependencies": { + "@types/json5": "@types/json5@0.0.29", + "json5": "json5@1.0.2", + "minimist": "minimist@1.2.8", + "strip-bom": "strip-bom@3.0.0" + } + }, + "tslib@1.14.1": { + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dependencies": {} + }, + "tslib@2.5.3": { + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dependencies": {} + }, + "tsutils@3.21.0_typescript@5.1.3": { + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "tslib@1.14.1", + "typescript": "typescript@5.1.3" + } + }, + "type-check@0.4.0": { + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "prelude-ls@1.2.1" + } + }, + "type-fest@0.20.2": { + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dependencies": {} + }, + "type-fest@0.21.3": { + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dependencies": {} + }, + "typed-array-length@1.0.4": { + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "for-each": "for-each@0.3.3", + "is-typed-array": "is-typed-array@1.1.10" + } + }, + "typescript@5.1.3": { + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dependencies": {} + }, + "unbox-primitive@1.0.2": { + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "call-bind@1.0.2", + "has-bigints": "has-bigints@1.0.2", + "has-symbols": "has-symbols@1.0.3", + "which-boxed-primitive": "which-boxed-primitive@1.0.2" + } + }, + "undici@5.22.1": { + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "dependencies": { + "busboy": "busboy@1.6.0" + } + }, + "uri-js@4.4.1": { + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "punycode@2.3.0" + } + }, + "utf-8-validate@6.0.3": { + "integrity": "sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==", + "dependencies": { + "node-gyp-build": "node-gyp-build@4.6.0" + } + }, + "util-deprecate@1.0.2": { + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dependencies": {} + }, + "uuid@8.3.2": { + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dependencies": {} + }, + "validator@13.9.0": { + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "dependencies": {} + }, + "which-boxed-primitive@1.0.2": { + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "is-bigint@1.0.4", + "is-boolean-object": "is-boolean-object@1.1.2", + "is-number-object": "is-number-object@1.0.7", + "is-string": "is-string@1.0.7", + "is-symbol": "is-symbol@1.0.4" + } + }, + "which-typed-array@1.1.9": { + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "available-typed-arrays@1.0.5", + "call-bind": "call-bind@1.0.2", + "for-each": "for-each@0.3.3", + "gopd": "gopd@1.0.1", + "has-tostringtag": "has-tostringtag@1.0.0", + "is-typed-array": "is-typed-array@1.1.10" + } + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "isexe@2.0.0" + } + }, + "wkx@0.5.0": { + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "dependencies": { + "@types/node": "@types/node@20.3.0" + } + }, + "word-wrap@1.2.3": { + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dependencies": {} + }, + "wrap-ansi@6.2.0": { + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "ansi-styles@4.3.0", + "string-width": "string-width@4.2.3", + "strip-ansi": "strip-ansi@6.0.1" + } + }, + "wrap-ansi@7.0.0": { + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "ansi-styles@4.3.0", + "string-width": "string-width@4.2.3", + "strip-ansi": "strip-ansi@6.0.1" + } + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dependencies": {} + }, + "ws@8.13.0": { + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dependencies": {} + }, + "ws@8.13.0_bufferutil@4.0.7_utf-8-validate@6.0.3": { + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dependencies": { + "bufferutil": "bufferutil@4.0.7", + "utf-8-validate": "utf-8-validate@6.0.3" + } + }, + "yallist@4.0.0": { + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dependencies": {} + }, + "yaml@2.3.1": { + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dependencies": {} + }, + "yocto-queue@0.1.0": { + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dependencies": {} + } + } + } +} diff --git a/functions/AUTOCOMPLETE/RESOLVE/channel.js b/functions/AUTOCOMPLETE/RESOLVE/channel.js deleted file mode 100644 index 37353d4..0000000 --- a/functions/AUTOCOMPLETE/RESOLVE/channel.js +++ /dev/null @@ -1,31 +0,0 @@ -/* -This function provides a autocomplete for channels in another server. -This is needed, as discords built in search only searches the server where the command is executed in -*/ - -module.exports.run = async (searchInput, guildId) => { - // if (searchInput.length <= 2) return []; - - const guild = client.guilds.cache.find((guild) => guild.id === guildId); - if (!guild) return [{ name: 'Define server first.', value: '0' }]; - - const channels = guild.channels.cache - .filter((channel) => channel.type === 'GUILD_TEXT'); - - // id search - if (searchInput !== '' && !isNaN(searchInput)) { - const found = channels.find((channel) => channel.id === searchInput); - if (found) return [{ name: found.name, value: found.id }]; - return [{ name: 'Unkown', value: searchInput }]; - } - - // text search - const channelReply = await channels - .filter((channel) => channel.name.toLowerCase().search(searchInput.toLowerCase()) !== -1) - .map((channel) => ({ name: channel.name, value: channel.id })); - return channelReply.slice(0, 24); -}; - -module.exports.data = { - name: 'server', -}; diff --git a/functions/AUTOCOMPLETE/RESOLVE/role.js b/functions/AUTOCOMPLETE/RESOLVE/role.js deleted file mode 100644 index 2c7c7c9..0000000 --- a/functions/AUTOCOMPLETE/RESOLVE/role.js +++ /dev/null @@ -1,30 +0,0 @@ -/* -This function provides a autocomplete for roles in another server. -This is needed, as discords built in search only searches the server where the command is executed in. -*/ - -module.exports.run = async (searchInput, guildId) => { - // if (searchInput.length <= 2) return []; - - const guild = client.guilds.cache.find((guild) => guild.id === guildId); - if (!guild) return [{ name: 'Define server first.', value: '0' }]; - - const roles = guild.roles.cache; - - // id search - if (searchInput !== '' && !isNaN(searchInput)) { - const found = roles.find((role) => role.id === searchInput); - if (found) return [{ name: found.name, value: found.id }]; - return [{ name: 'Unkown', value: searchInput }]; - } - - // text search - const channelReply = await roles - .filter((role) => role.name.toLowerCase().search(searchInput.toLowerCase()) !== -1) - .map((role) => ({ name: role.name, value: role.id })); - return channelReply.slice(0, 24); -}; - -module.exports.data = { - name: 'server', -}; diff --git a/functions/AUTOCOMPLETE/RESOLVE/server.js b/functions/AUTOCOMPLETE/RESOLVE/server.js deleted file mode 100644 index 18527ad..0000000 --- a/functions/AUTOCOMPLETE/RESOLVE/server.js +++ /dev/null @@ -1,27 +0,0 @@ -/* -This function provides a autocomplete for a full serverlist. -Discord doesn't provide a functionality for that. -*/ - -module.exports.run = async (searchInput) => { - if (searchInput.length <= 2) return []; - - const guilds = client.guilds.cache; - - // id search - if (!isNaN(searchInput)) { - const found = guilds.find((guild) => guild.id === searchInput); - if (found) return [{ name: found.name, value: found.id }]; - return [{ name: 'Unkown', value: searchInput }]; - } - - // text search - const guildReply = await guilds - .filter((guild) => guild.name.toLowerCase().search(searchInput.toLowerCase()) !== -1) - .map((guild) => ({ name: guild.name, value: guild.id })); - return guildReply.slice(0, 24); -}; - -module.exports.data = { - name: 'server', -}; diff --git a/functions/AUTOCOMPLETE/guildmgr.js b/functions/AUTOCOMPLETE/guildmgr.js deleted file mode 100644 index 7e42513..0000000 --- a/functions/AUTOCOMPLETE/guildmgr.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports.run = async (interaction) => { - // check maintainer permissions - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id)) { - interaction.respond([{ name: `You are not authorized to use \`/${module.exports.data.name}\``, value: '0' }]); - return; - } - - const command = interaction.options.getFocused(true); - const guild = interaction.options.getString('server'); - const response = await client.functions.get(`AUTOCOMPLETE_RESOLVE_${command.name}`).run(command.value, guild).catch(ERR); - return interaction.respond(response); -}; - -module.exports.data = { - name: 'guildmgr', -}; diff --git a/functions/AUTOCOMPLETE/syncbans.js b/functions/AUTOCOMPLETE/syncbans.js deleted file mode 100644 index fe545b8..0000000 --- a/functions/AUTOCOMPLETE/syncbans.js +++ /dev/null @@ -1,18 +0,0 @@ -// TODO: better implementation of duplicate code - -module.exports.run = async (interaction) => { - // check maintainer permissions - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id)) { - interaction.respond([{ name: `You are not authorized to use \`/${module.exports.data.name}\``, value: '0' }]); - return; - } - - const command = interaction.options.getFocused(true); - const guild = interaction.options.getString('server'); - const response = await client.functions.get(`AUTOCOMPLETE_RESOLVE_${command.name}`).run(command.value, guild).catch(ERR); - return interaction.respond(response); -}; - -module.exports.data = { - name: 'syncbans', -}; diff --git a/functions/CHECK/DB/perms.js b/functions/CHECK/DB/perms.js deleted file mode 100644 index 56cf24c..0000000 --- a/functions/CHECK/DB/perms.js +++ /dev/null @@ -1,20 +0,0 @@ -const Maintainer = require('../../../database/models/Maintainer'); - -const ParticipatingServer = require('../../../database/models/ParticipatingServer'); - -// TODO: pass interaction to use #memberPermissions -module.exports.run = async (userID, type, serverID, member) => { - switch (type || 'maintainer') { - case 'maintainer': return Maintainer.findOne({ where: { userID } }).catch(ERR); - case 'staff': - const serverSettings = await ParticipatingServer.findOne({ where: { serverID } }).catch(ERR); - const output = await member.roles.cache.find((role) => role.id === serverSettings.teamRoleID); - return output; - default: - return 'null'; - } -}; - -module.exports.data = { - name: 'perms', -}; diff --git a/functions/EVENT/guildBanAdd.js b/functions/EVENT/guildBanAdd.js deleted file mode 100644 index 0e87a6a..0000000 --- a/functions/EVENT/guildBanAdd.js +++ /dev/null @@ -1,116 +0,0 @@ -// TODO: better message implementation - -const { MessageEmbed } = require('discord.js'); - -const Ban = require('../../database/models/Ban'); - -// const ParticipatingServer = require('../database/models/ParticipatingServer'); - -async function sendMessage(channel, body, title, color, footer) { - // needs to be local as settings overlap from dofferent embed-requests - const embed = new MessageEmbed(); - - if (body) embed.setDescription(body); - if (title) embed.setTitle(title); - if (color) embed.setColor(color); - if (footer) embed.setFooter({ text: footer }); - - return channel.send({ embeds: [embed] }); -} - -// checks if server is partisipating server -function getServerEntry(serverID) { - return client.functions.get('GET_DB_registered').run(serverID, true); -} - -// creates a embed messagetemplate for succeded actions -async function messageBanSuccess(channelID, body) { - const channel = await client.channels.cache.get(channelID); - sendMessage(channel, body, 'A user has been banned!', 'GREEN', 'The ban has been recorded and other servers are getting warned!'); -} - -// creates a embed messagetemplate for failed actions -async function messageBannedUserInGuild(channelID, userTag, userID, banReason, serverName) { - const channel = await client.channels.cache.get(channelID); - sendMessage(channel, - `Tag: \`${userTag}\` - ID: \`${userID}\` - Reason: \`\`\`${banReason || 'none'}\`\`\``, - `A user on your server has been banned on '${serverName}'!`, - 'ORANGE', - `For more information and other bans and warns use '/lookup ${userID}'`); -} - -// warns other servers for aliases -async function messageBannedAliasUserInGuild(channelID, userTag, userID, warnReason, serverName, orgUserTag) { - const channel = await client.channels.cache.get(channelID); - const body = `**The user \`${userTag}\` is an alias of a user that has been banned!** - - Tag: \`${orgUserTag}\` - ID: \`${userID}\` - Reason: \`\`\`${warnReason || 'none'}\`\`\``; - const title = `A alias of a user on your server has been banned on '${serverName}'!`; - const footer = `For more information and other bans and warns use '/lookup ${orgUserTag}'`; - sendMessage(channel, body, title, 'ORANGE', footer); -} - -module.exports.run = async ({ guild, user }) => { - // check if server is setup - if (!await client.functions.get('GET_DB_registered').run(guild.id, false)) return; - // outside of ban due to followup code - const userID = user.id; - const userTag = user.tag; - const serverID = guild.id; - - // checking if user is AB - if (userID === client.user.id) return; - // check if server is blacklsited before sending api request - const bannedGuild = await getServerEntry(serverID); - if (bannedGuild.blocked) return; - // declaring so ban reason can be used in foreach loop - // getting newly added ban - const ban = await guild.bans.fetch(user); - // assign simpler values - const userBanned = '1'; - const reason = ban.reason; - // fix ban reason by filtering new line breaks - const fixedReason = reason === null ? reason : reason.replace(new RegExp('\'', 'g'), '`'); - // create of find DB entry - const [banEntry] = await Ban.findOrCreate({ - where: { userID, serverID }, - defaults: { userTag, reason: fixedReason, userBanned }, - }).catch(ERR); - // check if entry is already on DB - if (await !banEntry.isNewRecord) { - // update DB entry - Ban.update({ reason: fixedReason, userTag, userBanned }, - { where: { userTag, userID, serverID } }) - .catch(ERR); - } - // logic, to only output if not banned, is active and has a log channel - if (bannedGuild && bannedGuild.active && bannedGuild.logChannelID) { - messageBanSuccess(bannedGuild.logChannelID, `The user \`${userTag}\` with the ID \`${userID}\` has been banned from this server!\nReason: \`${fixedReason}\``); - } - // post for other servers - let aliases = await user.client.functions.get('GET_DB_alias').run(userID); - if (!aliases) aliases = [userID]; - aliases.forEach((toCheckUserID) => { - user.client.guilds.cache.forEach(async (toTestGuild) => { - if (guild.id === toTestGuild.id) return; - const serverMember = toTestGuild.members.cache.get(toCheckUserID); - // TODO: warn own server that there are aliases - if (!serverMember) return; - const serverID = toTestGuild.id; - const infectedGuild = await getServerEntry(serverID); - if (infectedGuild && infectedGuild.blocked) return; - if (infectedGuild && infectedGuild.active && infectedGuild.logChannelID) { - if (userID === toCheckUserID) messageBannedUserInGuild(infectedGuild.logChannelID, userTag, userID, fixedReason, guild.name); - else messageBannedAliasUserInGuild(infectedGuild.logChannelID, serverMember.user.tag, userID, fixedReason, guild.name, userTag); - } - }); - }); -}; - -module.exports.data = { - name: 'guildBanAdd', -}; diff --git a/functions/EVENT/guildBanRemove.js b/functions/EVENT/guildBanRemove.js deleted file mode 100644 index 438fafa..0000000 --- a/functions/EVENT/guildBanRemove.js +++ /dev/null @@ -1,15 +0,0 @@ -const Ban = require('../../database/models/Ban'); - -module.exports.run = async ({ guild, user }) => { - // check if server is setup - if (!await client.functions.get('GET_DB_registered').run(guild.id, false)) return; - // setting userBanned value to false for existing ban - const userID = user.id; - const serverID = guild.id; - // update ban-DB entry - Ban.update({ userBanned: false }, { where: { userID, serverID } }).catch(ERR); -}; - -module.exports.data = { - name: 'guildBanRemove', -}; diff --git a/functions/EVENT/guildCreate.js b/functions/EVENT/guildCreate.js deleted file mode 100644 index 8cfdc78..0000000 --- a/functions/EVENT/guildCreate.js +++ /dev/null @@ -1,61 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -const Ban = require('../../database/models/Ban'); - -const ParticipatingServer = require('../../database/models/ParticipatingServer'); - -// checks if server is participating server -function getServerEntry(serverID) { - return client.functions.get('GET_DB_registered').run(serverID, true); -} - -async function addServerEntry(serverID, serverName) { - await ParticipatingServer.findOrCreate({ where: { serverID, serverName } }).catch(ERR); -} - -module.exports.run = async (guild) => { - // debug protection - if (DEBUG) return; - const serverID = guild.id; - // check if was alreads added: add a server entry in the DB - if (!await getServerEntry(serverID)) await addServerEntry(serverID, guild.name); - // message owner about adding the bot and how to procceed - const owner = await guild.members.fetch(guild.ownerId); - const embed = new MessageEmbed() - .setTitle('Hello World!') - .setFooter({ text: 'Only you received this message.' }) - .setDescription(`Thanks for adding me to your delightful server. -Before you expect anything from me, I need you to complete some more steps before I get completely functional. - -In order to use me properly, you need to run the following commands in your server: -\`/guild setup\` -Then I will ask you for a log channel, where I am allowed to send messages, and a staff/team role that are authorized to use some of the commands. -After you run the command you need to confirm the Terms of Service and you are good to go! - -If you added our bot before already: Keep in mind, that you need to run \`/guild enable\` to use the old configuration. - -As the last step, it's recommended joining our Discord server for frequent updates or if there are questions about a ban. -We also gladly help you out, if you need any assistance with the bot. https://discord.gg/TqBwHtzzhD`); - owner.send({ embeds: [embed] }); - // add all bans to DB - const allBans = await guild.bans.fetch(); - allBans.forEach(async ({ user, reason }) => { - const regex = config.emojiLayout; - const userTag = user.tag.replace(regex, 'X'); - const userBanned = true; - const userID = user.id; - let fixedReason = reason; - if (reason !== null) fixedReason = reason.replace(new RegExp('\'', 'g'), '`'); - const [banEntry] = await Ban.findOrCreate({ - where: { userID, serverID }, - defaults: { reason: fixedReason, userTag, userBanned }, - }).catch(ERR); - if (!banEntry.isNewRecord) { - Ban.update({ reason: fixedReason, userBanned }, { where: { userID, serverID } }).catch(ERR); - } - }); -}; - -module.exports.data = { - name: 'guildCreate', -}; diff --git a/functions/EVENT/guildDelete.js b/functions/EVENT/guildDelete.js deleted file mode 100644 index 1db2a23..0000000 --- a/functions/EVENT/guildDelete.js +++ /dev/null @@ -1,20 +0,0 @@ -const ParticipatingServer = require('../../database/models/ParticipatingServer'); - -// removes a server from the ParticipatingServers table -async function removeServer(serverID) { - const success = await ParticipatingServer.update( - { active: false }, - { where: { serverID, active: true } }, - ).catch(ERR); - return success[0]; -} - -module.exports.run = async (guild) => { - // check if server is setup - if (!await client.functions.get('GET_DB_registered').run(guild.id, false)) return; - await removeServer(guild.id); -}; - -module.exports.data = { - name: 'guildDelete', -}; diff --git a/functions/EVENT/guildMemberAdd.js b/functions/EVENT/guildMemberAdd.js deleted file mode 100644 index 86e20e9..0000000 --- a/functions/EVENT/guildMemberAdd.js +++ /dev/null @@ -1,78 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -const Ban = require('../../database/models/Ban'); - -const Warn = require('../../database/models/Warn'); - -// checks if server is participating server -function getServerEntry(serverID) { - return client.functions.get('GET_DB_registered').run(serverID, false); -} - -// get log channel of server -function findLogChannel(logChannelID) { - return client.channels.cache.find((channel) => channel.id === logChannelID); -} - -async function sendMessage(channel, body, title, color, footer) { - // needs to be local as settings overlap from dofferent embed-requests - const embed = new MessageEmbed(); - - if (body) embed.setDescription(body); - if (title) embed.setTitle(title); - if (color) embed.setColor(color); - if (footer) embed.setFooter({ text: footer }); - - return channel.send({ embeds: [embed] }); -} - -// send message when user is banned -async function prepareMessage(serverID, userID, userTag, userBans, userWarns, alias, orgUserTag) { - const server = await getServerEntry(serverID); - const logChannelID = server.logChannelID; - const logChannel = await findLogChannel(logChannelID); - const serverName = server.serverName; - - // update title, when alias - const title = alias ? `Alias of '${orgUserTag}'` : `Known user joined '${serverName}'`; - - sendMessage(logChannel, `tag: \`${userTag}\` - ID: \`${userID}\` - bans: \`${userBans}\` - warns: \`${userWarns}\` - For more information use \`/lookup ${userID}\``, title, 'ORANGE'); -} - -module.exports.run = async (member) => { - // check if server is setup - if (!await client.functions.get('GET_DB_registered').run(member.guild.id, false)) return; - // record user tag - client.functions.get('SET_DB_userTagRecord').run(member.id, member.user.tag); - // check if user is banned on some server - const [serverID, orgUserID, orgUserTag] = [member.guild.id, member.id, member.user.tag]; - // get all bans and warnings the joined user has - const userBans = await Ban.count({ where: { userID: orgUserID } }).catch(ERR); - const userWarns = await Warn.count({ where: { userID: orgUserID } }).catch(ERR); - // calculate sum and check if sum is 0 - const overallAmmount = userBans + userWarns; - if (overallAmmount === 0) return; - // post message - prepareMessage(serverID, orgUserID, orgUserTag, userBans, userWarns); - - // lookup aliases - // check if user has aliases - const output = await client.functions.get('GET_DB_alias').run(member.id); - if (output) { - output.forEach(async (aliasUserID) => { - if (orgUserID === aliasUserID) return; - const aliasUser = await client.users.fetch(aliasUserID, false).catch(ERR); - const aliasUserBans = await Ban.count({ where: { userID: aliasUserID } }).catch(ERR); - const aliasUserWarns = await Warn.count({ where: { userID: aliasUserID } }).catch(ERR); - prepareMessage(serverID, aliasUserID, aliasUser.tag, aliasUserBans, aliasUserWarns, true, orgUserTag); - }); - } -}; - -module.exports.data = { - name: 'guildMemberAdd', -}; diff --git a/functions/EVENT/interaction/isAutocomplete.js b/functions/EVENT/interaction/isAutocomplete.js deleted file mode 100644 index c59b397..0000000 --- a/functions/EVENT/interaction/isAutocomplete.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports.run = async (interaction) => { - // const commandName = DEBUG ? interaction.commandName.replace('_dev', '') : interaction.commandName; - const commandName = interaction.commandName.replace('_dev', ''); - return client.functions.get(`AUTOCOMPLETE_${commandName}`).run(interaction).catch(ERR); -}; - -module.exports.data = { - name: 'isAutocomplete', -}; diff --git a/functions/EVENT/interaction/isCommand.js b/functions/EVENT/interaction/isCommand.js deleted file mode 100644 index 1aa293f..0000000 --- a/functions/EVENT/interaction/isCommand.js +++ /dev/null @@ -1,44 +0,0 @@ -async function checkServerBlockStatus(serverID) { - const ParticipatingServer = require('../../../database/models/ParticipatingServer'); - const found = await ParticipatingServer.findOne({ where: { serverID, blocked: true } }).catch(ERR); - return found; -} - -module.exports.run = async (interaction) => { - // debug protection - if (!DEBUG && interaction.commandName.includes('_dev')) return; - if (DEBUG && !interaction.commandName.includes('_dev')) return; - - const mainCMD = interaction.commandName.replace('_dev', ''); - // commands to let through, when guild is blocked - const infoCMDs = ['about', 'ping']; - // check if blocked - if (!infoCMDs.includes(mainCMD) && await checkServerBlockStatus(interaction.guild.id)) { - messageFail(interaction, 'It seems your server got blocked from the bot usage. If you want to know the reason and/or want to appeal, feel free to join the server linked in /about.'); - return; - } - // commands to block, when guild has not been setup yet - const mgmtCMDs = ['alias', 'ban', 'broadcast', 'eval', 'lookup', 'maintainer', 'warn']; - // check if active and if its a management command - if (mgmtCMDs.includes(mainCMD) && !await client.functions.get('GET_DB_server').run(interaction.guild.id, false)) { - messageFail(interaction, - `You need to setup the server first before you can use this command. - Please run \`/guild setup\`. - If you need help, please view the respective wiki article here (https://github.com/FlippedCode/agent-black/wiki/Adding-the-Bot) - or join our support server (https://discord.gg/TqBwHtzzhD).`); - return; - } - - const command = client.commands.get(DEBUG ? mainCMD : interaction.commandName); - if (command) { - // if debuging trigger application thinking - // TEMP: set to false to test some public commands - if (DEBUG) await interaction.deferReply({ ephemeral: false }); - command.run(interaction).catch(ERR); - return; - } -}; - -module.exports.data = { - name: 'isCommand', -}; diff --git a/functions/EVENT/interactionCreate.js b/functions/EVENT/interactionCreate.js deleted file mode 100644 index 9f291e4..0000000 --- a/functions/EVENT/interactionCreate.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports.run = async (interaction) => { - // only guild command - // TODO: check if neseccary, because this seems to be a useless intent 'DIRECT_MESSAGES' - // TODO: maybe check if command deployment to DM can be supressed - if (!await interaction.inGuild()) return messageFail(interaction, 'The bot is for server-use only.'); - - // autocomplete hanlder - if (interaction.isAutocomplete()) return client.functions.get('EVENT_interaction_isAutocomplete').run(interaction).catch(ERR); - // command handler - if (interaction.isCommand()) return client.functions.get('EVENT_interaction_isCommand').run(interaction).catch(ERR); -}; - -module.exports.data = { - name: 'interactionCreate', -}; diff --git a/functions/GET/DB/alias.js b/functions/GET/DB/alias.js deleted file mode 100644 index 4151c21..0000000 --- a/functions/GET/DB/alias.js +++ /dev/null @@ -1,28 +0,0 @@ -const UserAlias = require('../../../database/models/UserAlias'); - -async function getGroupID(userID) { - const found = await UserAlias.findOne({ where: { userID } }) - .catch(ERR); - return found; -} - -async function getUserIDs(groupingID) { - const found = await UserAlias.findAll({ where: { groupingID } }) - .catch(ERR); - return found; -} - -module.exports.run = async (userID) => { - const groupID = await getGroupID(userID); - if (!groupID) return; - const users = await getUserIDs(groupID.groupingID); - return users.map((user) => user.userID); -}; - -module.exports.data = { - name: 'alias', -}; - -// update table to make pairs and check then for the pair, makes easyer sql questioning -// when adding a user, check if user OR ALIAS is already in a pair and add the new user to it -// when both users are in a pair throw error diff --git a/functions/GET/DB/registered.js b/functions/GET/DB/registered.js deleted file mode 100644 index e7c9bf9..0000000 --- a/functions/GET/DB/registered.js +++ /dev/null @@ -1,10 +0,0 @@ -const ParticipatingServer = require('../../../database/models/ParticipatingServer'); - -module.exports.run = async (serverID, onlyCheckEntry) => { - if (onlyCheckEntry) return ParticipatingServer.findOne({ where: { serverID } }).catch(ERR); - return ParticipatingServer.findOne({ where: { serverID, active: true, blocked: false } }).catch(ERR); -}; - -module.exports.data = { - name: 'registered', -}; diff --git a/functions/GET/DB/server.js b/functions/GET/DB/server.js deleted file mode 100644 index 3545d8a..0000000 --- a/functions/GET/DB/server.js +++ /dev/null @@ -1,14 +0,0 @@ -const ParticipatingServer = require('../../../database/models/ParticipatingServer'); - -module.exports.run = async (serverID, onlyCheckEntry) => { - if (onlyCheckEntry) { - return ParticipatingServer.findOne({ where: { serverID } }) - .catch(ERR); - } - return ParticipatingServer.findOne({ where: { serverID, active: true, blocked: false } }) - .catch(ERR); -}; - -module.exports.help = { - name: 'server', -}; diff --git a/functions/HEARTBEAT/BOTLIST/botsondiscord.js b/functions/HEARTBEAT/BOTLIST/botsondiscord.js deleted file mode 100644 index 17bbafe..0000000 --- a/functions/HEARTBEAT/BOTLIST/botsondiscord.js +++ /dev/null @@ -1,24 +0,0 @@ -const axios = require('axios'); - -function sendHeartbeat() { - axios({ - method: 'post', - url: `${config.functions.heartbeat.discordbotlist.endpoint}${client.id}/guilds`, - headers: { - Authorization: process.env.token_botsondiscord, - 'Content-Type': 'application/json', - 'User-Agent': `FurExplicitBot/${config.package.version} by Phil | Flipper#3621 on Discord`, - }, - data: { guildCount: client.guilds.cache.size }, - }); -} - -module.exports.run = async () => { - setInterval(() => { - sendHeartbeat(); - }, config.functions.heartbeat.discordbotlist.interval); -}; - -module.exports.data = { - name: 'botsondiscord', -}; diff --git a/functions/HEARTBEAT/BOTLIST/discordbotlist.js b/functions/HEARTBEAT/BOTLIST/discordbotlist.js deleted file mode 100644 index 76d0ec4..0000000 --- a/functions/HEARTBEAT/BOTLIST/discordbotlist.js +++ /dev/null @@ -1,23 +0,0 @@ -const axios = require('axios'); - -function sendHeartbeat() { - axios({ - method: 'post', - url: `${config.functions.heartbeat.discordbotlist.endpoint}${client.id}/stats`, - headers: { - Authorization: process.env.token_discordbotlist, - 'User-Agent': `FurExplicitBot/${config.package.version} by Phil | Flipper#3621 on Discord`, - }, - data: { guilds: client.guilds.cache.size }, - }); -} - -module.exports.run = async () => { - setInterval(() => { - sendHeartbeat(); - }, config.functions.heartbeat.discordbotlist.interval); -}; - -module.exports.data = { - name: 'discordbotlist', -}; diff --git a/functions/HEARTBEAT/BOTLIST/discordlist.js b/functions/HEARTBEAT/BOTLIST/discordlist.js deleted file mode 100644 index ef88fcd..0000000 --- a/functions/HEARTBEAT/BOTLIST/discordlist.js +++ /dev/null @@ -1,24 +0,0 @@ -const axios = require('axios'); - -function sendHeartbeat() { - axios({ - method: 'post', - url: `${config.functions.heartbeat.discordbotlist.endpoint}${client.id}`, - headers: { - Authorization: process.env.token_discordlist, - 'Content-Type': 'application/json', - 'User-Agent': `FurExplicitBot/${config.package.version} by Phil | Flipper#3621 on Discord`, - }, - data: { serverCount: client.guilds.cache.size }, - }); -} - -module.exports.run = async () => { - setInterval(() => { - sendHeartbeat(); - }, config.functions.heartbeat.discordbotlist.interval); -}; - -module.exports.data = { - name: 'discordlist', -}; diff --git a/functions/HEARTBEAT/BOTLIST/discords.js b/functions/HEARTBEAT/BOTLIST/discords.js deleted file mode 100644 index 814a4cd..0000000 --- a/functions/HEARTBEAT/BOTLIST/discords.js +++ /dev/null @@ -1,24 +0,0 @@ -const axios = require('axios'); - -function sendHeartbeat() { - axios({ - method: 'post', - url: `${config.functions.heartbeat.discordbotlist.endpoint}${client.id}`, - headers: { - Authorization: process.env.token_discords, - // 'Content-Type': 'application/json', - 'User-Agent': `FurExplicitBot/${config.package.version} by Phil | Flipper#3621 on Discord`, - }, - data: { server_count: client.guilds.cache.size }, - }); -} - -module.exports.run = async () => { - setInterval(() => { - sendHeartbeat(); - }, config.functions.heartbeat.discordbotlist.interval); -}; - -module.exports.data = { - name: 'discords', -}; diff --git a/functions/HEARTBEAT/BOTLIST/disordbots.js b/functions/HEARTBEAT/BOTLIST/disordbots.js deleted file mode 100644 index 3c6d390..0000000 --- a/functions/HEARTBEAT/BOTLIST/disordbots.js +++ /dev/null @@ -1,24 +0,0 @@ -const axios = require('axios'); - -function sendHeartbeat() { - axios({ - method: 'post', - url: `${config.functions.heartbeat.discordbotlist.endpoint}${client.id}/stats`, - headers: { - Authorization: process.env.token_discordbots, - 'Content-Type': 'application/json', - 'User-Agent': `FurExplicitBot/${config.package.version} by Phil | Flipper#3621 on Discord`, - }, - data: { guildCount: client.guilds.cache.size }, - }); -} - -module.exports.run = async () => { - setInterval(() => { - sendHeartbeat(); - }, config.functions.heartbeat.discordbotlist.interval); -}; - -module.exports.data = { - name: 'disordbots', -}; diff --git a/functions/HEARTBEAT/BOTLIST/motiondevelopment.js b/functions/HEARTBEAT/BOTLIST/motiondevelopment.js deleted file mode 100644 index c6d2eb1..0000000 --- a/functions/HEARTBEAT/BOTLIST/motiondevelopment.js +++ /dev/null @@ -1,24 +0,0 @@ -const axios = require('axios'); - -function sendHeartbeat() { - axios({ - method: 'post', - url: `${config.functions.heartbeat.motiondevelopment.endpoint}${client.id}/stats`, - headers: { - key: process.env.token_motiondevelopment, - 'Content-Type': 'application/json', - // 'User-Agent': `FurExplicitBot/${config.package.version} by Phil | Flipper#3621 on Discord`, - }, - data: { guilds: client.guilds.cache.size }, - }); -} - -module.exports.run = async () => { - setInterval(() => { - sendHeartbeat(); - }, config.functions.heartbeat.motiondevelopment.interval); -}; - -module.exports.data = { - name: 'motiondevelopment', -}; diff --git a/functions/HEARTBEAT/uptime.js b/functions/HEARTBEAT/uptime.js deleted file mode 100644 index 9482ae7..0000000 --- a/functions/HEARTBEAT/uptime.js +++ /dev/null @@ -1,23 +0,0 @@ -// TODO: use vanilla implementation so not an entire packige is needed -const axios = require('axios'); - -const params = (pingRaw) => ( - { - msg: 'OK', - ping: Math.round(pingRaw), - } -); - -function sendHeartbeat() { - axios.get(`${config.functions.heartbeat.uptime.endpoint}${process.env.token_uptime}`, { params: params(client.ws.ping) }); -} - -module.exports.run = async () => { - setInterval(() => { - sendHeartbeat(); - }, config.functions.heartbeat.uptime.interval); -}; - -module.exports.data = { - name: 'uptime', -}; diff --git a/functions/SET/DB/userTagRecord.js b/functions/SET/DB/userTagRecord.js deleted file mode 100644 index 09c3429..0000000 --- a/functions/SET/DB/userTagRecord.js +++ /dev/null @@ -1,29 +0,0 @@ -const config = require('../../../config/main.json'); - -const UserIDAssociation = require('../../../database/models/UserIDAssociation'); - -const cachedUsers = new Set(); - -function timeout(id) { - cachedUsers.add(id); - setTimeout(() => cachedUsers.delete(id), config.functions.userTagRecord.maxCacheTimeout); -} - -module.exports.run = async (userID, userTag) => { - // return in discriminator is "#0000" - if (userTag.indexOf('#0000') !== -1) return; - // check if user has said anything in the last 3hrs - if (cachedUsers.has(userID)) return; - // if not, add it - timeout(userID); - // and add entry to DB if not yet existent - UserIDAssociation.findOrCreate({ - where: { userID }, - defaults: { userTag }, - }) - .catch(ERR); -}; - -module.exports.data = { - name: 'userTagRecord', -}; diff --git a/functions/SETUP/heartbeat.js b/functions/SETUP/heartbeat.js deleted file mode 100644 index 6a7b9d5..0000000 --- a/functions/SETUP/heartbeat.js +++ /dev/null @@ -1,21 +0,0 @@ -// Calls all the functions that are needed for a heartbeat -module.exports.run = async () => { - if (DEBUG) return; - console.log(`[${module.exports.data.name}] Start sending heartbeats...`); - // botlists - // TODO: Better implementation: call on startup or when servercount changes - // TODO: Generelize function as all are quite simmilar - // client.functions.get('HEARTBEAT_BOTLIST_botsondiscord').run(); - // client.functions.get('HEARTBEAT_BOTLIST_discordbotlist').run(); - // client.functions.get('HEARTBEAT_BOTLIST_discordlist').run(); - // client.functions.get('HEARTBEAT_BOTLIST_discords').run(); - // client.functions.get('HEARTBEAT_BOTLIST_discordbots').run(); - // client.functions.get('HEARTBEAT_BOTLIST_motiondevelopment').run(); - // uptime page - // client.functions.get('HEARTBEAT_uptime').run(); -}; - -module.exports.data = { - name: 'heartbeat', - callOn: '-', -}; diff --git a/functions/SETUP/offlineStat.js b/functions/SETUP/offlineStat.js deleted file mode 100644 index 4ec5025..0000000 --- a/functions/SETUP/offlineStat.js +++ /dev/null @@ -1,41 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -const toTime = require('pretty-ms'); - -const startupTime = +new Date(); - -const OfflineStat = require('../../database/models/OfflineStat'); - -module.exports.run = async () => { - if (DEBUG) return; - console.log(`[${module.exports.data.name}] Posting bot status message!`); - const embed = new MessageEmbed() - .setTitle('AgentBlack - Bot back online!') - .setColor('GREEN') - .setFooter({ text: client.user.tag, iconURL: client.user.displayAvatarURL }) - .setTimestamp(); - const offlineTime = await OfflineStat.findOne({ where: { ID: 1 } }).catch(ERR); - if (offlineTime) { - embed - .addField('The time the bot went offline:', `${toTime(startupTime - offlineTime.time * 1)}`, false) - .addField('The bot went offline at:', `${new Date(offlineTime.time * 1)}`, false); - } else { - embed.setDescription('The time that the bot was offline, is missing. A new entry got created!'); - } - client.channels.cache.get(config.logChannel).send({ embeds: [embed] }); - - setInterval(async () => { - // loop db update in 5 sec intervall - const [offlineStat] = await OfflineStat.findOrCreate({ - where: { ID: 1 }, defaults: { time: startupTime }, - }).catch(ERR); - if (!offlineStat.isNewRecord) { - OfflineStat.update({ time: +new Date() }, { where: { ID: 1 } }).catch(ERR); - } - }, 1 * 5000); -}; - -module.exports.data = { - name: 'offlineStat', - callOn: 'setup', -}; diff --git a/functions/SETUP/status.js b/functions/SETUP/status.js deleted file mode 100644 index 8dcbb8b..0000000 --- a/functions/SETUP/status.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports.run = async () => { - if (DEBUG) return; - console.log(`[${module.exports.data.name}] Setting status...`); - await client.user.setStatus('online'); - // const membercount = await client.guilds.cache.reduce((previousCount, currentGuild) => previousCount + currentGuild.memberCount, 0); - // TODO: update activity message, maybe with servercount, once reached 100 servers - await client.user.setActivity('with /help'); - console.log(`[${module.exports.data.name}] Status set!`); -}; - -module.exports.data = { - name: 'status', - callOn: '-', -}; diff --git a/functions/STARTUP/DBConnection.js b/functions/STARTUP/DBConnection.js deleted file mode 100644 index bb0ca34..0000000 --- a/functions/STARTUP/DBConnection.js +++ /dev/null @@ -1,24 +0,0 @@ -const Sequelize = require('sequelize'); - -module.exports.run = () => { - console.log('[DB] Connecting...'); - - const sequelize = new Sequelize( - process.env.DBName, - process.env.DBUsername, - process.env.DBPassword, - { - host: process.env.DBHost, - dialect: 'mysql', - logging: DEBUG ? console.log : false, - }, - ); - sequelize.query('SET NAMES utf8mb4;'); - console.log('[DB] Connected!'); - - global.sequelize = sequelize; -}; - -module.exports.data = { - name: 'DBConnection', -}; diff --git a/functions/STARTUP/initCommands.js b/functions/STARTUP/initCommands.js deleted file mode 100644 index 3a794b1..0000000 --- a/functions/STARTUP/initCommands.js +++ /dev/null @@ -1,64 +0,0 @@ -const Path = require('path'); - -const files = []; - -function getFiles(fs, Directory) { - fs.readdirSync(Directory).forEach((File) => { - const Absolute = Path.join(Directory, File); - if (fs.statSync(Absolute).isDirectory()) return getFiles(fs, Absolute); - files.push(Absolute); - }); - return files; -} - -module.exports.run = async (fs) => { - // create empty array to store command submittions - const commandsSubmit = []; - // get all command files - const files = await getFiles(fs, './commands/'); - // only get file with '.js' - const jsfiles = files.filter((f) => f.split('.').pop() === 'js'); - const cmdLength = jsfiles.length; - // check if commands are there - if (cmdLength <= 0) return console.log(`[${module.exports.data.name}] No command(s) to load!`); - // announcing command loading - if (DEBUG) console.log(`[${module.exports.data.name}] Loading ${cmdLength} command${cmdLength !== 1 ? 's' : ''}...`); - - // adding all commands - await jsfiles.forEach((f, i) => { - // get module functions and info - const probs = require(`../../${f}`); - // cleanup name - const cleanName = f - .replace(/\\|\//g, '_') - .replace('commands_', '') - .replace('.js', ''); - // abort entry if in disabled folder - if (cleanName.search('archive_') !== -1) return; - // announcing command loading - if (DEBUG) console.log(`[${module.exports.data.name}] ${i + 1}) Loaded: ${cleanName}!`); - // adding command to collection - client.commands.set(cleanName, probs); - // if not subcommand: adding command to submittion to discord - if (!probs.data.subcommand) commandsSubmit.push(probs.data.toJSON()); - }); - const registerLength = commandsSubmit.length; - - await console.log(`[${module.exports.data.name}] Loaded ${cmdLength} command${cmdLength !== 1 ? 's' : ''}!`); - await console.log(`[${module.exports.data.name}] Registering ${registerLength} command${registerLength !== 1 ? 's' : ''}...`); - // submit commands to discord api| Dev: one guild only, prod: globaly - // WARN: TODO: make sure it doesn't disable the production commands while in debug mode - if (DEBUG) { - const changedCommands = commandsSubmit.map((command) => { - const newCommand = command; - newCommand.name = `${command.name}_dev`; - return newCommand; - }); - await client.application.commands.set(changedCommands, process.env.devGuild).catch(ERR); - } else await client.application.commands.set(commandsSubmit).catch(ERR); - console.log(`[${module.exports.data.name}] ${registerLength} command${registerLength !== 1 ? 's' : ''} registered!`); -}; - -module.exports.data = { - name: 'initCommands', -}; diff --git a/functions/STARTUP/initFunctions.js b/functions/STARTUP/initFunctions.js deleted file mode 100644 index a46182a..0000000 --- a/functions/STARTUP/initFunctions.js +++ /dev/null @@ -1,46 +0,0 @@ -const Path = require('path'); - -const files = []; - -// read directory with functions -function getFiles(fs, Directory) { - fs.readdirSync(Directory).forEach((File) => { - const Absolute = Path.join(Directory, File); - if (fs.statSync(Absolute).isDirectory()) return getFiles(fs, Absolute); - files.push(Absolute); - }); - return files; -} - -module.exports.run = async (fs) => { - // get all function files - const files = await getFiles(fs, './functions/'); - // only get file with '.js' - const jsfiles = files.filter((f) => f.split('.').pop() === 'js'); - const funcLength = jsfiles.length; - // check if functions are there - if (jsfiles.length <= 0) return console.log(`[${module.exports.data.name}] No function(s) to load!`); - - if (DEBUG) console.log(`[${module.exports.data.name}] Loading ${funcLength} function${funcLength !== 1 ? 's' : ''}...`); - - // adding all functions - jsfiles.forEach((f, i) => { - const probs = require(`../../${f}`); - // cleanup name - const cleanName = f - .replace(/\\|\//g, '_') - .replace('functions_', '') - .replace('.js', ''); - // abort entry if in disabled folder - if (cleanName.search('archive_') !== -1) return; - if (DEBUG) console.log(`[${module.exports.data.name}] ${i + 1}) Loaded: ${cleanName}!`); - // adding function to collection - client.functions.set(cleanName, probs); - }); - - console.log(`[${module.exports.data.name}] Loaded ${funcLength} function${funcLength !== 1 ? 's' : ''}!`); -}; - -module.exports.data = { - name: 'initFunctions', -}; diff --git a/functions/archive/CMD_punish_add.js b/functions/archive/CMD_punish_add.js deleted file mode 100644 index f7e6bb9..0000000 --- a/functions/archive/CMD_punish_add.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_add', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punish_list.js b/functions/archive/CMD_punish_list.js deleted file mode 100644 index acce195..0000000 --- a/functions/archive/CMD_punish_list.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_list', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punish_listPunnishments.js b/functions/archive/CMD_punish_listPunnishments.js deleted file mode 100644 index 20bd6d0..0000000 --- a/functions/archive/CMD_punish_listPunnishments.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_listPunishments', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punish_manualAdd.js b/functions/archive/CMD_punish_manualAdd.js deleted file mode 100644 index d91e789..0000000 --- a/functions/archive/CMD_punish_manualAdd.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_manualAdd', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punish_manualRemove.js b/functions/archive/CMD_punish_manualRemove.js deleted file mode 100644 index 086ea58..0000000 --- a/functions/archive/CMD_punish_manualRemove.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_manualRemove', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punish_remove.js b/functions/archive/CMD_punish_remove.js deleted file mode 100644 index 3b3490b..0000000 --- a/functions/archive/CMD_punish_remove.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_remove', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punish_stats.js b/functions/archive/CMD_punish_stats.js deleted file mode 100644 index 6e1f1bd..0000000 --- a/functions/archive/CMD_punish_stats.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_stats', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punish_userStats.js b/functions/archive/CMD_punish_userStats.js deleted file mode 100644 index 65f5d3f..0000000 --- a/functions/archive/CMD_punish_userStats.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punish_userStats', - parent: 'punish', -}; diff --git a/functions/archive/CMD_punishsettings_addPunnishment.js b/functions/archive/CMD_punishsettings_addPunnishment.js deleted file mode 100644 index 0b826a3..0000000 --- a/functions/archive/CMD_punishsettings_addPunnishment.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punishsettings_addPunishment', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_addReason.js b/functions/archive/CMD_punishsettings_addReason.js deleted file mode 100644 index 9c0831f..0000000 --- a/functions/archive/CMD_punishsettings_addReason.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punishsettings_addReason', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_enable.js b/functions/archive/CMD_punishsettings_enable.js deleted file mode 100644 index 0499aa4..0000000 --- a/functions/archive/CMD_punishsettings_enable.js +++ /dev/null @@ -1,56 +0,0 @@ -const ServerSetting = require('../../database/models/ServerSetting'); - -// adds server if not existent -async function createServer(serverID) { - const created = await ServerSetting.findOrCreate({ where: { serverID } }).catch(ERR); - return created; -} - -// checks is server is on list -async function checkServer(serverID) { - const found = await ServerSetting.findOne({ where: { serverID } }) - .catch(ERR); - return found; -} - -// enables points system -async function enablePointsSystem(serverID) { - const enabled = await ServerSetting.update({ pointsSystemEnabled: true }, - { where: { serverID } }) - .catch(ERR); - return enabled; -} - -// disables points system -async function disablePointsSystem(serverID) { - const disabled = await ServerSetting.update({ pointsSystemEnabled: false }, - { where: { serverID } }) - .catch(ERR); - return disabled; -} - -module.exports.run = async (message, args, config, prefix) => { - const serverID = message.guild.id; - const [subcmd, enable] = args; - const lowercaseEnable = enable.toLowerCase(); - // check if value is a bool - if (!(lowercaseEnable === 'true' || lowercaseEnable === 'false')) { - messageFail(message, CommandUsage(config.prefix, module.exports.help.parent, 'enable TRUEORFALSE')); - return; - } - // check if server exists in list and create it - const serverExist = await checkServer(serverID); - if (!serverExist) await createServer(serverID); - // set value - let messageState = 'disabled'; - if (lowercaseEnable === 'true') { - await enablePointsSystem(serverID); - messageState = 'enabled'; - } else await disablePointsSystem(serverID); - messageSuccess(message, `Successfully ${messageState} setting.`); -}; - -module.exports.help = { - name: 'CMD_punishsettings_enable', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_forceReason.js b/functions/archive/CMD_punishsettings_forceReason.js deleted file mode 100644 index 943327c..0000000 --- a/functions/archive/CMD_punishsettings_forceReason.js +++ /dev/null @@ -1,40 +0,0 @@ -const ServerSetting = require('../../database/models/ServerSetting'); - -// enables points system -async function enableForceReason(serverID) { - const enabled = await ServerSetting.update({ pointsSystemForceReason: true }, - { where: { serverID } }) - .catch(ERR); - return enabled; -} - -// disables points system -async function disableForceReason(serverID) { - const disabled = await ServerSetting.update({ pointsSystemForceReason: false }, - { where: { serverID } }) - .catch(ERR); - return disabled; -} - -module.exports.run = async (message, args, config, prefix) => { - const [subcmd, enable] = args; - const lowercaseEnable = enable.toLowerCase(); - const serverID = message.guild.id; - // check if value is a bool - if (!(lowercaseEnable === 'true' || lowercaseEnable === 'false')) { - messageFail(message, CommandUsage(config.prefix, module.exports.help.parent, 'forceReason TRUEORFALSE')); - return; - } - // set value - let messageState = 'disabled'; - if (lowercaseEnable === 'true') { - await enableForceReason(serverID); - messageState = 'enabled'; - } else await disableForceReason(serverID); - messageSuccess(message, `Successfully ${messageState} setting.`); -}; - -module.exports.help = { - name: 'CMD_punishsettings_forceReason', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_listPunnishment.js b/functions/archive/CMD_punishsettings_listPunnishment.js deleted file mode 100644 index dca529e..0000000 --- a/functions/archive/CMD_punishsettings_listPunnishment.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punishsettings_listPunishment', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_listReasons.js b/functions/archive/CMD_punishsettings_listReasons.js deleted file mode 100644 index 5a843ad..0000000 --- a/functions/archive/CMD_punishsettings_listReasons.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punishsettings_listReasons', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_listSettings.js b/functions/archive/CMD_punishsettings_listSettings.js deleted file mode 100644 index ab8a7c2..0000000 --- a/functions/archive/CMD_punishsettings_listSettings.js +++ /dev/null @@ -1,42 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -const ServerSetting = require('../../database/models/ServerSetting'); - -// gets server settings -async function getSettings(serverID) { - const found = await ServerSetting.findOne({ where: { serverID } }) - .catch(ERR); - return found; -} - -module.exports.run = async (message, args, config, prefix) => { - const serverID = message.guild.id; - const serverSettings = await getSettings(serverID); - // prepare message - const embed = new MessageEmbed() - .setTitle('Punishment Settings') - .addFields([ - { - name: 'enable', - value: serverSettings.pointsSystemEnabled, - inline: true, - }, - { - name: 'forceReason', - value: serverSettings.pointsSystemForceReason, - inline: true, - }, - { - name: 'pointLifetime', - value: serverSettings.pointLifetime, - inline: true, - }, - ]); - // send it - message.channel.send(embed); -}; - -module.exports.help = { - name: 'CMD_punishsettings_listSettings', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_pointLifetime.js b/functions/archive/CMD_punishsettings_pointLifetime.js deleted file mode 100644 index 6cebc31..0000000 --- a/functions/archive/CMD_punishsettings_pointLifetime.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punishsettings_pointLifetime', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_removePunnishment.js b/functions/archive/CMD_punishsettings_removePunnishment.js deleted file mode 100644 index 62416df..0000000 --- a/functions/archive/CMD_punishsettings_removePunnishment.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punishsettings_removePunishment', - parent: 'punishsettings', -}; diff --git a/functions/archive/CMD_punishsettings_removeReason.js b/functions/archive/CMD_punishsettings_removeReason.js deleted file mode 100644 index af99885..0000000 --- a/functions/archive/CMD_punishsettings_removeReason.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports.run = async (message, args, config, prefix) => { - -}; - -module.exports.help = { - name: 'CMD_punishsettings_removeReason', - parent: 'punishsettings', -}; diff --git a/functions/archive/FUNC_checkUserPunishment.js b/functions/archive/FUNC_checkUserPunishment.js deleted file mode 100644 index 461ac5e..0000000 --- a/functions/archive/FUNC_checkUserPunishment.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports.run = async () => { - // lookup if threshhold has been passed - // check if passed - // check if ongoing punishment is already in process with same punishmentID - // return result -}; - -module.exports.help = { - name: 'FUNC_checkPermissionsDBPunishment', -}; diff --git a/functions/archive/FUNC_userPunishmentHandler.js b/functions/archive/FUNC_userPunishmentHandler.js deleted file mode 100644 index ba78ca1..0000000 --- a/functions/archive/FUNC_userPunishmentHandler.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports.run = async (fromTicker, comamnd) => { - // if "fromTicker" is true, dont checkuserPunishment and use "command" - // call checkUserPunishment, return: if not exist, then - // create punishment entry - // get punishment command and values - // get server specific values (RoleID, serverID, ...) - // call correct command: Ban, temp-ban, Unban, kick, assignRole, removeRole - // if code for commands is small, use functions. if too big use own file functions -}; - -module.exports.help = { - name: 'FUNC_createUserPunishment', -}; diff --git a/functions/archive/TCKR_punishmentTimer.js b/functions/archive/TCKR_punishmentTimer.js deleted file mode 100644 index b170c4f..0000000 --- a/functions/archive/TCKR_punishmentTimer.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports.run = async () => { - // check all 5 mins: - // remove time from all punishments - // if punishment is beyond 0: Delete entry; call FUNC_userPunishmentHandler with opposite command -}; - -module.exports.help = { - name: 'TCKR_punishmentTimer', -}; diff --git a/functions/globalFuncs.js b/functions/globalFuncs.js deleted file mode 100644 index d04dbda..0000000 --- a/functions/globalFuncs.js +++ /dev/null @@ -1,33 +0,0 @@ -global.messageFail = async (interaction, body, color, ephemeral) => { - const sentMessage = await client.functions.get('richEmbedMessage') - .run(interaction, body, '', color || 'RED', false, ephemeral || true); - return sentMessage; -}; - -global.messageSuccess = async (interaction, body, color, ephemeral) => { - const sentMessage = await client.functions.get('richEmbedMessage') - .run(interaction, body, '', color || 'GREEN', false, ephemeral || false); - return sentMessage; -}; - -// raw reply to commands -global.reply = (interaction, payload, followUp = false) => { - if (followUp) return interaction.followUp(payload); - // check if message needs to be edited or if its a first reply - if (interaction.deferred || interaction.replied) return interaction.editReply(payload); - return interaction.reply(payload); -}; - -global.prettyCheck = (question) => { - if (question) return '✅'; - return '❌'; -}; - -global.date = (date) => { - const newTimestamp = new Date(date).getTime() / 1000; - return ``; -}; - -module.exports.data = { - name: 'globalFunc', -}; diff --git a/functions/richEmbedMessage.js b/functions/richEmbedMessage.js deleted file mode 100644 index ce6509c..0000000 --- a/functions/richEmbedMessage.js +++ /dev/null @@ -1,24 +0,0 @@ -const { MessageEmbed } = require('discord.js'); - -module.exports.run = async (interaction, body, title, color, footer, ephemeral) => { - // needs to be local as settings overlap from dofferent embed-requests - const embed = new MessageEmbed(); - - if (body) embed.setDescription(body); - if (title) embed.setTitle(title); - if (color) embed.setColor(color); - if (footer) embed.setFooter({ text: footer }); - - const options = { - embeds: [embed], - components: [], - ephemeral: String(ephemeral) ? ephemeral : true, - }; - - return reply(interaction, options).catch(ERR); - // return channel.send(embed); -}; - -module.exports.data = { - name: 'richEmbedMessage', -}; diff --git a/index.js b/index.js deleted file mode 100644 index 2b94457..0000000 --- a/index.js +++ /dev/null @@ -1,100 +0,0 @@ -// init Discord -const { Client, Intents, Collection } = require('discord.js'); -// init file system -const fs = require('fs'); -// init command builder -const { SlashCommandBuilder } = require('@discordjs/builders'); -// setting essential global values -// init Discord client -global.client = new Client({ - disableEveryone: true, - intents: [ - Intents.FLAGS.GUILDS, - Intents.FLAGS.GUILD_MEMBERS, - Intents.FLAGS.GUILD_BANS, - Intents.FLAGS.GUILD_EMOJIS_AND_STICKERS, - Intents.FLAGS.GUILD_MESSAGES, - Intents.FLAGS.DIRECT_MESSAGES, - ], -}); -// init config -global.config = require('./config.json'); - -global.DEBUG = process.env.NODE_ENV === 'development'; - -global.CmdBuilder = SlashCommandBuilder; - -global.ERR = (err) => { - console.error('ERROR:', err); - if (DEBUG) return; - const { MessageEmbed } = require('discord.js'); - const stack = err.stack.length > 4000 ? `${err.stack.slice(0, 4000)}...` : err.stack; - const embed = new MessageEmbed() - .setAuthor({ name: `Error: '${err.message}'` }) - .setDescription(`STACKTRACE:\n\`\`\`${stack}\`\`\``) - .setColor('RED'); - // client.channels.fetch(config.logChannel).send({ embeds: [embed] }); - client.channels.cache.get(config.logChannel).send({ embeds: [embed] }); - return; -}; - -// creating collections -client.commands = new Collection(); -client.functions = new Collection(); - -// anouncing debug mode -if (DEBUG) console.log(`[${config.name}] Bot is on Debug-Mode. Some functions are not going to be loaded.`); - -// Login the bot -client.login(process.env.DCtoken) -// TODO: cleanup - .then(() => { - // import Functions and Commands; startup database connection - fs.readdirSync('./functions/STARTUP').forEach((FCN) => { - if (FCN.search('.js') === -1) return; - const INIT = require(`./functions/STARTUP/${FCN}`); - INIT.run(fs); - }); - }); - -client.on('ready', async () => { - // confirm user logged in - console.log(`[${config.name}] Logged in as "${client.user.tag}"!`); - - // setup tables - console.log('[DB] Syncing tables...'); - await sequelize.sync(); - await console.log('[DB] Done syncing!'); - - // run startup functions - config.setup.setupFunctions.forEach((FCN) => { - client.functions.get(FCN).run(config); - }); -}); - -// EVENT user gets banned -client.on('guildBanAdd', (ban) => client.functions.get('EVENT_guildBanAdd').run(ban)); - -// EVENT user gets unbanned -client.on('guildBanRemove', (ban) => client.functions.get('EVENT_guildBanRemove').run(ban)); - -// user joins the server -client.on('guildMemberAdd', (member) => client.functions.get('EVENT_guildMemberAdd').run(member)); - -// bot joins the server -client.on('guildCreate', (guild) => client.functions.get('EVENT_guildCreate').run(guild)); - -// bot leaves the server -client.on('guildDelete', (guild) => client.functions.get('EVENT_guildDelete').run(guild)); - -// TODO: check what information is shared without message intent, so tag recording is still possible -// // record user tag -// client.functions.get('SET_DB_userTagRecord').run(member.id, member.user.tag); - -// itneraction is triggered (command, autocomplete, etc.) -client.on('interactionCreate', (interaction) => client.functions.get('EVENT_interactionCreate').run(interaction)); - -// logging errors and warns -client.on('error', (ERR)); -client.on('warn', (ERR)); -process.on('uncaughtException', (ERR)); diff --git a/package-lock.json b/package-lock.json index 9b9a228..dfd4a71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,64 +1,151 @@ { "name": "agent-black", - "version": "3.0.0", + "version": "4.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "agent-black", - "version": "3.0.0", + "version": "4.0.0", "license": "MIT", "dependencies": { - "@discordjs/builders": "^0.12.0", - "axios": "^0.26.1", - "bufferutil": "^4.0.5", - "discord.js": "^13.6.0", - "html-to-image": "^1.6.2", - "mysql2": "^2.3.2", - "pretty-ms": "^5.1.0", - "sequelize": "^6.9.0", - "utf-8-validate": "^5.0.7" + "axios": "1.4.0", + "bufferutil": "4.0.7", + "bunyan": "1.8.15", + "discord.js": "^14.11.1-dev.1686398626-6c2242f.0", + "html-to-image": "1.11.11", + "mysql2": "3.3.1", + "pretty-ms": "8.0.0", + "sequelize": "6.31.1", + "utf-8-validate": "6.0.3" }, "devDependencies": { - "eslint": "8.23.0", + "@types/bunyan": "1.8.8", + "@types/node": "20.2.5", + "@typescript-eslint/eslint-plugin": "5.59.6", + "@typescript-eslint/parser": "5.59.6", + "eslint": "8.40.0", "eslint-config-airbnb-base": "15.0.0", - "eslint-plugin-import": "2.26.0" + "eslint-config-prettier": "8.8.0", + "eslint-plugin-import": "2.27.5", + "husky": "8.0.3", + "lint-staged": "13.2.2", + "prettier": "2.8.8" + } + }, + "node_modules/@discordjs/collection": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", + "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==", + "engines": { + "node": ">=16.9.0" } }, - "node_modules/@discordjs/builders": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.12.0.tgz", - "integrity": "sha512-Vx2MjUZd6QVo1uS2uWt708Fd6cHWGFblAvbpL5EBO+kLl0BADmPwwvts+YJ/VfSywed6Vsk6K2cEooR/Ytjhjw==", + "node_modules/@discordjs/formatters": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", + "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", "dependencies": { - "@sindresorhus/is": "^4.3.0", - "discord-api-types": "^0.26.1", - "ts-mixer": "^6.0.0", - "tslib": "^2.3.1", - "zod": "^3.11.6" + "discord-api-types": "^0.37.41" }, "engines": { "node": ">=16.9.0" } }, - "node_modules/@discordjs/collection": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", - "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==", + "node_modules/@discordjs/formatters/node_modules/discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + }, + "node_modules/@discordjs/rest": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", + "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", + "dependencies": { + "@discordjs/collection": "^1.5.1", + "@discordjs/util": "^0.3.0", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.4.2", + "discord-api-types": "^0.37.41", + "file-type": "^18.3.0", + "tslib": "^2.5.0", + "undici": "^5.22.0" + }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + }, + "node_modules/@discordjs/util": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", + "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/ws": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", + "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "dependencies": { + "@discordjs/collection": "^1.5.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.4", + "@vladfrangu/async_event_emitter": "^2.2.1", + "discord-api-types": "^0.37.41", + "tslib": "^2.5.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/ws/node_modules/discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.2", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -72,30 +159,29 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -151,57 +237,322 @@ } }, "node_modules/@sapphire/async-queue": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", - "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==", + "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/@sindresorhus/is": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", - "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==", - "engines": { - "node": ">=10" + "node_modules/@sapphire/shapeshift": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.0.tgz", + "integrity": "sha512-iJpHmjAdwX9aSL6MvFpVyo+tkokDtInmSjoJHbz/k4VJfnim3DjvG0hgGEKWtWZgCu45RaLgcoNgR1fCPdIz3w==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "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/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@types/bunyan": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", + "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "node_modules/@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true }, - "node_modules/@types/node-fetch": { - "version": "2.5.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", - "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } + "node_modules/@types/validator": { + "version": "13.7.17", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", + "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "node_modules/@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dependencies": { "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.6", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "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/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -219,6 +570,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^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==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -235,6 +599,33 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -259,27 +650,35 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -299,14 +698,33 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -315,30 +733,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -357,9 +798,9 @@ } }, "node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -368,6 +809,34 @@ "node": ">=6.14.2" } }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "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/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -406,6 +875,43 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -424,6 +930,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -435,11 +947,20 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "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=", - "dev": true + "devOptional": true }, "node_modules/confusing-browser-globals": { "version": "1.0.10", @@ -462,9 +983,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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" }, @@ -484,29 +1005,33 @@ "dev": true }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "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==", "engines": { "node": ">=0.4.0" } }, "node_modules/denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "engines": { "node": ">=0.10" } @@ -523,62 +1048,51 @@ "node": ">=8" } }, - "node_modules/discord-api-types": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", - "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/discord.js": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz", - "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==", - "dependencies": { - "@discordjs/builders": "^0.11.0", - "@discordjs/collection": "^0.4.0", - "@sapphire/async-queue": "^1.1.9", - "@types/node-fetch": "^2.5.12", - "@types/ws": "^8.2.2", - "discord-api-types": "^0.26.0", - "form-data": "^4.0.0", - "node-fetch": "^2.6.1", - "ws": "^8.4.0" + "version": "14.11.1-dev.1686398626-6c2242f.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.1-dev.1686398626-6c2242f.0.tgz", + "integrity": "sha512-KCLYvTCKR3T9WuXjcaIaLhSObLiiepJ8Z6fwSK1AZLpFzVKjJSO0HrSz3XRw/iFRf8iUz6Ryzpy4ZC4b/eTg2A==", + "dependencies": { + "@discordjs/builders": "^1.6.3", + "@discordjs/collection": "^1.5.1", + "@discordjs/formatters": "^0.3.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@discordjs/ws": "^0.8.3", + "@sapphire/snowflake": "^3.5.1", + "@types/ws": "^8.5.4", + "discord-api-types": "^0.37.42", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.5.2", + "undici": "^5.22.1", + "ws": "^8.13.0" }, "engines": { - "node": ">=16.6.0", - "npm": ">=7.0.0" + "node": ">=16.9.0" } }, "node_modules/discord.js/node_modules/@discordjs/builders": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", - "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", - "dependencies": { - "@sindresorhus/is": "^4.2.0", - "discord-api-types": "^0.26.0", - "ts-mixer": "^6.0.0", - "tslib": "^2.3.1", - "zod": "^3.11.6" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", + "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", + "dependencies": { + "@discordjs/formatters": "^0.3.1", + "@discordjs/util": "^0.3.1", + "@sapphire/shapeshift": "^3.8.2", + "discord-api-types": "^0.37.41", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.5.0" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": ">=16.9.0" } }, - "node_modules/discord.js/node_modules/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==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -597,32 +1111,71 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -631,6 +1184,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -661,39 +1237,41 @@ } }, "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -701,7 +1279,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -744,14 +1321,27 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -764,16 +1354,20 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -786,23 +1380,25 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "engines": { @@ -813,12 +1409,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -833,16 +1429,19 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -850,42 +1449,21 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/find-up": { @@ -959,14 +1537,14 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -975,19 +1553,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -1026,16 +1595,38 @@ "node": ">=0.10.0" } }, + "node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "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==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1073,9 +1664,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -1093,6 +1684,22 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", + "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1105,18 +1712,6 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -1137,9 +1732,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -1155,10 +1750,19 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1180,11 +1784,32 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/generate-function": { "version": "2.3.1", @@ -1195,19 +1820,32 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -1257,9 +1895,9 @@ } }, "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1271,6 +1909,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1291,6 +1944,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -1310,9 +1975,9 @@ } }, "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1327,10 +1992,34 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" @@ -1355,9 +2044,33 @@ } }, "node_modules/html-to-image": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", - "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==" + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz", + "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } }, "node_modules/iconv-lite": { "version": "0.6.3", @@ -1370,10 +2083,29 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -1404,10 +2136,19 @@ "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/inflection": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", - "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", "engines": [ "node >= 0.4.0" ] @@ -1416,7 +2157,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1425,16 +2166,15 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -1442,6 +2182,20 @@ "node": ">= 0.4" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -1471,9 +2225,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -1483,9 +2237,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -1518,6 +2272,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1531,9 +2297,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" @@ -1552,9 +2318,9 @@ } }, "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -1566,6 +2332,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -1588,14 +2363,29 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -1626,13 +2416,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1644,6 +2453,16 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1669,9 +2488,9 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -1693,17 +2512,141 @@ "node": ">= 0.8.0" } }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lint-staged": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", "dev": true, "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": ">=4" + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/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==", + "dev": true + }, + "node_modules/listr2/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/lodash": { @@ -1717,10 +2660,93 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/long": { + "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/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/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==", + "dev": true + }, + "node_modules/log-update/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/lru-cache": { "version": "6.0.0", @@ -1733,6 +2759,12 @@ "node": ">=10" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1756,29 +2788,41 @@ } }, "node_modules/mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1790,7 +2834,19 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "devOptional": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } }, "node_modules/moment": { "version": "2.29.4", @@ -1816,17 +2872,59 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/mysql2": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.2.tgz", - "integrity": "sha512-JUSA50rt/nSew8aq8xe3pRk5Q4y/M5QdSJn7Ey3ndOlPp2KXuialQ0sS35DNhPT5Z5PnOiIwSSQvKkl1WorqRA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.1.tgz", + "integrity": "sha512-UD84/AvLwO5qmSABEsBTZ7y7JKv3sM8JzWGhuL4tDkJwVsClVVAcelNSR5Unyhxj6/KHBAkjS7qe5/c+gEmNvA==", "dependencies": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" }, @@ -1834,30 +2932,38 @@ "node": ">= 8.0" } }, + "node_modules/mysql2/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } + }, "node_modules/named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "dependencies": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" } }, "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" } }, - "node_modules/named-placeholders/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -1865,39 +2971,71 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" }, - "peerDependencies": { - "encoding": "^0.1.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1913,14 +3051,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -1945,14 +3083,14 @@ } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -1965,11 +3103,26 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, + "devOptional": true, "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -1987,37 +3140,19 @@ "node": ">= 0.8.0" } }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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==", "dev": true, "dependencies": { - "p-try": "^1.0.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" + "node": ">=10" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parent-module": { @@ -2033,27 +3168,21 @@ } }, "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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=", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -2082,6 +3211,23 @@ "node": ">=8" } }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pg-connection-string": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", + "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2094,6 +3240,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2103,29 +3261,44 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-ms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz", - "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", "dependencies": { - "parse-ms": "^2.1.0" + "parse-ms": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" @@ -2151,25 +3324,58 @@ } ] }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, + "node_modules/readable-stream": { + "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", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -2189,14 +3395,48 @@ "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", - "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { - "any-promise": "^1.3.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2207,6 +3447,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2245,15 +3491,63 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2270,40 +3564,58 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.9.0.tgz", - "integrity": "sha512-tFROh9T9GgyY6aTV2+aGdfVNvrppuTOo1EFln9AtV8wXJTOOr7Nan7pZum5oLy87CGWl0YeHzAwg99tz04OqNA==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.1.tgz", + "integrity": "sha512-cahWtRrYLjqoZP/aurGBoaxn29qQCF4bxkAUPEQ/ozjJjt6mtL4Q113S3N39mQRmX5fgxRbli+bzZARP/N51eg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], "dependencies": { - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.13.1", - "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", + "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", + "debug": "^4.3.3", + "dottie": "^2.0.2", + "inflection": "^1.13.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", + "moment-timezone": "^0.5.35", + "pg-connection-string": "^2.5.0", + "retry-as-promised": "^7.0.3", + "semver": "^7.3.5", + "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", - "uuid": "^8.1.0", - "validator": "^13.6.0", + "uuid": "^8.3.2", + "validator": "^13.7.0", "wkx": "^0.5.0" }, "engines": { "node": ">=10.0.0" }, "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, "mariadb": { "optional": true }, "mysql2": { "optional": true }, + "oracledb": { + "optional": true + }, "pg": { "optional": true }, "pg-hstore": { "optional": true }, + "snowflake-sdk": { + "optional": true + }, "sqlite3": { "optional": true }, @@ -2313,9 +3625,9 @@ } }, "node_modules/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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", "engines": { "node": ">= 10.0.0" } @@ -2355,6 +3667,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/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==", + "dev": true + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2364,35 +3682,151 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", "engines": { - "node": ">= 0.6" + "node": ">= 0.6" + } + }, + "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", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2419,6 +3853,18 @@ "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2431,6 +3877,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2461,6 +3923,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2473,20 +3941,31 @@ "node": ">=8.0" } }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "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=" }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "node_modules/ts-mixer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", - "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" }, "node_modules/tsconfig-paths": { "version": "3.14.1", @@ -2501,9 +3980,30 @@ } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/type-check": { "version": "0.4.0", @@ -2529,21 +4029,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "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/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2554,9 +4093,9 @@ } }, "node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.3.tgz", + "integrity": "sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==", "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -2565,6 +4104,11 @@ "node": ">=6.14.2" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -2581,20 +4125,6 @@ "node": ">= 0.10" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2626,6 +4156,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -2643,22 +4193,68 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "devOptional": true }, "node_modules/ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -2674,6 +4270,15 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -2685,44 +4290,104 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.11.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz", - "integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } }, "dependencies": { - "@discordjs/builders": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.12.0.tgz", - "integrity": "sha512-Vx2MjUZd6QVo1uS2uWt708Fd6cHWGFblAvbpL5EBO+kLl0BADmPwwvts+YJ/VfSywed6Vsk6K2cEooR/Ytjhjw==", + "@discordjs/collection": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", + "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==" + }, + "@discordjs/formatters": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", + "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", + "requires": { + "discord-api-types": "^0.37.41" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + } + } + }, + "@discordjs/rest": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", + "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", "requires": { - "@sindresorhus/is": "^4.3.0", - "discord-api-types": "^0.26.1", - "ts-mixer": "^6.0.0", - "tslib": "^2.3.1", - "zod": "^3.11.6" + "@discordjs/collection": "^1.5.1", + "@discordjs/util": "^0.3.0", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.4.2", + "discord-api-types": "^0.37.41", + "file-type": "^18.3.0", + "tslib": "^2.5.0", + "undici": "^5.22.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + } } }, - "@discordjs/collection": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", - "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==" + "@discordjs/util": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", + "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==" + }, + "@discordjs/ws": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", + "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "requires": { + "@discordjs/collection": "^1.5.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.4", + "@vladfrangu/async_event_emitter": "^2.2.1", + "discord-api-types": "^0.37.41", + "tslib": "^2.5.0", + "ws": "^8.13.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + } + } + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true }, "@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.2", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2730,23 +4395,23 @@ "strip-json-comments": "^3.1.1" } }, + "@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2786,14 +4451,51 @@ } }, "@sapphire/async-queue": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", - "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==" + "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.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.0.tgz", + "integrity": "sha512-iJpHmjAdwX9aSL6MvFpVyo+tkokDtInmSjoJHbz/k4VJfnim3DjvG0hgGEKWtWZgCu45RaLgcoNgR1fCPdIz3w==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + } }, - "@sindresorhus/is": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", - "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==" + "@sapphire/snowflake": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==" + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "@types/bunyan": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", + "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "requires": { + "@types/ms": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true }, "@types/json5": { "version": "0.0.29", @@ -2801,32 +4503,161 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true }, - "@types/node-fetch": { - "version": "2.5.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", - "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } + "@types/validator": { + "version": "13.7.17", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", + "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "@types/ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "requires": { "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.6", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@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==" + }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-jsx": { @@ -2836,6 +4667,16 @@ "dev": true, "requires": {} }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2848,6 +4689,23 @@ "uri-js": "^4.2.2" } }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2863,27 +4721,32 @@ "color-convert": "^2.0.1" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -2894,40 +4757,67 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true }, "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "requires": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "devOptional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2943,13 +4833,32 @@ } }, "bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "requires": { "node-gyp-build": "^4.3.0" } }, + "bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "requires": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "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" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2976,6 +4885,31 @@ "supports-color": "^7.1.0" } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2991,6 +4925,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2999,11 +4939,17 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "devOptional": true }, "confusing-browser-globals": { "version": "1.0.10", @@ -3023,9 +4969,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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" } @@ -3037,23 +4983,24 @@ "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "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==" }, "denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "dir-glob": { "version": "3.0.1", @@ -3064,48 +5011,45 @@ "path-type": "^4.0.0" } }, - "discord-api-types": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", - "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==" - }, "discord.js": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz", - "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==", - "requires": { - "@discordjs/builders": "^0.11.0", - "@discordjs/collection": "^0.4.0", - "@sapphire/async-queue": "^1.1.9", - "@types/node-fetch": "^2.5.12", - "@types/ws": "^8.2.2", - "discord-api-types": "^0.26.0", - "form-data": "^4.0.0", - "node-fetch": "^2.6.1", - "ws": "^8.4.0" + "version": "14.11.1-dev.1686398626-6c2242f.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.1-dev.1686398626-6c2242f.0.tgz", + "integrity": "sha512-KCLYvTCKR3T9WuXjcaIaLhSObLiiepJ8Z6fwSK1AZLpFzVKjJSO0HrSz3XRw/iFRf8iUz6Ryzpy4ZC4b/eTg2A==", + "requires": { + "@discordjs/builders": "^1.6.3", + "@discordjs/collection": "^1.5.1", + "@discordjs/formatters": "^0.3.1", + "@discordjs/rest": "^1.7.1", + "@discordjs/util": "^0.3.1", + "@discordjs/ws": "^0.8.3", + "@sapphire/snowflake": "^3.5.1", + "@types/ws": "^8.5.4", + "discord-api-types": "^0.37.42", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.5.2", + "undici": "^5.22.1", + "ws": "^8.13.0" }, "dependencies": { "@discordjs/builders": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", - "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", + "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", "requires": { - "@sindresorhus/is": "^4.2.0", - "discord-api-types": "^0.26.0", - "ts-mixer": "^6.0.0", - "tslib": "^2.3.1", - "zod": "^3.11.6" + "@discordjs/formatters": "^0.3.1", + "@discordjs/util": "^0.3.1", + "@sapphire/shapeshift": "^3.8.2", + "discord-api-types": "^0.37.41", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.5.0" } }, - "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==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } + "discord-api-types": { + "version": "0.37.42", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", + "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" } } }, @@ -3123,32 +5067,87 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, + "dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "optional": true, + "requires": { + "nan": "^2.14.0" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" } }, "es-to-primitive": { @@ -3169,39 +5168,41 @@ "dev": true }, "eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -3209,18 +5210,11 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3286,14 +5280,22 @@ } } }, + "eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "requires": {} + }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" }, "dependencies": { "debug": { @@ -3308,13 +5310,12 @@ } }, "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -3329,33 +5330,35 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { @@ -3367,62 +5370,45 @@ "esutils": "^2.0.2" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - } + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -3449,16 +5435,32 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, "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==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -3492,9 +5494,9 @@ "dev": true }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -3509,6 +5511,16 @@ "flat-cache": "^3.0.4" } }, + "file-type": { + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", + "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3518,15 +5530,6 @@ "to-regex-range": "^5.0.1" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -3544,14 +5547,23 @@ "dev": true }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3570,10 +5582,22 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "generate-function": { @@ -3585,16 +5609,23 @@ } }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" } }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -3629,14 +5660,23 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3651,6 +5691,15 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -3667,9 +5716,9 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -3678,10 +5727,25 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-tostringtag": { @@ -3694,9 +5758,21 @@ } }, "html-to-image": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", - "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==" + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz", + "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true }, "iconv-lite": { "version": "0.6.3", @@ -3706,10 +5782,15 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "import-fresh": { @@ -3728,16 +5809,22 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": 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==", + "dev": true + }, "inflection": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", - "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==" + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, + "devOptional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3746,20 +5833,30 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -3780,15 +5877,15 @@ } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "requires": { "has": "^1.0.3" @@ -3809,6 +5906,12 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3819,9 +5922,9 @@ } }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -3831,14 +5934,20 @@ "dev": true }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -3855,9 +5964,18 @@ } }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "is-string": { @@ -3878,13 +5996,26 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, "isexe": { @@ -3893,6 +6024,12 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3915,9 +6052,9 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -3933,14 +6070,101 @@ "type-check": "~0.4.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, + "lint-staged": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "dev": true, + "requires": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "dependencies": { + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true + } + } + }, + "listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.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==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, "lodash": { @@ -3954,10 +6178,74 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.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==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "lru-cache": { "version": "6.0.0", @@ -3967,6 +6255,12 @@ "yallist": "^4.0.0" } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3984,23 +6278,29 @@ } }, "mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" } }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "devOptional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4009,7 +6309,16 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "devOptional": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "optional": true, + "requires": { + "minimist": "^1.2.6" + } }, "moment": { "version": "2.29.4", @@ -4029,68 +6338,134 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, "mysql2": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.2.tgz", - "integrity": "sha512-JUSA50rt/nSew8aq8xe3pRk5Q4y/M5QdSJn7Ey3ndOlPp2KXuialQ0sS35DNhPT5Z5PnOiIwSSQvKkl1WorqRA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.1.tgz", + "integrity": "sha512-UD84/AvLwO5qmSABEsBTZ7y7JKv3sM8JzWGhuL4tDkJwVsClVVAcelNSR5Unyhxj6/KHBAkjS7qe5/c+gEmNvA==", "requires": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" + }, + "dependencies": { + "lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==" + } } }, "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "requires": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "dependencies": { "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true }, "node-gyp-build": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-keys": { @@ -4100,14 +6475,14 @@ "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -4123,25 +6498,34 @@ } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, + "devOptional": true, "requires": { "wrappy": "1" } }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -4156,30 +6540,15 @@ "word-wrap": "^1.2.3" } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "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==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "aggregate-error": "^3.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4190,21 +6559,15 @@ } }, "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" - }, - "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==" }, "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=", - "dev": true + "devOptional": true }, "path-key": { "version": "3.1.1", @@ -4224,35 +6587,57 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" + }, + "pg-connection-string": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", + "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, "pretty-ms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz", - "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", "requires": { - "parse-ms": "^2.1.0" + "parse-ms": "^3.0.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "queue-microtask": { @@ -4261,19 +6646,42 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true + "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" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + } + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -4284,20 +6692,50 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": 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==", + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "requires": { - "any-promise": "^1.3.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } } }, + "retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -4316,15 +6754,46 @@ "queue-microtask": "^1.2.2" } }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "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-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "requires": { "lru-cache": "^6.0.0" } @@ -4335,29 +6804,32 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.9.0.tgz", - "integrity": "sha512-tFROh9T9GgyY6aTV2+aGdfVNvrppuTOo1EFln9AtV8wXJTOOr7Nan7pZum5oLy87CGWl0YeHzAwg99tz04OqNA==", + "version": "6.31.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.1.tgz", + "integrity": "sha512-cahWtRrYLjqoZP/aurGBoaxn29qQCF4bxkAUPEQ/ozjJjt6mtL4Q113S3N39mQRmX5fgxRbli+bzZARP/N51eg==", "requires": { - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.13.1", - "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", + "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", + "debug": "^4.3.3", + "dottie": "^2.0.2", + "inflection": "^1.13.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", + "moment-timezone": "^0.5.35", + "pg-connection-string": "^2.5.0", + "retry-as-promised": "^7.0.3", + "semver": "^7.3.5", + "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", - "uuid": "^8.1.0", - "validator": "^13.6.0", + "uuid": "^8.3.2", + "validator": "^13.7.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==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==" }, "shebang-command": { "version": "2.0.0", @@ -4385,35 +6857,119 @@ "object-inspect": "^1.9.0" } }, + "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==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + } + } + }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" }, + "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-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -4431,12 +6987,27 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4458,6 +7029,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4467,20 +7044,24 @@ "is-number": "^7.0.0" } }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, "toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, "ts-mixer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", - "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" }, "tsconfig-paths": { "version": "3.14.1", @@ -4495,9 +7076,26 @@ } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } }, "type-check": { "version": "0.4.0", @@ -4514,18 +7112,44 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "peer": true + }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, + "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" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4536,13 +7160,18 @@ } }, "utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.3.tgz", + "integrity": "sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==", "requires": { "node-gyp-build": "^4.3.0" } }, + "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", @@ -4553,20 +7182,6 @@ "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "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", @@ -4589,6 +7204,20 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -4603,16 +7232,52 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "devOptional": true }, "ws": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "requires": {} }, "yallist": { @@ -4620,16 +7285,17 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true - }, - "zod": { - "version": "3.11.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz", - "integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg==" } } } diff --git a/package.json b/package.json index 1c36c7b..a6a23b4 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,49 @@ { "name": "agent-black", - "version": "3.0.0", - "main": "index.js", + "description": "A Discord ban management bot.", + "version": "4.0.0", + "main": "dist/index.js", "dependencies": { - "@discordjs/builders": "^0.12.0", - "axios": "^0.26.1", - "bufferutil": "^4.0.5", - "discord.js": "^13.6.0", - "html-to-image": "^1.6.2", - "mysql2": "^2.3.2", - "pretty-ms": "^5.1.0", - "sequelize": "^6.9.0", - "utf-8-validate": "^5.0.7" + "axios": "1.4.0", + "bufferutil": "4.0.7", + "bunyan": "1.8.15", + "discord.js": "14.11.1-dev.1686398626-6c2242f.0", + "html-to-image": "1.11.11", + "mysql2": "3.3.1", + "pretty-ms": "8.0.0", + "sequelize": "6.31.1", + "utf-8-validate": "6.0.3" }, "devDependencies": { - "eslint": "8.23.0", + "@types/bunyan": "1.8.8", + "@types/node": "20.2.5", + "@typescript-eslint/eslint-plugin": "5.59.6", + "@typescript-eslint/parser": "5.59.6", + "eslint": "8.40.0", "eslint-config-airbnb-base": "15.0.0", - "eslint-plugin-import": "2.26.0" + "eslint-config-prettier": "8.8.0", + "eslint-plugin-import": "2.27.5", + "husky": "8.0.3", + "lint-staged": "13.2.2", + "prettier": "2.8.8" }, "scripts": { - "start": "node index.js" + "build": "npx tsc -v -b", + "lint": "eslint . --ext .ts", + "prepare": "husky install" }, "keywords": [], - "author": "phil", + "author": { + "name": "Phil", + "url": "https://github.com/FlipperLP" + }, + "contributors": [ + { + "email": "tavi@tavis.page", + "name": "Tavi", + "url": "https://tavis.page" + } + ], "license": "MIT", "repository": { "type": "git", @@ -32,5 +53,7 @@ "url": "https://github.com/FlipperLP/agent-black/issues" }, "homepage": "https://github.com/FlipperLP/agent-black#readme", - "description": "A Discord ban management bot." + "lint-staged": { + "*.ts": "eslint --cache --fix && prettier --write" + } } diff --git a/src/classes/banManager.ts b/src/classes/banManager.ts new file mode 100644 index 0000000..3e11a17 --- /dev/null +++ b/src/classes/banManager.ts @@ -0,0 +1,116 @@ +import { Guild, GuildBan, PermissionFlagsBits, UserFlags } from 'discord.js'; +import { Model, Sequelize } from 'sequelize'; + +/** + * @description Ban manager data + */ +type ManagerData = { + /** + * Array of bans + */ + bans: GuildBan[]; + /** + * Sequelize instance + */ + sequelize: Sequelize; +}; + +class BanManager { + /** + * @type {GuildBan[]} Array of bans + */ + bans: GuildBan[] = []; + /** + * @type {Sequelize} Sequelize instance + */ + sequelize: Sequelize; + + /** + * @param {ManagerData} data Data to initialize the manager with + */ + constructor(data: ManagerData) { + this.bans = data.bans; + if (!data.sequelize || data.sequelize instanceof Sequelize === false) + throw new SyntaxError('Invalid Sequelize instance'); + this.sequelize = data.sequelize; + } + + /** + * @description Adds bans to the manager + * @param {GuildBan[]} bans Bans to add to the manager + * @returns {Promise} Bans in the manager + */ + add(bans: GuildBan[]): Promise { + if (bans instanceof GuildBan === false) return Promise.reject('Invalid Ban instance'); + this.bans.push(...bans); + return Promise.resolve(this.bans); + } + + /** + * @async + * @description Adds all bans from a guild to the manager + * @param {Guild} guild Guild to add bans from + * @param {boolean} [cache=false] Should the manager cache the bans + * @returns {Promise} Bans in the manager + */ + async addGuildBans(guild: Guild, cache = false): Promise { + if (guild instanceof Guild === false) return Promise.reject('Invalid Guild instance'); + if (!guild.members.me?.permissions.has(PermissionFlagsBits.BanMembers)) + return Promise.reject('Missing BanMembers in guild'); + const bans = await guild.bans.fetch({ cache }); + this.bans.push(...bans.values()); + return Promise.resolve(this.bans); + } + + /** + * @private + * @description Removes invalid bans from the manager + * @returns {Promise} Bans in the manager + */ + clean(): Promise { + this.bans.forEach(async (ban) => { + if (ban.user.bot && (await ban.user.fetchFlags().then((f) => f.has(UserFlags.VerifiedBot)))) this.remove(ban); + }); + return Promise.resolve(this.bans); + } + + /** + * @description Syncs the manager with the database, adding bans that don't exist in the database + * @returns {Promise} Result from Sequelize + */ + sync(): Promise[]> { + this.clean(); // Clean bans + const p: Promise<[Model, boolean]>[] = []; + this.bans.forEach((ban) => { + p.push( + this.sequelize.models.Ban.findOrCreate({ + where: { + serverID: ban.guild.id, + userID: ban.user.id, + reason: ban.reason + }, + defaults: { + // userID: ban.user.id, + // serverID: ban.guild.id, + userTag: ban.user.tag + // reason: ban.reason, + } + }) + ); + }); + return Promise.allSettled(p); + } + + /** + * @description Removes a ban from the manager + * @param {GuildBan} ban Ban to remove from the manager + * @returns {Promise} Bans in the manager + */ + remove(ban: GuildBan): Promise { + if (ban instanceof GuildBan === false) return Promise.reject('Invalid Ban instance'); + this.bans.splice(this.bans.indexOf(ban), 1); + return Promise.resolve(this.bans); + } +} + +export { BanManager }; diff --git a/src/commands/about.ts b/src/commands/about.ts new file mode 100644 index 0000000..3536a31 --- /dev/null +++ b/src/commands/about.ts @@ -0,0 +1,16 @@ +import { CommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; +import { commands } from '../configs/config.json' assert { type: 'json' }; +import { readFileSync } from 'node:fs'; + +export const name = 'about'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Displays some information about the bot'); +export async function run(_client: CustomClient, interaction: CommandInteraction): Promise { + await interaction.deferReply({ ephemeral: true }); + interaction.editReply({ + embeds: [new EmbedBuilder().setDescription(readFileSync(commands.about).toString())] + }); + return Promise.resolve(); +} diff --git a/src/commands/alias.ts b/src/commands/alias.ts new file mode 100644 index 0000000..b8dccfe --- /dev/null +++ b/src/commands/alias.ts @@ -0,0 +1,55 @@ +import { CommandInteraction, CommandInteractionOptionResolver, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; + +export const name = 'alias'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Creates, updates, or removes an alias for a user') + .addSubcommand((subcommand) => { + return subcommand + .setName('add') + .setDescription('Adds an alias for a user') + .addUserOption((option) => { + return option.setName('user').setDescription('Primary user').setRequired(true); + }) + .addStringOption((option) => { + return option.setName('alias').setDescription('Alternative account').setRequired(true); + }); + }) + .addSubcommand((subcommand) => { + return subcommand + .setName('update') + .setDescription('Updates an alias') + .addStringOption((option) => { + return option.setName('aliasId').setDescription('Alias ID in the database').setRequired(true); + }) + .addStringOption((option) => { + return option.setName('alias').setDescription('New alternative account').setRequired(true); + }); + }) + .addSubcommand((subcommand) => { + return subcommand + .setName('remove') + .setDescription('Deletes an alias from the database') + .addUserOption((option) => { + return option.setName('aliasId').setDescription('Alias ID to delete').setRequired(true); + }); + }); +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + await interaction.deferReply({ ephemeral: true }); + const dbUser = await client.models?.User.findOne({ + where: { userId: interaction.user.id } + }); + if (!dbUser || dbUser.flags < 1) { + interaction.editReply({ + content: 'You are not authorized to use this command' + }); + return Promise.resolve(); + } + await client.commands?.get(`${name}_${options.getSubcommand()}`)?.run(client, interaction, options); + return Promise.resolve(); +} diff --git a/src/commands/alias/add.ts b/src/commands/alias/add.ts new file mode 100644 index 0000000..8e6c5e4 --- /dev/null +++ b/src/commands/alias/add.ts @@ -0,0 +1,77 @@ +import { Alias, AliasCreationAttributes } from '../../typings/Models.ts'; +import { Op, UniqueConstraintError } from 'sequelize'; +import { CustomClient } from '../../typings/Extensions.ts'; +import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; + +export default async function add( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + // Check if the alias already exists or exists in reverse + const alias = await client.models?.Alias.findOne({ + where: { + [Op.or]: [ + { + alternative: options.getUser('alias', true).id, + user: options.getUser('user', true).id + }, + { + alternative: options.getUser('user', true).id, + user: options.getUser('alias', true).id + } + ] + } + }); + if (alias !== null) { + interaction.editReply({ + content: 'The alias you attempted to set already exists' + }); + return Promise.resolve(); + } + // Check for inverse aliases + const inverse = await client.models?.Alias.findOne({ + where: { + user: options.getUser('alias', true).id, + alternative: options.getUser('user', true).id + } + }); + if (inverse !== null) { + interaction.editReply({ + content: 'The alias you attempted to set already exists' + }); + return Promise.resolve(); + } + // Create the alias + const attr: AliasCreationAttributes = { + user: options.getUser('user', true).id, + alternative: options.getUser('alias', true).id, + moderator: interaction.user.id + }; + await client.models?.Alias.create(attr).then( + (dbAlias: Alias) => { + if (!dbAlias) { + interaction.editReply({ + content: 'Failed to create the association in the database. Please try again later' + }); + return Promise.resolve(); + } + interaction.editReply({ + content: `Success! ${options.getUser('user', true).toString()} has been aliased to ${options + .getUser('alias', true) + .toString()} with ID \`${dbAlias.aliasId}\`` + }); + }, + (e: Error) => { + // Check for UniqueConstraintError + // Indicates that the user has already been alised to someone else + if (e instanceof UniqueConstraintError) { + interaction.editReply({ + content: 'The alternative account you attempted to alias already has an existing primary account' + }); + return Promise.resolve(); + } + interaction.editReply({ content: 'An unexpected error occurred while creating the alias. Please try again later' }); + } + ); +} diff --git a/src/commands/alias/remove.ts b/src/commands/alias/remove.ts new file mode 100644 index 0000000..7b2d31a --- /dev/null +++ b/src/commands/alias/remove.ts @@ -0,0 +1,23 @@ +import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export default async function remove( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const dbAlias = await client.models?.Alias.findOne({ + where: { aliasId: options.getString('aliasId', true) } + }); + if (!dbAlias) { + interaction.editReply({ + content: 'The alias you attempted to remove does not exist' + }); + return Promise.resolve(); + } + // Delete the alias + await dbAlias.destroy(); + interaction.editReply({ + content: `Success! Alias \`${dbAlias.aliasId}\` has been removed` + }); +} diff --git a/src/commands/alias/update.ts b/src/commands/alias/update.ts new file mode 100644 index 0000000..f901147 --- /dev/null +++ b/src/commands/alias/update.ts @@ -0,0 +1,25 @@ +import { CustomClient } from '../../typings/Extensions.ts'; +import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; + +export default async function ( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const dbAlias = await client.models?.Alias.findOne({ + where: { aliasId: options.getString('aliasId', true) } + }); + if (!dbAlias) { + interaction.editReply({ + content: 'The alias you attempted to update does not exist' + }); + return Promise.resolve(); + } + // Set the new alias + dbAlias.alternative = options.getUser('alias', true).id; + dbAlias.moderator = interaction.user.id; + await dbAlias.save(); + interaction.editReply({ + content: `Success! Alias \`${dbAlias.aliasId}\` has been updated` + }); +} diff --git a/src/commands/avatar.ts b/src/commands/avatar.ts new file mode 100644 index 0000000..c746f11 --- /dev/null +++ b/src/commands/avatar.ts @@ -0,0 +1,24 @@ +import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; + +export const name = 'avatar'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription("Fetches a user's profile picture") + .addUserOption((option) => { + return option.setName('user').setDescription('User to fetch').setRequired(true); + }); +export async function run( + _client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + await interaction.deferReply({ ephemeral: false }); + interaction.editReply({ + embeds: [ + new EmbedBuilder().setImage( + options.getUser('user')?.displayAvatarURL({ size: 4096 }) || 'https://cdn.discordapp.com/embed/avatars/5.png' + ) + ] + }); +} diff --git a/src/commands/banner.ts b/src/commands/banner.ts new file mode 100644 index 0000000..e5d2414 --- /dev/null +++ b/src/commands/banner.ts @@ -0,0 +1,24 @@ +import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; + +export const name = 'banner'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription("Fetches a user's banner") + .addUserOption((option) => { + return option.setName('user').setDescription('User to fetch').setRequired(true); + }); +export async function run( + _client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + await interaction.deferReply({ ephemeral: false }); + interaction.editReply({ + embeds: [ + new EmbedBuilder().setImage( + options.getUser('user', true).bannerURL({ size: 4096 }) || 'https://cdn.discordapp.com/embed/avatars/5.png' + ) + ] + }); +} diff --git a/src/commands/broadcast.ts b/src/commands/broadcast.ts new file mode 100644 index 0000000..3c62daa --- /dev/null +++ b/src/commands/broadcast.ts @@ -0,0 +1,67 @@ +import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; +import { StaffFlags } from '../typings/StaffFlags.ts'; +import StaffFlagsBitField from '../typings/StaffFlagsBitField.ts'; + +export const name = 'broadcast'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Broadcasts a message to all participating servers') + .addStringOption((option) => { + return option.setName('message').setDescription('Content to message to servers').setRequired(true); + }); +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + await interaction.deferReply({ ephemeral: true }); + const dbUser = await client.models?.User.findOne({ + where: { userId: interaction.user.id } + }); + if (!dbUser) { + await interaction.editReply({ + content: 'You are not authorized to use this command' + }); + return Promise.resolve(); + } + const flags = new StaffFlagsBitField(BigInt(dbUser.flags)); + if (!flags.has(StaffFlags.Maintainer)) { + await interaction.editReply({ + content: 'You are not authorized to use this command' + }); + return Promise.resolve(); + } + // Convert body + const body = options.getString('message', true).replace(/\\n/g, '\n'); + // Send message + interaction.editReply({ content: 'Sending messages...' }); + const guilds = await client.models?.Guild.findAll({ + where: { enabled: true, banned: false } + }); + const errors: { guildId: string; error: string }[] = []; + guilds?.forEach((g) => { + client.channels.fetch(g.settings.channel).then((c) => { + if (!c || !c.isTextBased()) { + errors.push({ + guildId: g.guildId, + error: 'Invalid channel provided' + }); + return; + } + c.send({ + content: `Message from Maintainer ${interaction.user.toString()}`, + embeds: [new EmbedBuilder().setDescription(body).setColor(4182379)] + }).catch((e) => errors.push({ guildId: g.guildId, error: e.message })); + }); + }); + if (errors.length > 0) { + interaction.editReply({ + content: 'Success! Messages are being broadcast to all servers, but some errors occurred' + }); + } else { + interaction.editReply({ + content: 'Success! Messages are being broadcast to all servers without errors' + }); + } +} diff --git a/src/commands/changelog.ts b/src/commands/changelog.ts new file mode 100644 index 0000000..1ce9268 --- /dev/null +++ b/src/commands/changelog.ts @@ -0,0 +1,16 @@ +import { CommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; +import { commands } from '../configs/config.json' assert { type: 'json' }; +import { readFileSync } from 'node:fs'; + +export const name = 'changelog'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Displays current version and changes as of the most recent update'); +export async function run(_client: CustomClient, interaction: CommandInteraction): Promise { + await interaction.deferReply({ ephemeral: true }); + interaction.editReply({ + embeds: [new EmbedBuilder().setDescription(readFileSync(commands.changelog).toString())] + }); + return Promise.resolve(); +} diff --git a/src/commands/checkallusers.ts b/src/commands/checkallusers.ts new file mode 100644 index 0000000..bce8035 --- /dev/null +++ b/src/commands/checkallusers.ts @@ -0,0 +1,63 @@ +import { SlashCommandBuilder, CommandInteraction, PermissionsBitField, PermissionFlagsBits } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; + +export const name = 'checkallusers'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Checks all users in the current server') + .addStringOption((option) => { + return option + .setName('spam_warning') + .setDescription('I am aware that this bot may spam the channel and this cannot be stopped midway through') + .addChoices({ + name: 'I have read the above', + value: 'yes' + }); + }); +export async function run(client: CustomClient, interaction: CommandInteraction): Promise { + await interaction.deferReply({ ephemeral: true }); + if ((interaction.member?.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { + interaction.editReply({ + content: 'You are not authorized to use this command' + }); + return Promise.resolve(); + } + + const users = await interaction.guild?.members.fetch(); + if (!users) { + interaction.editReply({ content: 'Could not fetch users' }); + return Promise.resolve(); + } + const ids = users.map((user) => user.id); + const allBans = await client.models?.Ban.findAll({ + where: { targetId: ids } + }); + if (!allBans || allBans.length === 0) { + interaction.editReply({ + content: `Success! Scanned all members and found no bans. Your server is clean` + }); + return Promise.resolve(); + } + if (allBans.length <= 5) { + allBans.forEach(async (ban) => { + const g = client.guilds.cache.get(ban.guildId) || (await client.guilds.fetch(ban.guildId)); + interaction.followUp({ + embeds: [ + { + description: `Guild: ${g.name} (${ban.guildId}) + User: <@${ban.targetId}> (${ban.targetId}) + Reason: + \`\`\`\n${ban.reason}\`\`\`` + } + ] + }); + }); + interaction.editReply({ + content: `Success! Scanned all members and found ${allBans.length} bans. See below for details` + }); + return Promise.resolve(); + } + // @ts-expect-error This function has different parameters + await client.commands?.get('checkallusers_handler')?.run(client, interaction, allBans); + return Promise.resolve(); +} diff --git a/src/commands/checkallusers/handler.ts b/src/commands/checkallusers/handler.ts new file mode 100644 index 0000000..bc80071 --- /dev/null +++ b/src/commands/checkallusers/handler.ts @@ -0,0 +1,42 @@ +import { CustomClient } from '../../typings/Extensions.ts'; +import { CommandInteraction, EmbedBuilder } from 'discord.js'; +import { Ban } from '../../typings/Models.ts'; + +export function handler(client: CustomClient, interaction: CommandInteraction, bans: Ban[]): Promise { + // Split the bans into groups of 5 + const banGroups: EmbedBuilder[][] = []; + let temp: EmbedBuilder[] = []; + bans.forEach(async (ban, index) => { + // Fetch guild if not cached + const g = client.guilds.cache.get(ban.guildId) || (await client.guilds.fetch(ban.guildId)); + // Create embed to push to array + const embed = new EmbedBuilder().setDescription(`Guild: ${g.name} (${ban.guildId}) + User: <@${ban.targetId}> (${ban.targetId}) + Reason: + \`\`\`\n${ban.reason}\`\`\``); + // If array is full, push to banGroups + if (index % 5 === 0 && index !== 0) { + banGroups.push(temp); + temp = []; + } + // Push embed to temp array + temp.push(embed); + }); + // Push remaining embeds to banGroups + if (temp.length > 0) { + banGroups.push(temp); + } + // Every 10 seconds, send 5 embeds + const i = setInterval(() => { + interaction.followUp({ embeds: banGroups.shift() }); + // If there are no more embeds to send, clear the interval + if (banGroups.length === 0) { + clearInterval(i); + // Inform the user of completion + interaction.editReply({ + content: `Success! Scanned all members and found ${bans.length} bans. See below for details` + }); + } + }, 10_000); + return Promise.resolve(); +} diff --git a/src/commands/eval.ts b/src/commands/eval.ts new file mode 100644 index 0000000..79b0fd4 --- /dev/null +++ b/src/commands/eval.ts @@ -0,0 +1,43 @@ +import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; +import { StaffFlags } from '../typings/StaffFlags.ts'; +import StaffFlagsBitField from '../typings/StaffFlagsBitField.ts'; + +export const name = 'eval'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Runs snippets of code') + .addStringOption((option) => { + return option.setName('script').setDescription('The code to run').setRequired(true); + }); +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + await interaction.deferReply({ ephemeral: true }); + const dbUser = await client.models?.User.findOne({ + where: { userId: interaction.user.id } + }); + if (!dbUser) { + interaction.editReply({ + content: 'You are not authorized to use this command' + }); + return Promise.resolve(); + } + const flags = new StaffFlagsBitField(BigInt(dbUser.flags)); + if (!flags.has(StaffFlags.Owner)) { + interaction.editReply({ + content: 'You are not authorized to use this command' + }); + return Promise.resolve(); + } + // Execute command + const result = eval(options.getString('script', true)); + interaction.editReply({ + embeds: [ + new EmbedBuilder().setTitle('Evaluation').setDescription(`\`\`\`js\n${JSON.stringify(result, null, 2)}\`\`\``) + ] + }); + return Promise.resolve(); +} diff --git a/src/commands/guild.ts b/src/commands/guild.ts new file mode 100644 index 0000000..299633c --- /dev/null +++ b/src/commands/guild.ts @@ -0,0 +1,56 @@ +import { + ChannelType, + CommandInteraction, + CommandInteractionOptionResolver, + PermissionFlagsBits, + PermissionsBitField, + SlashCommandBuilder +} from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; + +export const name = 'guild'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Manages your server') + .addSubcommand((subcommand) => { + return subcommand + .setName(name) + .setDescription('Sets up your server with the bot') + .addChannelOption((option) => { + return option + .setName('staff_channel') + .setDescription('Channel to log known users that staff can see') + .addChannelTypes(ChannelType.GuildText) + .setRequired(true); + }) + .addRoleOption((option) => { + return option + .setName('authorised_role') + .setDescription('Role that is required when running staff-only commands') + .setRequired(true); + }); + }) + .addSubcommand((subcommand) => { + return subcommand.setName('enable').setDescription('Enables the bot in the guild'); + }) + .addSubcommand((subcommand) => { + return subcommand.setName('disable').setDescription('Disables the bot in the guild'); + }) + .addSubcommand((subcommand) => { + return subcommand.setName('stats').setDescription('Returns statistics of the guild'); + }); +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +) { + await interaction.deferReply({ ephemeral: true }); + if ((interaction.member?.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { + interaction.editReply({ + content: 'You are not authorised to run this command' + }); + return Promise.resolve(); + } + await client.commands?.get(`guild_${options.getSubcommand()}`)?.run(client, interaction, options); + return Promise.resolve(); +} diff --git a/src/commands/guild/disable.ts b/src/commands/guild/disable.ts new file mode 100644 index 0000000..5f3f4c2 --- /dev/null +++ b/src/commands/guild/disable.ts @@ -0,0 +1,25 @@ +import { CommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export const name = 'disable'; +export async function run(client: CustomClient, interaction: CommandInteraction): Promise { + const guild = await client.models?.Guild.findOne({ + where: { guildId: interaction.guildId as string } + }); + if (!guild) { + interaction.editReply({ + content: 'This server has not been set up yet. Please run `/guild setup`' + }); + return Promise.resolve(); + } + if (!guild.enabled) { + interaction.editReply({ content: 'This server is already disabled' }); + return Promise.resolve(); + } + guild.enabled = 0; + await guild.save(); + interaction.editReply({ + content: 'Successfully disabled the bot in this server' + }); + return Promise.resolve(); +} diff --git a/src/commands/guild/enable.ts b/src/commands/guild/enable.ts new file mode 100644 index 0000000..9250437 --- /dev/null +++ b/src/commands/guild/enable.ts @@ -0,0 +1,25 @@ +import { CommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export const name = 'disable'; +export async function run(client: CustomClient, interaction: CommandInteraction): Promise { + const guild = await client.models?.Guild.findOne({ + where: { guildId: interaction.guildId as string } + }); + if (!guild) { + interaction.editReply({ + content: 'This server has not been set up yet. Please run `/guild setup`' + }); + return Promise.resolve(); + } + if (guild.enabled) { + interaction.editReply({ content: 'This server is already enabled' }); + return Promise.resolve(); + } + guild.enabled = 1; + await guild.save(); + interaction.editReply({ + content: 'Successfully enabled the bot in this server' + }); + return Promise.resolve(); +} diff --git a/src/commands/guild/setup.ts b/src/commands/guild/setup.ts new file mode 100644 index 0000000..952e6b0 --- /dev/null +++ b/src/commands/guild/setup.ts @@ -0,0 +1,35 @@ +import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; +import { GuildCreationAttributes } from '../../typings/Models.ts'; + +export const name = 'setup'; +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const attr: GuildCreationAttributes = { + guildId: interaction.guild?.id as string, + settings: { + channel: options.getChannel('staff_channel', true).id, + role: options.getRole('authorised_role', true).id + } + }; + + const dbResponse = await client.models?.Guild.findOrCreate({ + where: { + guildId: attr.guildId + }, + defaults: attr + }); + if (!dbResponse) { + interaction.editReply({ + content: 'An error occurred while performing setup. Please try again later' + }); + return Promise.resolve(); + } + interaction.editReply({ + content: `Success! ${dbResponse[1] ? 'Created' : 'Updated'} guild settings for ${dbResponse[0].guildId}` + }); + return Promise.resolve(); +} diff --git a/src/commands/guild/stats.ts b/src/commands/guild/stats.ts new file mode 100644 index 0000000..d824842 --- /dev/null +++ b/src/commands/guild/stats.ts @@ -0,0 +1,52 @@ +import { CommandInteraction, EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export const name = 'stats'; +export async function run(client: CustomClient, interaction: CommandInteraction): Promise { + const guild = await client.models?.Guild.findOne({ + where: { guildId: interaction.guildId as string } + }); + const owner = await interaction.guild?.fetchOwner(); + if (!owner) { + interaction.editReply({ + content: 'An error occurred while fetching guild data. Please try again later' + }); + return Promise.resolve(); + } + const embed = new EmbedBuilder() + .setTitle(`Statistics for ${interaction.guild?.name}`) + .setAuthor({ + name: owner.user.tag, + iconURL: owner.displayAvatarURL({ size: 1024 }) + }) + .addFields([ + { + name: 'Server Info', + value: `${interaction.guild?.name} (\`${interaction.guildId}\`)`, + inline: true + } + ]) + .setTimestamp(); + if (guild) { + embed.addFields([ + { + name: 'Logging Channel', + value: `<#${guild.settings.channel}> (\`${guild.settings.channel}\`)`, + inline: true + }, + { + name: 'Authorised Role', + value: `<@&${guild.settings.role}> (\`${guild.settings.role}\`)`, + inline: true + }, + { + name: 'Association Information', + value: `Participating Since: \`${ + guild.enabled ? `${Math.floor(guild.updatedAt.getTime() / 1000)}` : 'N/A' + }\`\nBans Submitted: \`${await guild.countBans()}\`` + } + ]); + } + interaction.editReply({ embeds: [embed] }); + return Promise.resolve(); +} diff --git a/src/commands/guildmgr.ts b/src/commands/guildmgr.ts new file mode 100644 index 0000000..0093e32 --- /dev/null +++ b/src/commands/guildmgr.ts @@ -0,0 +1,86 @@ +import { CommandInteraction, CommandInteractionOptionResolver, SlashCommandBuilder } from "discord.js"; +import { CustomClient } from "../typings/Extensions.ts"; +import StaffFlagsBitField from "../typings/StaffFlagsBitField.ts"; +import { StaffFlags } from "../typings/StaffFlags.ts"; + +export const name = 'guildmgr'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('[Maintainer] Manages guilds') + .addSubcommand((subcommand) => { + return subcommand + .setName('add') + .setDescription('Add guild') + .addStringOption((option) => { + return option + .setName('server') + .setDescription('Guild ID to add') + .setAutocomplete(true) + .setRequired(true); + }) + .addStringOption((option) => { + return option + .setName('channel') + .setDescription('Guild\'s staff channel') + .setAutocomplete(true) + .setRequired(true); + }) + .addStringOption((option) => { + return option + .setName('role') + .setDescription('Guild\'s authorised role') + .setAutocomplete(true) + .setRequired(true); + }); + }) + .addSubcommand((subcommand) => { + return subcommand + .setName('info') + .setDescription('Display info about a guild') + .addStringOption((option) => { + return option + .setName('server') + .setDescription('Guild ID to fetch information for') + .setAutocomplete(true) + .setRequired(true); + }); + }) + .addSubcommand((subcommand) => { + return subcommand + .setName('remove') + .setDescription('Remove guild') + .addStringOption((option) => { + return option + .setName('server') + .setDescription('Guild ID to remove') + .setAutocomplete(true) + .setRequired(true); + }); + }) + .addSubcommand((subcommand) => { + return subcommand + .setName('block') + .setDescription('Block guild') + .addStringOption((option) => { + return option + .setName('server') + .setDescription('Guild ID to block') + .setAutocomplete(true) + .setRequired(true); + }); + }); +export async function run(client: CustomClient, interaction: CommandInteraction, options: CommandInteractionOptionResolver): Promise { + await interaction.deferReply({ ephemeral: true }); + const user = await client.models?.User.findOne({ where: { userId: interaction.user.id } }); + if (!user) { + interaction.editReply({ content: 'You are not authorized to use this command.' }); + return Promise.resolve(); + } + const flags = new StaffFlagsBitField(BigInt(user.flags)); + if (!flags.has(StaffFlags.Maintainer)) { + interaction.editReply({ content: 'You are not authorized to use this command.' }); + return Promise.resolve(); + } + await client.functions?.get(`guildmgr_${options.getSubcommand(true)}`)?.run(client, interaction, options); + return Promise.resolve(); +} \ No newline at end of file diff --git a/src/commands/guildmgr/add.ts b/src/commands/guildmgr/add.ts new file mode 100644 index 0000000..53214ab --- /dev/null +++ b/src/commands/guildmgr/add.ts @@ -0,0 +1,45 @@ +import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export const name = 'add'; +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const rawChannel = options.getString('channel', true); + const rawGuild = options.getString('server', true); + const rawRole = options.getString('role', true); + const guild = await client.guilds.fetch(rawGuild); + if (!guild) { + await interaction.editReply('Invalid argument: Guild not found'); + return; + } + const channel = guild.channels.cache.get(rawChannel); + if (!channel) { + await interaction.editReply('Invalid argument: Channel not found'); + return; + } + const role = guild.roles.cache.get(rawRole); + if (!role) { + await interaction.editReply('Invalid argument: Role not found'); + return; + } + if(!client.models) return; // Suppress ESLint unsafe optional chaining + const [_dbGuild, created] = await client.models.Guild.findOrCreate({ + where: { + guildId: guild.id + }, + defaults: { + guildId: guild.id, + banned: 0, + enabled: 1, + settings: { + channel: channel.id, + role: role.id + } + } + }); + interaction.editReply(`Guild ${guild.name} has been ${created ? 'added' : 'updated'} with the settings provided`); + return Promise.resolve(); +} diff --git a/src/commands/guildmgr/block.ts b/src/commands/guildmgr/block.ts new file mode 100644 index 0000000..64c8bc7 --- /dev/null +++ b/src/commands/guildmgr/block.ts @@ -0,0 +1,26 @@ +import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export const name = 'block'; +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const guildId = options.getString('server', true); + const guild = client.guilds.cache.get(guildId); + if (!guild) { + interaction.editReply({ content: 'Specified guild ID does not exist' }); + return Promise.resolve(); + } + const dbGuild = await client.models?.Guild.findOne({ where: { guildId } }); + if (!dbGuild) { + interaction.editReply({ content: 'Specified guild ID is not in the database' }); + return Promise.resolve(); + } + dbGuild.banned = 1; + dbGuild.enabled = 0; + await dbGuild.save(); + interaction.editReply({ content: `Guild ${guild.name} has been blocked from using the bot` }); + return Promise.resolve(); +} diff --git a/src/commands/guildmgr/info.ts b/src/commands/guildmgr/info.ts new file mode 100644 index 0000000..ab1380b --- /dev/null +++ b/src/commands/guildmgr/info.ts @@ -0,0 +1,57 @@ +import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export const name = 'info'; +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const guildId = options.getString('server', true); + const guild = await client.models?.Guild.findOne({ + where: { guildId } + }); + const owner = await interaction.guild?.fetchOwner(); + if (!owner) { + interaction.editReply({ + content: 'An error occurred while fetching guild data. Please try again later' + }); + return Promise.resolve(); + } + const embed = new EmbedBuilder() + .setTitle(`Statistics for ${interaction.guild?.name}`) + .setAuthor({ + name: owner.user.tag, + iconURL: owner.displayAvatarURL({ size: 1024 }) + }) + .addFields([ + { + name: 'Server Info', + value: `${interaction.guild?.name} (\`${interaction.guildId}\`)`, + inline: true + } + ]) + .setTimestamp(); + if (guild) { + embed.addFields([ + { + name: 'Logging Channel', + value: `<#${guild.settings.channel}> (\`${guild.settings.channel}\`)`, + inline: true + }, + { + name: 'Authorised Role', + value: `<@&${guild.settings.role}> (\`${guild.settings.role}\`)`, + inline: true + }, + { + name: 'Association Information', + value: `Participating Since: \`${ + guild.enabled ? `${Math.floor(guild.updatedAt.getTime() / 1000)}` : 'N/A' + }\`\nBans Submitted: \`${await guild.countBans()}\`` + } + ]); + } + interaction.editReply({ embeds: [embed] }); + return Promise.resolve(); +} diff --git a/src/commands/guildmgr/remove.ts b/src/commands/guildmgr/remove.ts new file mode 100644 index 0000000..50b1931 --- /dev/null +++ b/src/commands/guildmgr/remove.ts @@ -0,0 +1,20 @@ +import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.ts'; + +export const name = 'block'; +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const guildId = options.getString('server', true); + const dbGuild = await client.models?.Guild.findOne({ where: { guildId } }); + if (!dbGuild) { + interaction.editReply({ content: 'Specified guild ID is not in the database' }); + return Promise.resolve(); + } + dbGuild.enabled = 0; + await dbGuild.save(); + interaction.editReply({ content: `Guild \`${guildId}\` has been disabled from using the bot` }); + return Promise.resolve(); +} diff --git a/src/commands/help.ts b/src/commands/help.ts new file mode 100644 index 0000000..db627fb --- /dev/null +++ b/src/commands/help.ts @@ -0,0 +1,14 @@ +import { CommandInteraction, SlashCommandBuilder, EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; + +export const name = 'help'; +export const data = new SlashCommandBuilder().setName(name).setDescription('Displays help menu'); +export async function run(_client: CustomClient, interaction: CommandInteraction): Promise { + await interaction.deferReply({ ephemeral: true }); + const embed = new EmbedBuilder().setTitle('Help Panel').setDescription( + `Our wiki is found here and details every command: https://github.com/FlippedCode/agent-black/wiki + You can also join our server found here: https://discord.gg/TqBwHtzzhD` + ); + interaction.editReply({ embeds: [embed] }); + return Promise.resolve(); +} diff --git a/src/commands/lookup.ts b/src/commands/lookup.ts new file mode 100644 index 0000000..2e15a26 --- /dev/null +++ b/src/commands/lookup.ts @@ -0,0 +1,29 @@ +import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.ts'; + +export const name = 'lookup'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Fetches data from the Discord API and Agent Black database') + .addUserOption((option) => { + return option.setName('user').setDescription('The user to lookup').setRequired(true); + }); +export async function run( + client: CustomClient, + interaction: CommandInteraction, + options: CommandInteractionOptionResolver +): Promise { + const bans = {}; + const warns = {}; + const aliases = await client.models?.Alias.findAll({ where: { user: options.getUser('user', true).id } }); + const discordUser = await options.getUser('user', true); + const flags = await discordUser.fetchFlags(); + const embed = new EmbedBuilder() + .setTitle(`${discordUser.username} (${discordUser.displayName})`) + .setDescription(`**ID:** ${discordUser.id}\n**Created At**`) + .addFields( + { + name: + } + ) +} diff --git a/commands/maintainer.js b/src/commands/maintainer.ts similarity index 80% rename from commands/maintainer.js rename to src/commands/maintainer.ts index 9dfce8f..60cd225 100644 --- a/commands/maintainer.js +++ b/src/commands/maintainer.ts @@ -2,16 +2,16 @@ const Maintainer = require('../database/models/Maintainer'); module.exports.run = async (interaction) => { // check maintainer permissions - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id)) { + if (!await client.functions?.get('CHECK_DB_perms').run(interaction.user.id)) { messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); return; } const subName = interaction.options.getString('action', true); - client.commands.get(`${module.exports.data.name}_${subName}`).run(interaction, Maintainer); + client.commands?.get(`${module.exports.data.name}_${subName}`).run(interaction, Maintainer); }; module.exports.data = new CmdBuilder() - .setName('maintainer') + .setName(name) .setDescription('Manages the maintainers. [MAINTAINER ONLY]') .addUserOption((option) => option.setName('user').setDescription('Provide a user you want to edit.').setRequired(true)) .addStringOption((option) => option diff --git a/commands/maintainer/add.js b/src/commands/maintainer/add.ts similarity index 100% rename from commands/maintainer/add.js rename to src/commands/maintainer/add.ts diff --git a/commands/maintainer/info.js b/src/commands/maintainer/info.ts similarity index 100% rename from commands/maintainer/info.js rename to src/commands/maintainer/info.ts diff --git a/commands/maintainer/remove.js b/src/commands/maintainer/remove.ts similarity index 100% rename from commands/maintainer/remove.js rename to src/commands/maintainer/remove.ts diff --git a/commands/ping.js b/src/commands/ping.ts similarity index 98% rename from commands/ping.js rename to src/commands/ping.ts index 819cf80..8a8af74 100644 --- a/commands/ping.js +++ b/src/commands/ping.ts @@ -29,5 +29,5 @@ async function checkPing(interaction) { module.exports.run = async (interaction) => checkPing(interaction); module.exports.data = new CmdBuilder() - .setName('ping') + .setName(name) .setDescription('Shows API and bot latencies.'); diff --git a/commands/syncallbans.js b/src/commands/syncallbans.ts similarity index 98% rename from commands/syncallbans.js rename to src/commands/syncallbans.ts index 253646e..204b846 100644 --- a/commands/syncallbans.js +++ b/src/commands/syncallbans.ts @@ -31,5 +31,5 @@ module.exports.run = async (interaction) => { }; module.exports.data = new CmdBuilder() - .setName('syncallbans') + .setName(name) .setDescription('Adds all bans from all participating servers. [OWNER ONLY].'); diff --git a/commands/syncbans.js b/src/commands/syncbans.ts similarity index 94% rename from commands/syncbans.js rename to src/commands/syncbans.ts index fef425f..c71517f 100644 --- a/commands/syncbans.js +++ b/src/commands/syncbans.ts @@ -4,7 +4,7 @@ const Ban = require('../database/models/Ban'); module.exports.run = async (interaction) => { // check maintainer permissions - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id)) { + if (!await client.functions?.get('CHECK_DB_perms').run(interaction.user.id)) { messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); return; } @@ -39,7 +39,7 @@ module.exports.run = async (interaction) => { }; module.exports.data = new CmdBuilder() - .setName('syncbans') + .setName(name) .setDescription('Adds all bans from the current server its beeing used in. [MAINTAINER ONLY]') .addStringOption((option) => option .setName('server') diff --git a/commands/unban.js b/src/commands/unban.ts similarity index 98% rename from commands/unban.js rename to src/commands/unban.ts index 13e750f..92871b7 100644 --- a/commands/unban.js +++ b/src/commands/unban.ts @@ -28,6 +28,6 @@ module.exports.run = async (interaction) => { }; module.exports.data = new SlashCommandBuilder() - .setName('unban') + .setName(name) .setDescription('Unbans a user.') .addUserOption((option) => option.setName('user').setDescription('Provide a user.').setRequired(true)); diff --git a/commands/warn.js b/src/commands/warn.ts similarity index 90% rename from commands/warn.js rename to src/commands/warn.ts index df85854..7feede0 100644 --- a/commands/warn.js +++ b/src/commands/warn.ts @@ -6,7 +6,7 @@ const Warn = require('../database/models/Warn'); // checks if server is partisipating server function getServerEntry(serverID) { - return client.functions.get('GET_DB_server').run(serverID, true); + return client.functions?.get('GET_DB_server').run(serverID, true); } // warns other servers @@ -38,7 +38,7 @@ async function messageWarnedAliasUserInGuild(channelID, userTag, userID, warnMes } async function checkforInfectedGuilds(guild, orgUserID, warnMessage) { - let aliases = await client.functions.get('GET_DB_alias').run(orgUserID); + let aliases = await client.functions?.get('GET_DB_alias').run(orgUserID); if (!aliases) aliases = [orgUserID]; const orgUser = await client.users.fetch(orgUserID, false); // look for each of the conencted users (alias) if they are a member in the corresponding guild @@ -61,17 +61,17 @@ async function checkforInfectedGuilds(guild, orgUserID, warnMessage) { module.exports.run = async (interaction) => { // check maintainer permissions - if (!await client.functions.get('CHECK_DB_perms').run(interaction.user.id, 'staff', interaction.guild.id, interaction.member)) { + if (!await client.functions?.get('CHECK_DB_perms').run(interaction.user.id, 'staff', interaction.guild.id, interaction.member)) { messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); return; } const subName = interaction.options.getSubcommand(true); const warnMessage = interaction.options.getString('message', true); - client.commands.get(`${module.exports.data.name}_${subName}`).run(interaction, warnMessage, Warn, checkforInfectedGuilds); + client.commands?.get(`${module.exports.data.name}_${subName}`).run(interaction, warnMessage, Warn, checkforInfectedGuilds); }; module.exports.data = new CmdBuilder() - .setName('warn') + .setName(name) .setDescription('Warns other servers about a specific user.') .addSubcommand((SC) => SC .setName('add') diff --git a/commands/warn/add.js b/src/commands/warn/add.ts similarity index 100% rename from commands/warn/add.js rename to src/commands/warn/add.ts diff --git a/commands/warn/edit.js b/src/commands/warn/edit.ts similarity index 100% rename from commands/warn/edit.js rename to src/commands/warn/edit.ts diff --git a/src/configs/config.json b/src/configs/config.json new file mode 100644 index 0000000..fb52a78 --- /dev/null +++ b/src/configs/config.json @@ -0,0 +1,27 @@ +{ + "name": "Agent Black", + "teamRole": "638670637052854282", + "logChannel": "638793508202741790", + "setup": { + "setupFunctions": ["SETUP_heartbeat", "SETUP_offlineStat", "SETUP_status"] + }, + "commands": { + "lookup": { + "lowerQuerryLimit": 5, + "botBadge": "<:system_bot_notifier:813101401646432298>" + }, + "about": "./about.txt", + "changelog": "./changelog.txt" + }, + "functions": { + "userTagRecord": { + "maxCacheTimeout": 10800000 + }, + "heartbeat": { + "uptime": { + "interval": 50000, + "endpoints": ["http://statuspage_app_sp_1:3001/api/push/"] + } + } + } +} diff --git a/config/example_config.json b/src/configs/example_config.json similarity index 100% rename from config/example_config.json rename to src/configs/example_config.json diff --git a/src/configs/main.json b/src/configs/main.json new file mode 100644 index 0000000..08194f1 --- /dev/null +++ b/src/configs/main.json @@ -0,0 +1,31 @@ +{ + "name": "Agent Black", + "prefix": { + "default": "a!", + "nicknameSpacer": " | " + }, + "setup": { + "moduleFolders": { + "functionsFolder": "functions", + "commandsFolder": "commands" + }, + "startupFunctions": ["STARTUP_initCommands", "STARTUP_initFunctions", "STARTUP_envPrep", "STARTUP_DBConnection"], + "setupFunctions": ["SETUP_offlineStat", "SETUP_status"], + "setupFunctionsOnce": ["TCKR_offlineStat"] + }, + "commands": { + "lookup": { + "lowerQuerryLimit": 5 + } + }, + "functions": { + "userTagRecord": { + "maxCacheTimeout": 10800000 + } + }, + "emojiLayout": "/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32-\ude3a]|[\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g", + "aboutText": "./config/about.txt", + "teamRole": "638670637052854282", + "logStatusChannel": "638793508202741790", + "lookupBotBadge": "<:system_bot_notifier:813101401646432298>" +} diff --git a/src/database/models/alias.ts b/src/database/models/alias.ts new file mode 100644 index 0000000..59a5b49 --- /dev/null +++ b/src/database/models/alias.ts @@ -0,0 +1,102 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { user, userId } from './user.ts'; + +export interface aliasAttributes { + aliasId: number; + user: string; + alternative?: string; + moderator: string; + createdAt: Date; + updatedAt: Date; +} + +export type aliasPk = 'aliasId'; +export type aliasId = alias[aliasPk]; +export type aliasOptionalAttributes = 'aliasId' | 'createdAt' | 'updatedAt'; +export type aliasCreationAttributes = Optional< + aliasAttributes, + aliasOptionalAttributes +>; + +export class alias + extends Model + implements aliasAttributes +{ + aliasId!: number; + user!: string; + alternative!: string; + moderator!: string; + createdAt!: Date; + updatedAt!: Date; + + // alias belongsTo user via moderator + moderator_user!: user; + getModerator_user!: Sequelize.BelongsToGetAssociationMixin; + setModerator_user!: Sequelize.BelongsToSetAssociationMixin; + createModerator_user!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof alias { + return alias.init( + { + aliasId: { + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + autoIncrement: true + }, + user: { + type: DataTypes.CHAR(20), + allowNull: false + }, + alternative: { + type: DataTypes.CHAR(20), + allowNull: true, + unique: 'alternative' + }, + moderator: { + type: DataTypes.CHAR(20), + allowNull: false, + references: { + model: 'user', + key: 'userId' + } + }, + createdAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + }, + updatedAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + } + }, + { + sequelize, + tableName: 'alias', + timestamps: false, + indexes: [ + { + name: 'PRIMARY', + unique: true, + using: 'BTREE', + fields: [{ name: 'aliasId' }] + }, + { + name: 'alternative', + unique: true, + using: 'BTREE', + fields: [{ name: 'alternative' }] + }, + { + name: 'alias_ibfk_1', + using: 'BTREE', + fields: [{ name: 'moderator' }] + } + ] + } + ); + } +} diff --git a/src/database/models/ban.ts b/src/database/models/ban.ts new file mode 100644 index 0000000..db3071b --- /dev/null +++ b/src/database/models/ban.ts @@ -0,0 +1,96 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { guild, guildId } from './guild.ts'; + +export interface banAttributes { + banId: number; + guildId: string; + targetId: string; + reason: string; + active: number; + createdAt: Date; + updatedAt: Date; +} + +export type banPk = 'banId'; +export type banId = ban[banPk]; +export type banOptionalAttributes = 'active' | 'createdAt' | 'updatedAt'; +export type banCreationAttributes = Optional; + +export class ban extends Model implements banAttributes { + banId!: number; + guildId!: string; + targetId!: string; + reason!: string; + active!: number; + createdAt!: Date; + updatedAt!: Date; + + // ban belongsTo guild via guildId + guild!: guild; + getGuild!: Sequelize.BelongsToGetAssociationMixin; + setGuild!: Sequelize.BelongsToSetAssociationMixin; + createGuild!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof ban { + return ban.init( + { + banId: { + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + autoIncrement: true + }, + guildId: { + type: DataTypes.CHAR(20), + allowNull: false, + references: { + model: 'guild', + key: 'guildId' + } + }, + targetId: { + type: DataTypes.CHAR(20), + allowNull: false + }, + reason: { + type: DataTypes.TEXT, + allowNull: false + }, + active: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: 1 + }, + createdAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + }, + updatedAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + } + }, + { + sequelize, + tableName: 'ban', + timestamps: false, + indexes: [ + { + name: 'PRIMARY', + unique: true, + using: 'BTREE', + fields: [{ name: 'banId' }] + }, + { + name: 'bans_ibfk_1', + using: 'BTREE', + fields: [{ name: 'guildId' }] + } + ] + } + ); + } +} diff --git a/src/database/models/guild.ts b/src/database/models/guild.ts new file mode 100644 index 0000000..a23cda5 --- /dev/null +++ b/src/database/models/guild.ts @@ -0,0 +1,105 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { ban, banId } from './ban.ts'; +import type { warn, warnId } from './warn.ts'; + +export interface guildAttributes { + guildId: string; + enabled: number; + banned: number; + settings: guildSettings; + createdAt: Date; + updatedAt: Date; +} + +export type guildPk = 'guildId'; +export type guildId = guild[guildPk]; +export type guildOptionalAttributes = 'enabled' | 'banned' | 'createdAt' | 'updatedAt'; +export type guildCreationAttributes = Optional; +export type guildSettings = { + channel: string; + role: string; +}; + +export class guild extends Model implements guildAttributes { + guildId!: string; + enabled!: number; + banned!: number; + settings!: guildSettings; + createdAt!: Date; + updatedAt!: Date; + + // guild hasMany ban via guildId + bans!: ban[]; + getBans!: Sequelize.HasManyGetAssociationsMixin; + setBans!: Sequelize.HasManySetAssociationsMixin; + addBan!: Sequelize.HasManyAddAssociationMixin; + addBans!: Sequelize.HasManyAddAssociationsMixin; + createBan!: Sequelize.HasManyCreateAssociationMixin; + removeBan!: Sequelize.HasManyRemoveAssociationMixin; + removeBans!: Sequelize.HasManyRemoveAssociationsMixin; + hasBan!: Sequelize.HasManyHasAssociationMixin; + hasBans!: Sequelize.HasManyHasAssociationsMixin; + countBans!: Sequelize.HasManyCountAssociationsMixin; + // guild hasMany warn via guildId + warns!: warn[]; + getWarns!: Sequelize.HasManyGetAssociationsMixin; + setWarns!: Sequelize.HasManySetAssociationsMixin; + addWarn!: Sequelize.HasManyAddAssociationMixin; + addWarns!: Sequelize.HasManyAddAssociationsMixin; + createWarn!: Sequelize.HasManyCreateAssociationMixin; + removeWarn!: Sequelize.HasManyRemoveAssociationMixin; + removeWarns!: Sequelize.HasManyRemoveAssociationsMixin; + hasWarn!: Sequelize.HasManyHasAssociationMixin; + hasWarns!: Sequelize.HasManyHasAssociationsMixin; + countWarns!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof guild { + return guild.init( + { + guildId: { + type: DataTypes.CHAR(20), + allowNull: false, + primaryKey: true + }, + enabled: { + type: DataTypes.TINYINT, + allowNull: false, + defaultValue: 0 + }, + banned: { + type: DataTypes.TINYINT, + allowNull: false, + defaultValue: 0 + }, + settings: { + type: DataTypes.JSON, + allowNull: false + }, + createdAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + }, + updatedAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + } + }, + { + sequelize, + tableName: 'guild', + timestamps: false, + indexes: [ + { + name: 'PRIMARY', + unique: true, + using: 'BTREE', + fields: [{ name: 'guildId' }] + } + ] + } + ); + } +} diff --git a/src/database/models/user.ts b/src/database/models/user.ts new file mode 100644 index 0000000..431a192 --- /dev/null +++ b/src/database/models/user.ts @@ -0,0 +1,61 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; + +export interface userAttributes { + userId: string; + flags: number; + createdAt: Date; + updatedAt: Date; +} + +export type userPk = 'userId'; +export type userId = user[userPk]; +export type userOptionalAttributes = 'flags' | 'createdAt' | 'updatedAt'; +export type userCreationAttributes = Optional; + +export class user extends Model implements userAttributes { + userId!: string; + flags!: number; + createdAt!: Date; + updatedAt!: Date; + + static initModel(sequelize: Sequelize.Sequelize): typeof user { + return user.init( + { + userId: { + type: DataTypes.CHAR(20), + allowNull: false, + primaryKey: true + }, + flags: { + type: DataTypes.INTEGER, + allowNull: false, + defaultValue: 0 + }, + createdAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + }, + updatedAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + } + }, + { + sequelize, + tableName: 'user', + timestamps: false, + indexes: [ + { + name: 'PRIMARY', + unique: true, + using: 'BTREE', + fields: [{ name: 'userId' }] + } + ] + } + ); + } +} diff --git a/src/database/models/warn.ts b/src/database/models/warn.ts new file mode 100644 index 0000000..b1bc5e2 --- /dev/null +++ b/src/database/models/warn.ts @@ -0,0 +1,96 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { guild, guildId } from './guild.ts'; + +export interface warnAttributes { + banId: number; + guildId: string; + targetId: string; + reason: string; + active: number; + createdAt: Date; + updatedAt: Date; +} + +export type warnPk = 'banId'; +export type warnId = warn[warnPk]; +export type warnOptionalAttributes = 'active' | 'createdAt' | 'updatedAt'; +export type warnCreationAttributes = Optional; + +export class warn extends Model implements warnAttributes { + banId!: number; + guildId!: string; + targetId!: string; + reason!: string; + active!: number; + createdAt!: Date; + updatedAt!: Date; + + // warn belongsTo guild via guildId + guild!: guild; + getGuild!: Sequelize.BelongsToGetAssociationMixin; + setGuild!: Sequelize.BelongsToSetAssociationMixin; + createGuild!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof warn { + return warn.init( + { + banId: { + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + autoIncrement: true + }, + guildId: { + type: DataTypes.CHAR(20), + allowNull: false, + references: { + model: 'guild', + key: 'guildId' + } + }, + targetId: { + type: DataTypes.CHAR(20), + allowNull: false + }, + reason: { + type: DataTypes.TEXT, + allowNull: false + }, + active: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: 1 + }, + createdAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + }, + updatedAt: { + type: DataTypes.DATE, + allowNull: false, + defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + } + }, + { + sequelize, + tableName: 'warn', + timestamps: false, + indexes: [ + { + name: 'PRIMARY', + unique: true, + using: 'BTREE', + fields: [{ name: 'banId' }] + }, + { + name: 'warns_ibfk_1', + using: 'BTREE', + fields: [{ name: 'guildId' }] + } + ] + } + ); + } +} diff --git a/src/functions/READY/commandInit.ts b/src/functions/READY/commandInit.ts new file mode 100644 index 0000000..11cdd35 --- /dev/null +++ b/src/functions/READY/commandInit.ts @@ -0,0 +1,52 @@ +import { readdirSync, statSync } from 'node:fs'; +import { CustomClient, SlashCommandFile } from '../../typings/Extensions.ts'; +import { RESTPostAPIChatInputApplicationCommandsJSONBody } from 'discord.js'; +const files: string[] = []; + +function recursiveLookup(dir: string): string[] { + readdirSync(dir).forEach((file: string) => { + const absolute = `${dir}/${file}`; + if (statSync(absolute).isDirectory()) return recursiveLookup(absolute); + files.push(absolute); + }); + return files; +} + +export const fileName = 'commandInit'; + +export default async function (client: CustomClient): Promise { + const slashCommands: RESTPostAPIChatInputApplicationCommandsJSONBody[] = []; + // List of files + const commandFiles: string[] = recursiveLookup('./commands').filter((f: string) => f.endsWith('.js')); + const commandLength: number = commandFiles.length; + if (commandLength <= 0) return client.stdrr?.info(`[${fileName}] No command(s) to load!`); + if (Deno.env.get('NODE_ENV')) + client.stdrr?.debug(`[${fileName}] Loading ${commandLength} command${commandLength !== 1 ? 's' : ''}...`); + + for (const [i, file] of commandFiles.entries()) { + const fileData: SlashCommandFile = await import(file); + const cleanName: string = file.replace(/\\|\//g, '_').replace('commands_', '').replace('.js', ''); + // "continue" skips the rest of the loop and goes to the next iteration + if (cleanName.search('archive_') !== -1) continue; + if (Deno.env.get('NODE_ENV') === 'development') + client.stdrr?.debug(`[${fileName}] ${i + 1}) Loaded: ${cleanName}!`); + client.commands.set(cleanName, fileData); + // If the file has a data property, it's a slash command + if (fileData.data) slashCommands.push(fileData.data.toJSON()); + } + client.stdrr?.info(`[${fileName}] Loaded ${commandLength} command${commandLength !== 1 ? 's' : ''}!`); + + const slashCommandsLength = slashCommands.length; + client.stdrr?.info(`[${fileName}] Registering ${slashCommandsLength} command${slashCommandsLength !== 1 ? 's' : ''}...`); + + // submit commands to discord api| Dev: one guild only, prod: globally + if (Deno.env.get('NODE_ENV') === 'development') { + const changedCommands = slashCommands.map((command) => { + const newCommand = command; + newCommand.name = `${command.name}_dev`; + return newCommand; + }); + await client.application?.commands.set(changedCommands, (Deno.env.get('devGuild') as string)); + } else await client.application?.commands.set(slashCommands); + console.log(`[${fileName}] ${slashCommandsLength} command${slashCommandsLength !== 1 ? 's' : ''} registered!`); +} diff --git a/src/functions/STARTUP/dbInit.ts b/src/functions/STARTUP/dbInit.ts new file mode 100644 index 0000000..dfc0041 --- /dev/null +++ b/src/functions/STARTUP/dbInit.ts @@ -0,0 +1,29 @@ +import { Sequelize } from 'sequelize'; +import { CustomClient } from '../../typings/Extensions.ts'; +import { initModels } from '../../typings/Models.ts'; + +export default async function (client: CustomClient): Promise { + const env = Deno.env.toObject(); + const { DBname, DBuser, DBpassword, NODE_ENV } = env; + if (!DBname || !DBuser || !DBpassword) + throw new SyntaxError('Missing database credentials'); + const sequelize = new Sequelize(DBname, DBuser, DBpassword, { + dialect: 'mysql', + logging: NODE_ENV === "development" ? client.stdrr?.debug : false + }); + // Import models + client.sequelize = sequelize; + client.models? = initModels(sequelize); + + // Test database connection & sync models + try { + await sequelize.authenticate(); + client.stdrr?.info('Connected to database'); + await sequelize.sync(); + client.stdrr?.info('Synced models with database'); + } catch (e) { + client.stdrr?.error('Failed to connect or sync database', { error: e }); + return Promise.reject(e); + } + return Promise.resolve(); +} diff --git a/src/functions/STARTUP/functionInit.ts b/src/functions/STARTUP/functionInit.ts new file mode 100644 index 0000000..ebca354 --- /dev/null +++ b/src/functions/STARTUP/functionInit.ts @@ -0,0 +1,34 @@ +import { readdirSync, statSync } from 'node:fs'; +import { CustomClient, FunctionFile } from '../../typings/Extensions.ts'; +const files: string[] = []; + +function recursiveLookup(dir: string): string[] { + readdirSync(dir).forEach((file: string) => { + const absolute = `${dir}/${file}`; + if (statSync(absolute).isDirectory()) return recursiveLookup(absolute); + files.push(absolute); + }); + return files; +} + +export const fileName = 'functionInit'; + +export default async function (client: CustomClient): Promise { + // List of files + const functionFiles: string[] = recursiveLookup('./functions').filter((f: string) => f.endsWith('.js')); + const functionLength: number = functionFiles.length; + if (functionLength <= 0) return client.stdrr?.info(`[${fileName}] No function(s) to load!`); + if (Deno.env.get('NODE_ENV')) + client.stdrr?.debug(`[${fileName}] Loading ${functionLength} function${functionLength !== 1 ? 's' : ''}...`); + + for (const [i, file] of functionFiles.entries()) { + const fileData: FunctionFile = await import(file); + const cleanName: string = file.replace(/\\|\//g, '_').replace('functions_', '').replace('.js', ''); + // "continue" skips the rest of the loop and goes to the next iteration + if (cleanName.search('archive_') !== -1) continue; + if (Deno.env.get('NODE_ENV') === 'development') + client.stdrr?.debug(`[${fileName}] ${i + 1}) Loaded: ${cleanName}!`); + client.functions?.set(cleanName, fileData); + } + client.stdrr?.info(`[${fileName}] Loaded ${functionLength} function${functionLength !== 1 ? 's' : ''}!`); +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..84f505e --- /dev/null +++ b/src/index.ts @@ -0,0 +1,42 @@ +//#region Packages +import { Client, IntentsBitField, Collection } from 'discord.js'; +import { CustomClient } from './typings/Extensions.ts'; +import { default as bunyan, createLogger } from 'bunyan'; +import { readdirSync } from 'node:fs'; +const stdrr: bunyan = createLogger({ + name: 'main', + stream: Deno.stdout +}); +// Log developer mode +if (Deno.env.get('NODE_ENV') === 'development') stdrr.debug('Starting in development mode'); +//#endregion + +//#region Discord init +const client: CustomClient = new Client({ + intents: [ + IntentsBitField.Flags.Guilds, + IntentsBitField.Flags.GuildMembers, + IntentsBitField.Flags.GuildModeration, + IntentsBitField.Flags.GuildEmojisAndStickers, + IntentsBitField.Flags.GuildMessages, + IntentsBitField.Flags.DirectMessages + ] +}); +client.stdrr = stdrr; +//#endregion +//#region Variables +client.commands = new Collection(); + +//#endregion +//#region Discord events +client.on('ready', () => { + stdrr.info(`Logged in as ${client.user?.tag}!`); + // Functions + readdirSync('./functions/READY').forEach(async (file: string) => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + (await import(`./functions/READY/${file}`))(client); + }); +}); +client.login(Deno.env.get('DCtoken')); +//#endregion +//#region Error handling diff --git a/src/typings/Bitfield.ts b/src/typings/Bitfield.ts new file mode 100644 index 0000000..6504d69 --- /dev/null +++ b/src/typings/Bitfield.ts @@ -0,0 +1,205 @@ +/** + * Data that can be resolved to give a bitfield. This can be: + * * A bit number (this can be a number literal or a value taken from {@link BitField.Flags}) + * * A string bit number + * * An instance of BitField + * * An Array of BitFieldResolvable + */ +export type BitFieldResolvable = + | bigint + | string + | BitField + | BitFieldResolvable[]; + +/** + * Data structure that makes it easy to interact with a bitfield. + * @class + + */ +class BitField { + /** + * Numeric bitfield of the packed bits + * @type {bigint} + */ + bitfield: bigint; + + /** + * Numeric bitfield flags. + * Defined in extension classes + * @type {Object} + * @memberof BitField + * @abstract + */ + static Flags = {}; + + /** + * @type {bigint} + * @memberof BitField + * @private + */ + static DefaultBit = BigInt(0); + + /** + * @param {BitFieldResolvable} [bits] Bit(s) to read from + */ + constructor(bits: BitFieldResolvable) { + /** + * Bitfield of the packed bits + * @type {number|bigint} + */ + if (!bits) bits = (this.constructor as typeof BitField).DefaultBit; + this.bitfield = (this.constructor as typeof BitField).resolve(bits); + } + + /** + * Checks whether the bitfield has a bit, or any of multiple bits. + * @param {BitFieldResolvable} bit Bit(s) to check for + * @returns {boolean} + */ + any(bit: BitFieldResolvable) { + return ( + (this.bitfield & (this.constructor as typeof BitField).resolve(bit)) !== + (this.constructor as typeof BitField).DefaultBit + ); + } + + /** + * Checks if this bitfield equals another + * @param {BitFieldResolvable} bit Bit(s) to check for + * @returns {boolean} + */ + equals(bit: BitFieldResolvable) { + return this.bitfield === (this.constructor as typeof BitField).resolve(bit); + } + + /** + * Checks whether the bitfield has a bit, or multiple bits. + * @param {BitFieldResolvable} bit Bit(s) to check for + * @returns {boolean} + */ + has(bit: BitFieldResolvable) { + bit = (this.constructor as typeof BitField).resolve(bit); + return (this.bitfield & bit) === bit; + } + + /** + * Gets all given bits that are missing from the bitfield. + * @param {BitFieldResolvable} bits Bit(s) to check for + * @param {...*} hasParams Additional parameters for the has method, if any + * @returns {string[]} + */ + missing(bits: BitFieldResolvable, ...hasParams: [unknown]) { + return new (this.constructor as typeof BitField)(bits) + .remove(this) + .toArray(...hasParams); + } + + /** + * Freezes these bits, making them immutable. + * @returns {Readonly} + */ + freeze() { + return Object.freeze(this); + } + + /** + * Adds bits to these ones. + * @param {...BitFieldResolvable[]} [bits] Bits to add + * @returns {BitField} These bits or new BitField if the instance is frozen. + */ + add(...bits: BitFieldResolvable[]) { + let total = (this.constructor as typeof BitField).DefaultBit; + for (const bit of bits) { + total |= (this.constructor as typeof BitField).resolve(bit); + } + if (Object.isFrozen(this)) + return new (this.constructor as typeof BitField)(this.bitfield | total); + this.bitfield |= total; + return this; + } + + /** + * Removes bits from these. + * @param {...BitFieldResolvable} [bits] Bits to remove + * @returns {BitField} These bits or new BitField if the instance is frozen. + */ + remove(...bits: BitFieldResolvable[]) { + let total = (this.constructor as typeof BitField).DefaultBit; + for (const bit of bits) { + total |= (this.constructor as typeof BitField).resolve(bit); + } + if (Object.isFrozen(this)) + return new (this.constructor as typeof BitField)(this.bitfield & ~total); + this.bitfield &= ~total; + return this; + } + + /** + * Gets an object mapping field names to a {@link boolean} indicating whether the + * bit is available. + * @returns {Object} + */ + serialize() { + const serialized = {}; + for (const [flag, bit] of Object.entries( + (this.constructor as typeof BitField).Flags + )) + serialized[flag] = this.has(bit); + return serialized; + } + + /** + * Gets an {@link Array} of bitfield names based on the bits available. + * @param {...*} hasParams Additional parameters for the has method, if any + * @returns {string[]} + */ + toArray(...hasParams: [unknown]) { + return [...this[Symbol.iterator](...hasParams)]; + } + + toJSON() { + return typeof this.bitfield === "number" + ? this.bitfield + : this.bitfield.toString(); + } + + valueOf() { + return this.bitfield; + } + + *[Symbol.iterator](...hasParams: [unknown]) { + for (const bitName of Object.keys( + (this.constructor as typeof BitField).Flags + )) { + // @ts-expect-error Implemented for classes extending BitField + if (this.has(bitName, ...hasParams)) yield bitName; + } + } + + /** + * Resolves bitfields to their numeric form. + * @param {BitFieldResolvable} [bit] bit(s) to resolve + * @returns {bigint} + */ + static resolve(bit: BitFieldResolvable): bigint { + const { DefaultBit } = this; + if (typeof bit === "undefined") return DefaultBit; + if (typeof bit === "number") bit = BigInt(bit); + if (typeof DefaultBit === typeof bit && (bit as bigint) >= DefaultBit) + return bit as bigint; + if (bit instanceof BitField) return bit.bitfield; + if (Array.isArray(bit)) + return bit + .map((p) => this.resolve(p)) + .reduce((prev, p) => prev | p, DefaultBit); + if (typeof bit === "string") { + if (typeof this.Flags[bit] !== "undefined") return this.Flags[bit]; + const resolved = BigInt(bit); + if (typeof DefaultBit === typeof resolved && resolved >= DefaultBit) + return resolved; + } + throw new RangeError("Invalid BitField " + bit); + } +} + +export { BitField }; diff --git a/src/typings/Extensions.ts b/src/typings/Extensions.ts new file mode 100644 index 0000000..48bef3b --- /dev/null +++ b/src/typings/Extensions.ts @@ -0,0 +1,30 @@ +import { Client, Collection, CommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { Alias, Ban, Guild, User, Warn } from './Models.ts'; +import { Sequelize } from 'sequelize'; +import Logger from 'bunyan'; + +export interface CustomClient extends Client { + env?: { [key: string]: string }; + commands?: Collection; + functions?: Collection; + sequelize?: Sequelize; + models?: { + Alias: typeof Alias; + Ban: typeof Ban; + Guild: typeof Guild; + User: typeof User; + Warn: typeof Warn; + }; + stdrr?: Logger; +} + +export interface SlashCommandFile { + name: string; + data: SlashCommandBuilder; + run: (client: Client, interaction: CommandInteraction, options: CommandInteraction['options']) => Promise; +} + +export interface FunctionFile { + name: string; + run: (...args: unknown[]) => Promise; +} diff --git a/src/typings/Models.ts b/src/typings/Models.ts new file mode 100644 index 0000000..bf8f2d2 --- /dev/null +++ b/src/typings/Models.ts @@ -0,0 +1,70 @@ +import type { Sequelize } from "sequelize"; +import { alias as _alias } from "../database/models/alias.ts"; +import type { + aliasAttributes, + aliasCreationAttributes +} from "../database/models/alias.ts"; +import { ban as _ban } from "../database/models/ban.ts"; +import type { + banAttributes, + banCreationAttributes +} from "../database/models/ban.ts"; +import { guild as _guild } from "../database/models/guild.ts"; +import type { + guildAttributes, + guildCreationAttributes +} from "../database/models/guild.ts"; +import { user as _user } from "../database/models/user.ts"; +import type { + userAttributes, + userCreationAttributes +} from "../database/models/user.ts"; +import { warn as _warn } from "../database/models/warn.ts"; +import type { + warnAttributes, + warnCreationAttributes +} from "../database/models/warn.ts"; + +export { + _alias as Alias, + _ban as Ban, + _guild as Guild, + _user as User, + _warn as Warn +}; + +export type { + aliasAttributes as AliasAttributes, + aliasCreationAttributes as AliasCreationAttributes, + banAttributes as BanAttributes, + banCreationAttributes as BanCreationAttributes, + guildAttributes as GuildAttributes, + guildCreationAttributes as GuildCreationAttributes, + userAttributes as UserAttributes, + userCreationAttributes as UserCreationAttributes, + warnAttributes as WarnAttributes, + warnCreationAttributes as WarnCreationAttributes +}; + +export function initModels(sequelize: Sequelize) { + const alias = _alias.initModel(sequelize); + const ban = _ban.initModel(sequelize); + const guild = _guild.initModel(sequelize); + const user = _user.initModel(sequelize); + const warn = _warn.initModel(sequelize); + + ban.belongsTo(guild, { as: "guild", foreignKey: "guildId" }); + guild.hasMany(ban, { as: "bans", foreignKey: "guildId" }); + warn.belongsTo(guild, { as: "guild", foreignKey: "guildId" }); + guild.hasMany(warn, { as: "warns", foreignKey: "guildId" }); + alias.belongsTo(user, { as: "moderator_user", foreignKey: "moderator" }); + user.hasMany(alias, { as: "aliases", foreignKey: "moderator" }); + + return { + Alias: alias, + Ban: ban, + Guild: guild, + User: user, + Warn: warn + }; +} diff --git a/src/typings/StaffFlags.ts b/src/typings/StaffFlags.ts new file mode 100644 index 0000000..5297ab2 --- /dev/null +++ b/src/typings/StaffFlags.ts @@ -0,0 +1,30 @@ +/** + * Types adapted from discord.js's UserFlags class + * @link {https://github.com/discordjs/discord-api-types/blob/052ceb2d02da4f71cf619511a3eb47b1844237fe/payloads/v10/user.ts} + */ + +/** + * User flags + */ +const StaffFlags = { + // -- GLOBAL ROLES -- // + + /** + * Owner + */ + Owner: BigInt(1 << 0), + /** + * Maintainer + */ + Maintainer: BigInt(1 << 1), + /** + * Moderator + */ + Moderator: BigInt(1 << 2), + /** + * Donator + */ + Donator: BigInt(1 << 5) +} as const; + +export { StaffFlags }; diff --git a/src/typings/StaffFlagsBitField.ts b/src/typings/StaffFlagsBitField.ts new file mode 100644 index 0000000..2303ee6 --- /dev/null +++ b/src/typings/StaffFlagsBitField.ts @@ -0,0 +1,91 @@ +import { StaffFlags } from './StaffFlags.ts'; +import { BitField, BitFieldResolvable } from './Bitfield.ts'; + +/** + * Data structure that makes it easy to interact with a user flag bitfield. + * @extends {BitField} + */ +class StaffFlagsBitField extends BitField { + /** + * Numeric user flags. + * @type {StaffFlags} + * @memberof StaffFlagsBitField + */ + static Flags = StaffFlags; + + /** + * Bitfield representing every flag combined + * @type {bigint} + * @memberof StaffFlagsBitField + */ + static All = Object.values(this.Flags) + .filter((v) => typeof v !== 'string') + .reduce((all, p) => BigInt(all) | BigInt(p), BigInt(0)); + + /** + * Bitfield representing the default user flags for staff members + * @type {bigint} + * @memberof StaffFlagsBitField + */ + static Default = BigInt(0); + + /** + * @type {bigint} + * @memberof StaffFlagsBitField + * @private + */ + static DefaultBit = BigInt(0); + + /** + * Bitfield of the packed bits + * @type {bigint} + * @name StaffFlagsBitField#bitfield + */ + + /** + * @param {BitFieldResolvable} [bits] Bit(s) to read from + */ + constructor(bits: BitFieldResolvable) { + super(bits) + } + + /** + * Gets all given bits that are missing from the bitfield. + * @param {BitFieldResolvable[]} bits Bit(s) to check for + * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override + * @returns {string[]} + */ + missing(bits: BitFieldResolvable[], checkAdmin = true): string[] { + return checkAdmin && super.has(StaffFlags.Maintainer) ? [] : super.missing(bits, null); + } + + /** + * Checks whether the bitfield has a flag, or any of multiple flags. + * @param {BitFieldResolvable} flag Flag(s) to check for + * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override + * @returns {boolean} + */ + any(flag: BitFieldResolvable, checkAdmin = true): boolean { + return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.any(flag); + } + + /** + * Checks whether the bitfield has a flag, or multiple flags. + * @param {BitFieldResolvable} flag Flag(s) to check for + * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override + * @returns {boolean} + */ + has(flag: BitFieldResolvable, checkAdmin = true): boolean { + return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.has(flag); + } + + /** + * Gets an {@link Array} of bitfield names based on the flags available. + * @returns {string[]} + */ + toArray(): string[] { + return super.toArray(false); + } +} + +export default StaffFlagsBitField; diff --git a/testdata.json b/testdata.json new file mode 100644 index 0000000..6408af9 --- /dev/null +++ b/testdata.json @@ -0,0 +1,56 @@ +{ + "user": { + "id": "887318735197720596", + "username": "Arosaybleye", + "global_name": "Aro Arosay", + "avatar": "bc07e09e3b38b0f719ac5ba9698802b4", + "discriminator": "0001", + "public_flags": 0, + "flags": 0, + "banner": "a_2646a1d05697dc3e4eb4a1ec8cd97286", + "banner_color": "#7e0909", + "accent_color": 8259849, + "bio": "\ud83d\udc99 Filled with *INTEGRITY* a <:aroace_flag:1108526292447543318> who just wants to hang around with friends talking hobbies\n\ud83d\udfe2Up to chat and stuff\n\ud83c\udf19PREFER to be left alone\n\u26d4Go away\n\u26abOffline", + "avatar_decoration": "v3_a_9cd7e573f48859a995266a0a8345f336" + }, + "connected_accounts": [{ "type": "xbox", "id": "3067249045609961", "name": "Doomsday7826", "verified": true }], + "premium_since": "2023-05-17T22:17:05.125413+00:00", + "premium_type": 2, + "premium_guild_since": "2023-05-17T22:24:32.408000+00:00", + "profile_themes_experiment_bucket": 4, + "mutual_guilds": [ + { "id": "1114040703211810816", "nick": null }, + { "id": "773830685659496449", "nick": "Aisling" }, + { "id": "1094449303965147177", "nick": null }, + { "id": "949389505658494986", "nick": null }, + { "id": "631009009578672142", "nick": "Aro Arosay[VC!/TVD]" }, + { "id": "1103628895070208110", "nick": null }, + { "id": "713845644237733970", "nick": null }, + { "id": "842867018172334100", "nick": null }, + { "id": "486365781207154719", "nick": null } + ], + "user_profile": { + "bio": "\ud83d\udc99 Filled with *INTEGRITY* a <:aroace_flag:1108526292447543318> who just wants to hang around with friends talking hobbies\n\ud83d\udfe2Up to chat and stuff\n\ud83c\udf19PREFER to be left alone\n\u26d4Go away\n\u26abOffline", + "accent_color": 8259849, + "banner": "a_2646a1d05697dc3e4eb4a1ec8cd97286", + "theme_colors": [9504776, 4013659], + "popout_animation_particle_type": null, + "emoji": null + }, + "badges": [ + { + "id": "premium", + "description": "Subscriber since 17 May 2023", + "icon": "2ba85e8026a8614b640c2837bcdfe21b", + "link": "https://discord.com/settings/premium" + }, + { + "id": "guild_booster_lvl1", + "description": "Server Boosting since 17 May 2023", + "icon": "51040c70d4f20a921ad6674ff86fc95c", + "link": "https://discord.com/settings/premium" + } + ], + "guild_badges": [], + "legacy_username": null +} From 80466235a10fe8b7ce7be1a24e03ef4fa9b72b14 Mon Sep 17 00:00:00 2001 From: Tavi <66774833+totallytavi@users.noreply.github.com> Date: Wed, 13 Dec 2023 22:34:39 -0600 Subject: [PATCH 2/8] fix: remove vscode launch.json --- .vscode/launch.json | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 3cbc8d8..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Agent Black", - "program": "${workspaceFolder}/index.js", - "envFile": "${workspaceFolder}/.env" - } - ] -} \ No newline at end of file From 2bd95a8ff9a4362908fb59fa8d0b31fc97945eeb Mon Sep 17 00:00:00 2001 From: Tavi <66774833+totallytavi@users.noreply.github.com> Date: Sat, 16 Dec 2023 16:57:03 -0600 Subject: [PATCH 3/8] major: push changes * Move to TypeScript * Update ESLint and GitIgnore * Remove Deno * Add Snyk configuration * Add badge icons * Rewrite commands --- .eslintrc.json | 13 +- .gitignore | 2 +- .husky/pre-commit | 2 +- .snyk | 5 + ABOUT.md | 5 + about.txt | 3 - assets/badges/DB_ActiveDeveloper.png | Bin 0 -> 2985 bytes assets/badges/DB_BugHunterL1.png | Bin 0 -> 1859 bytes assets/badges/DB_BugHunterL2.png | Bin 0 -> 1783 bytes assets/badges/DB_EarlySupporter.png | Bin 0 -> 2208 bytes assets/badges/DB_HypesquadBalance.png | Bin 0 -> 1266 bytes assets/badges/DB_HypesquadBravery.png | Bin 0 -> 1131 bytes assets/badges/DB_HypesquadBrilliance.png | Bin 0 -> 1527 bytes assets/badges/DB_HypesquadEvents.png | Bin 0 -> 1435 bytes .../badges/DB_ModeratorProgrammesAlumni.png | Bin 0 -> 1265 bytes assets/badges/DB_Nitro.png | Bin 0 -> 1836 bytes assets/badges/DB_Partner.png | Bin 0 -> 1147 bytes assets/badges/DB_Pomelo.png | Bin 0 -> 1414 bytes assets/badges/DB_Quarantine.png | Bin 0 -> 968 bytes assets/badges/DB_Spammer.png | Bin 0 -> 842 bytes assets/badges/DB_Staff.png | Bin 0 -> 1478 bytes assets/badges/DB_VerifiedBot.png | Bin 0 -> 4637 bytes assets/badges/DB_VerifiedDeveloper.png | Bin 0 -> 1480 bytes deno.json | 15 - deno.lock | 2182 -------- package-lock.json | 4725 ++++++++++------- package.json | 37 +- src/classes/banManager.ts | 76 +- src/commands/about.ts | 18 +- src/commands/alias.ts | 32 +- src/commands/alias/add.ts | 63 +- src/commands/alias/remove.ts | 17 +- src/commands/alias/update.ts | 26 +- src/commands/avatar.ts | 20 +- src/commands/banner.ts | 20 +- src/commands/broadcast.ts | 55 +- src/commands/changelog.ts | 12 +- src/commands/checkallusers.ts | 25 +- src/commands/checkallusers/handler.ts | 11 +- src/commands/eval.ts | 23 +- src/commands/guild.ts | 21 +- src/commands/guild/disable.ts | 16 +- src/commands/guild/enable.ts | 16 +- src/commands/guild/setup.ts | 18 +- src/commands/guild/stats.ts | 18 +- src/commands/guildmgr.ts | 56 +- src/commands/guildmgr/add.ts | 18 +- src/commands/guildmgr/block.ts | 20 +- src/commands/guildmgr/info.ts | 20 +- src/commands/guildmgr/remove.ts | 16 +- src/commands/help.ts | 9 +- src/commands/lookup.ts | 122 +- src/commands/lookup/aliasOverview.ts | 34 + src/commands/lookup/userBans.ts | 49 + src/commands/lookup/userWarns.ts | 52 + src/commands/maintainer.ts | 66 +- src/commands/maintainer/add.ts | 46 +- src/commands/maintainer/info.ts | 65 +- src/commands/maintainer/remove.ts | 40 +- src/commands/ping.ts | 56 +- src/commands/syncallbans.ts | 69 +- src/commands/syncbans.ts | 85 +- src/commands/unban.ts | 56 +- src/commands/warn.ts | 126 +- src/commands/warn/add.ts | 42 +- src/commands/warn/edit.ts | 63 +- src/configs/config.json | 4 +- src/configs/example_config.json | 20 +- src/database/models/alias.ts | 34 +- src/database/models/ban.ts | 51 +- src/database/models/guild.ts | 72 +- src/database/models/user.ts | 37 +- src/database/models/warn.ts | 59 +- src/functions/READY/commandInit.ts | 52 - src/functions/STARTUP/dbInit.ts | 44 +- src/functions/STARTUP/functionInit.ts | 34 - src/functions/STARTUP/logs.ts | 27 + .../events/guildRemove/removeBans.ts | 19 + .../events/interactionCreate/autocomplete.ts | 36 + .../events/interactionCreate/command.ts | 35 + .../events/interactionCreate/component.ts | 19 + src/functions/events/ready/commands.ts | 47 + src/functions/load.ts | 53 + src/functions/utils/masterMessage.ts | 54 + src/functions/utils/pagination.ts | 127 + src/index.ts | 56 +- src/typings/Bitfield.d.ts | 36 + src/typings/Bitfield.js | 250 + src/typings/Bitfield.ts | 205 - src/typings/Extensions.ts | 82 +- src/typings/Models.ts | 67 +- src/typings/StaffFlagsBitField.ts | 91 - testdata.json | 56 - tsconfig.json | 21 + 94 files changed, 4700 insertions(+), 5574 deletions(-) create mode 100644 .snyk create mode 100644 ABOUT.md delete mode 100644 about.txt create mode 100644 assets/badges/DB_ActiveDeveloper.png create mode 100644 assets/badges/DB_BugHunterL1.png create mode 100644 assets/badges/DB_BugHunterL2.png create mode 100644 assets/badges/DB_EarlySupporter.png create mode 100644 assets/badges/DB_HypesquadBalance.png create mode 100644 assets/badges/DB_HypesquadBravery.png create mode 100644 assets/badges/DB_HypesquadBrilliance.png create mode 100644 assets/badges/DB_HypesquadEvents.png create mode 100644 assets/badges/DB_ModeratorProgrammesAlumni.png create mode 100644 assets/badges/DB_Nitro.png create mode 100644 assets/badges/DB_Partner.png create mode 100644 assets/badges/DB_Pomelo.png create mode 100644 assets/badges/DB_Quarantine.png create mode 100644 assets/badges/DB_Spammer.png create mode 100644 assets/badges/DB_Staff.png create mode 100644 assets/badges/DB_VerifiedBot.png create mode 100644 assets/badges/DB_VerifiedDeveloper.png delete mode 100644 deno.json delete mode 100644 deno.lock create mode 100644 src/commands/lookup/aliasOverview.ts create mode 100644 src/commands/lookup/userBans.ts create mode 100644 src/commands/lookup/userWarns.ts delete mode 100644 src/functions/READY/commandInit.ts delete mode 100644 src/functions/STARTUP/functionInit.ts create mode 100644 src/functions/STARTUP/logs.ts create mode 100644 src/functions/events/guildRemove/removeBans.ts create mode 100644 src/functions/events/interactionCreate/autocomplete.ts create mode 100644 src/functions/events/interactionCreate/command.ts create mode 100644 src/functions/events/interactionCreate/component.ts create mode 100644 src/functions/events/ready/commands.ts create mode 100644 src/functions/load.ts create mode 100644 src/functions/utils/masterMessage.ts create mode 100644 src/functions/utils/pagination.ts create mode 100644 src/typings/Bitfield.d.ts create mode 100644 src/typings/Bitfield.js delete mode 100644 src/typings/Bitfield.ts delete mode 100644 src/typings/StaffFlagsBitField.ts delete mode 100644 testdata.json create mode 100644 tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json index da945bf..3f2b25b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,16 +3,21 @@ "es2021": true, "node": true }, - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"], "overrides": [], "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }, - "plugins": ["@typescript-eslint"], + "plugins": ["@typescript-eslint", "prettier"], "rules": { - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": ["error", { "destructuredArrayIgnorePattern": "^_" }] + "prettier/prettier": "warn", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_" + } + ] } } diff --git a/.gitignore b/.gitignore index 249459a..8481af0 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,4 @@ node_modules/ dist # Custom -.vscode/settings.json \ No newline at end of file +.vscode \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index 36af219..20d0d06 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -npx lint-staged +npm run lint diff --git a/.snyk b/.snyk new file mode 100644 index 0000000..af1a88f --- /dev/null +++ b/.snyk @@ -0,0 +1,5 @@ +exclude: + global: + - dist/** + - src/typings/Bitfield.js + - src/configs/** \ No newline at end of file diff --git a/ABOUT.md b/ABOUT.md new file mode 100644 index 0000000..aae1581 --- /dev/null +++ b/ABOUT.md @@ -0,0 +1,5 @@ +# Agent Black + +Agent Black is a blacklist bot. It stores every ban of every participating server. This bot is designed to warn participating servers of members who have been banned (or who are troublesome) in other participating servers. Currently, the bot has more than several thousand users blacklisted. + +The guide on how to add the bot to your server, can be found [here](https://github.com/FlippedCode/agent-black/wiki/Bot---Getting-Started). If you have trouble with something, feel free to [have a look into the wiki](https://github.com/FlippedCode/agent-black/wiki) or [join our Discord server](https://discord.gg/TqBwHtzzhD) \ No newline at end of file diff --git a/about.txt b/about.txt deleted file mode 100644 index 7a82efa..0000000 --- a/about.txt +++ /dev/null @@ -1,3 +0,0 @@ -Agent Black is a blacklist bot. It stores every ban of every participating server. This bot is designed to warn participating servers of members who have been banned (or who are troublesome) in other participating servers. Currently, the bot has more than several thousand users blacklisted. - -For more Information, please have a look at the wiki https://github.com/FlippedCodes/agent-black/wiki or join our Discord server https://discord.gg/TqBwHtzzhD if you need any assistance. diff --git a/assets/badges/DB_ActiveDeveloper.png b/assets/badges/DB_ActiveDeveloper.png new file mode 100644 index 0000000000000000000000000000000000000000..e72d3d831c3b56d9d6188171ccc12f7771a06ca0 GIT binary patch literal 2985 zcmZ`*c{J1w7ye;r7;p9wL&wbu9)Ksbac0syMhA;&iuPiG+y6SOG+M2G`GY&-xQo>H-E01zw>0N>pJK;tn0 z@Z$3tEwxS;Ozu~Wk-*76L24<44n4bEo8)+bC1RGpis*I+#$7 zrR`q;!15S{L|BK-P@j6^uiIt!#H_Zulo!c=BrDfwg>dHCfN=EP%yjfjPf=(t z^H+Rekp9m5_A{j&V}!?ik~&o&&SD|a_>8IK&K#BsZjh2K8kKi%Im{9>9r&gzr`crI zv2pLPCGub!iT4Y~H;kp2?p0nXDlORz+M=}u4ZhpTlaNHeGTGAp#zmd#wAF_5@XlN4vVxj#VXP3p$fM zZa&`y-+vWNzw1vri!XK%y0FF+4m>DX6l+%Z9k>#p7JQF-a&W)-{z_ZY(VsYJCl{QZ zlM3d|v&0!E#uf%I(e3?U!pJbIl? zMiQ z?log_u=OwLsZs7HD14s%*(~me#ZfT}&MD8Kl55EHBvAg1DB)<^O(X^?zs^cbV>xu< z8ZLlY^6K&I)F@ua-UB%uZyAwT^?4_@)^)6P#^zniS+i<34)?v(7S%NZN$GGk%J2~W z2y(SYQt)}Hj##krN1d?{DNM1)q9=cM6)CR$VnYWjM(#pY_DQ2d__oXVE#(yJi=tt; z>l|+4IS$>m9W>XGl!}tzSFMx9wIRSKge8-D=)FcS5c->FpB$@pFhzZO?7l8GO4mch4P>H08y&5$sUqY!VAAUSk# zH0EnQsJ%M-@x~jqd>O_Sg&k-raXn0c@n|$!NRxXu#lxv~VK^V@Iu;qW=2I7SK@ira*ZI6t z`J6Z1O(rSL5}W4&_Wt)=c;7y#c(zV?Js*;_WvHunjaE%gArq(ED4ngjW;PCq+b%=5 z*bTOYbSN)ot-+U>HbDC%0pr~a_!)w+CfwaXB6L@GQ?+gELu=2kpssY)D;|?h%dHA! z)_a~Aqil(|La;n+8LChm^zps3!NLeE!EuZBTxGT<)+Sw`@BGnmVj~lLJwM1Mo%Dm% z#ABO#@Rl1-Cc!q3g{auRWk`P1I*yQ7+V_r83Bp(vQhhY9IPZo;Qq?KWf(tc>Iop+4n9eppNYDIq?9?zDW_e0 zUb-F|6E?|+?qWDw%;tGw-gmWs;SuijQEv>~mAT{n!+Ao&JG(iz?yp{a6`|@c3g~sf zq60D9C{m-Xp^^_F6g!$*zl{o5JBXW{o{!o$-u_uh-)*!xlhul`IV|6vN(%NdkfsZ$ zS%1pHhHmeM#)r`gS|e>U1orfW;_n5ls&5Boyd`CmbA$vk;BK;|of9T8#Uth-w;WR% z{$`^!glNTAge}&-zboaYVK&06Y_))(f82jDU2MK>QXu-B%#{0*D&DBq0NJ7dqjoiz z$K?PGoMX5F)lUbclGvL`;WPGW3Fhkg31;bA3BArw$q#M3cOs46Siy21KGpRmBEfVJ zoD7TW=8;F7scP}z#*Z(G0scO9BNN@#OP#wLVO9SWV|7 zK1Z6b)~%$3HDZFqktTdm?4O5OQEeMOeV9lvElkD$wSk>~#A)*ka{bf%0EREaxgF}E zewpy$841`A#y`+0x+}84Jv$^}uuYZDgbW>g5GOoBPKe{9rk=%b>m%mRG8ad%- zP5uNfi>nq>(Rn209mOl0s{S77!0cyHSgAB-;I)g)ufa~rG=xQ32S zroJPl&I%+S>}>3x9I8GPN&QW%9SIvA^5fA-t~zf|XU*fTefQeW8*U0!OofyCzx{t( zNJ`Gy6J%79AKPa5i&s!2hi+yFzIcg@lcp@3D@hPxwsr(f#LDnrC==p76yQeu&Alrg z{Mh+sDX{%n%I^S~o6(B+hVbAbs4|SC;?Al`e63>z@k~fJRvK9QB7#RdCW;q{bBxti$jII4$D@IOqSZ;BSOL^TXc7t9Di~C-g{Oz zaU$iO;mBN%=V9~@H8&ofi|q$NkxUzN_U2v5e{RCEh~^@b4Nl2xC>s=gZ8*-(gT0d( zrr4)F|A08cQQC;+tVG$mQT3PKC{hij+4We9&IkH@hq9)RUlP!1p)QGV`By8@>FRV! zM-Ap`bA&Zftr*aQzisH{_=%kDj;Z|(70tDQ=bHHx6KhlVgLr;dZPg4Ji2DfSoM*F6cA6_ccHMpn5L1G%8Za=~3Gnh{7gMOHHh*NHlo8!9&R5Xs zlJQx`&#dvm9C8+Ysr99JWk!J=iuCh6j*=H7>+8Q+mDp68@ZzF2Yc9{L)ykqVO7xNq zbNx6hMe9zW3LDmA*3Nl+nHF*N&cGMdW$fjX+>iUKuU#65jg43RCbU%+vCC?Ri-%~^ zJxT!Bp2SPO!SQ?i9w)W&W%V>nOChddv++_uVONaje{A1>{h!JoRwY%Nr#*1l?r_>@`_5b@|R`hm96C!G!#`eloX}q6#Jj8sr literal 0 HcmV?d00001 diff --git a/assets/badges/DB_BugHunterL1.png b/assets/badges/DB_BugHunterL1.png new file mode 100644 index 0000000000000000000000000000000000000000..fbbf12b391c650cb79e10619a7423be267ff7964 GIT binary patch literal 1859 zcmV-J2fX-+P)GxN@z^9@Z-P7ayMmi-ePb$8;?%nJ{0ezNtq z6YH9^=f>CyeE-?&=N}pbO7zE*zh_}#zdW~dWX_MPCtdW#*p_jCf!8ny1b*7Fc#BSb zbJKO<+XRRZAq)cM!XkZr;fKAk7QRV%eL!XqFkF0}aPOzKey+u@Yt{I72cEo|m|+kk&i0YDa{!>y+DrR)-TwFf#|A+H9rGAgJ=j+4uWum0E*Fl6bk?*bF>2B z0>P$hKWz-1N3d-`I0P|DN0AWZ90}tHL1>~Vawt?g06q|eB#M>{GSvK$^$&a?@XZfI z0r2zPYYR$<0)1vtUw)t(f|w_Qq}s-VX!M`!^HoAnN)+g7Ai3z?^T!{lgP??pVCt-4 zh+MV>F}^@40Qgo0O*()7#;0l^;Bs1sb7jz0Eev8JiGV=6JJ>a27^*=`BufYdjFyF} z&pWWKfccPV4DGvhcA01hG>wg=-UM1G6?=hP5>%ZRf0iK*fvmC^&AFk9wnX{%DoLV z8AmozlrRsV7#N8$jB34u!t#KoyuhZ4l)8d0?PZ%M5Iiju%P(MmEuB>Y^vR)}JSrG~ zYV6EzClfv&5UOpzpIj^Arcz4+X=N8xM)UzB0>B;uDL0hC3FKx3senMrWD!b0PFAoQ z2#^PGw~P_~xw?QVAmD!V4CSBnPd{r2I9tUyC6sd{tOy9WdIA^-)wuZVAmI4u8iak# zi_Z!IPLHlZxd+Ej)1EH^f}H&UEIP_OWcnp7JSzyO62Z#6!I^)A^tvP)JL({y8YW$S zZs!SGTmcYJJ+q*?%@gx;w!q9=$rOnoUbA|A%+6t8!WNn-1QeY?L={ArrqUC~v2DQ_ zO%_oZLdY-L{wAUVh_^*=KBlh15JJm&kiUbqa$ZFhj_127$}ySTF>obOtq9$xV;J^@c#gs5n>UY&H8N+GYqv7K|D0)j%%< z))@>NL(A1jLiBOn23jGIJStwQW$cp&v_e2(2ubb?N^uFhI)qLTXd4wTrF&REL=pr6 z)u?z0iC|8PI0gX!K|nPst{ngf_N-(8-a$YyAfmA|$f+ER3BWrDC~V;p62Tm~0IC3r z|Lst&OQZ|}_pV@Q6_5l1?VZ6~5TL>e@d1)SpuIDgqg#mZAAA2NgP?@YVAsSI)odW; zr~f?&VhoIw&>8IN7sTuu!g}tT4vr2%=*&O~hR`4&gxJOi`}lpT#IF~E5Vx>|&Y)|K zfW;idK*G=9XE~J9-UB41bOu9)O%c|S*rAHR31)l^rP}MA8%Qo4#1bn3&6;+`u&BWK~#7F?VC++ z8$}q$pIN`eO{(HjC6pHl_rQU+Ky%>2gc6Od!?@Ofa?+`nlvAy}{KmU1Vb{8NgCnqN- zCno_o=Q{skdXfM0eN#N&;pgn|-@b10rw{6UbG8ZzqQNBt|6u<2xAQ`T1L*8E#SzXx z;i@j0YMyR2F#pw|pe;kWvx!1MLR>0=`1WVBP&RjfcN^l@DxB^+4W*Yac0SqdJz+Hz zivRq@GT&*&?xrGK0)%U7P%@W+fo{K0dBbVwxB}hie}mNq=(hV`>m1af^pnp2Xd3KQ zqXjXMxr6xjgL_c6nrGr5g)7cuXHSUr`o%Zl>wdJK)qr)HLZlkRM5Y3XAvFa|+Z4}g zeGMZ$2c7(WE|wQ}=w0~0ju7b=G33}L-)-K57|2W@M;x}|+vtjdL&+7(i_Aet`x*YM zLYXz=5GfOZ>|rGn$2+7ji2WSYkvPcyaN#2B7@x%=QtATPfy@f4(hgohFo-KY4#J@q zgn8&bb3_^}o7f>Z=@f*Gbrom~gn0^PXSuF4<#GXmm9W1*HL={Sh$ z9`BGkl{iS1KZUB?K?vqi1!jRrIs!5FA*r9Y2Ewc<`z=xxQ+$zNjslyZPW_1sB=&Q3 z<;>-xjXIC+V$`n&QVp@nn?Rr{L?Q)t@(yC~3AwN9Ah!n6d}^SRfFY)h3D=DSkvhdi zX$-OV$UWUqc3tAm^zEna1ebhAao{GI59l7+@bbKeO{r$IG#o@P z@x3*WUqD+iy2qgkSD+r$;d1RsyF=_$QUl2x6vaJf?`0ncHp69MaEkXEVzO5;U>UKABg(sHAsM(tRdMU zRyJ2j3svtnhu^85ws6nMep2EDl9+>>{b%Ab!&~#))A%1H?)^z!=vZi=Ldc=H42<1aDvl(o1@enUl5&yYc z!1)4XNkFw9n?QCbbHeT+@6NHeziN43Vy_qt;ig-Votu&sh(Dc1VH$+43+(QfD}D`` zy6G6!Wlcke^m*rHF%}TrlfE zBvm(QuoB!n3?tS&P%32%<$>IxU}qCcc&4-D!wZQlkQ2&WeTI_rxhUeeuyJGEE(aK_ zLHw+!F8GX;LCzIocx|DoBRmqhLq5%`{J7^$;V9Y(KN4c*R0$N?LCPz{TrhV!#RkNP zJ>=rbB@Ac6<-*~I7-fZy;`E9^h#4oBf^&leCzU1P1R}4{O*T~S5RPP67h(3SQ#z6} z$X=l{_K?tZf!$eZK*I39)(N|C5(wGjLUNFkJA`l)Gff)e428uP!rZE$+z$%1LTA<- zq=2Zj>ky4CAxtXiavE#Sj-2>f!V7=)DI2Vrj|;2U7_$zjAnf-)$$3QoKj?1x=9Fh?G#JBs7(icFj^ z^f>N3lncb+3CLMs?=B^=x(-DA(X+j^SgXIm4&e>q>Nz+PMc_>%woH^(()MQ9h_xvW zs5bD9C+zl89WutA(TaHYGqmEoM|BY8QiE@QUKc;>;=hA|w7g|FbO10ygZLIJS{(#%_(%3pFh^kt|v-QX@4pYQw5cg`HZ#KgqJ#KgqJ#KgqJWVPW?Mr2ubu#Jlqo|S#dc6Nf54}lx+ z@R+{}EY7N%jI&k(T3rIZ@bDD)`xECd&T*WGHNbFzm?$o`ImF7NthDEBaOVmuOsI)} z12g04b&l-=`wmSBbml(3XuRvtmzVv2*T>5b!Yq0%i&z`n!4 z*B;~1ur+yZgq0Ias1cNrk_1W!^9(C}tT@2B8WTC}B0fMcisu2XZ?-YdU;P z!1i|6it|7>6H0&q6eJK6hi99YkWcV68VcfMP3ef}IeG>=J0H<$F~CF`M2X}rP(qyl zqns|4i%cRNJ~pmnNd)<3Pbt=vmp~OEPLd0M2VVJO`nj5oB6?4Xus85JEd-R{aybQB zYjJ|1C_G+27FY=cBg(#FN$F_-mKs~dXmh&~w4IH0sI94n(-Gfpy?3KfXSWq4Qa%D* zz$(QY6653R^Z4YtTM^>s++ti1V-RI>IZ1v`lBBU%3}ZtBJvo!jtO7A{sJ9wG86h#K zB!yW`m|$a&VkaUIjARlkqd*DQx`r}9mU8y(PjLR?4I?e26v(js!K1(G8O|h-Vb&9l zNcivTR~3=mOEz&aSYzCntpL0WHwME#w@^r%U??_X)t*d@v3MB7oO>C~Tb;_jf4WKJ zB9=7~sA1ENu_qto#!w(uopZg(9eV5M-@lH_S7uo-4WQOujjsK>(9yO7`9RjQuo#Tr zD{LJLMl3F@GxP*f#x*3!pHH4k>t#G%;DvvVWAyAKo_hQsOUP=G4YHmj!u*Ccv7Ay# z6DZ+cj-)t&MGv~FE@7MH4g#pbYtasPY|d( zDvJz@1tn8!lXw(?_P=w{pV6})DXDy4&EMeUys66l*307ap&!64H9ANn%4NRU)v9~r z1#b}HXiV9k_1X)z9uj89<|rELV=##0Z%+nT&nyoeXszqdw~_YUw9|Npy5pxb;t;h6 zI-an-n94ZMXX&=*+$q--=9g*K&@dGQrx|J#rM2HSUkC9U3Ol~E~Z1#$#J5!eyT+K2^e za+%cBf*N(#?)BS*P_&9y*T3+WUnl}48Gqvxe*WAjTH6kx5?Rqd(EQ1Sv?pT&>cyD# z@U*{eOT&tKb=N-QsTb6B{$(*uoFxA^`8!l9T7ksfJDVWe>hW5vL$|?yB3(jq|I2%} zt*BRb?f$UUrLGJ3^j$ZwoZY3@60Jajk}V(DjhDmSI2}Ehs_@Hp;jiI`gbT4R@^nl| zVn^Hdw8rYL{gznEYaiCMr3Fp*wrEeY7_=|#I3}TD(8eJ8tlR!T*Is36V)Xh!yvmZp zT7<~8_~bXDJoC1h>ylTVDIXr+@t-{`Bm3;l4ek9JjW81K)e{_i5L} zBu*)m3uS`p1L2ip?G1KG_ZszimJ3ZGPtu-{_~zwF9#g`2nhh(|kPANcaJz1B{@_}C zMsU_!H$J^kpEYxyym$t6^^O(RlVr!{NY<`?a=J!Wpk%vngu@3nYEtL7IHTC=jHe{B zBp>U%uP(3edTAC!3j&x(^eu^|T0xeypAAfB=HfBp^DXx<>#5egkvcfD#4u;(oU7OJ zELD}13z7Ax2}kc9$7F5@d6H>9sGx~@%9>{r0@0}b(u~su188oFU~{9sNMs?tV0s9x zVu$MN+q+zqif4`WQru-_Y4E__`T^ugCV|KTNadUvr&^p?j1wnrIvp(cff3L@^to+e zmUX3|&Y8bzbTN#1jE zrUrMsrQcJDI|YhEShLo$4|K6>@AA`aKNVs-J00v5c$vw{p>ULsNq67sQm`7rosH0D z%|>z4U5$CK756ko6>G|OC_?VF$lPp!#j{YPxOGI2^x6$&}v%K%>m*Cyf=?Jji zzRI!zZrdIf2dd!l+n7K$lp6}NB-Cn?Q=lXp7A`A=xK-DVb32b=9U&GoA59oASGO)G zdYN8P0@X+71unj7Vm%;4WE8zls3?INLeo>M2ku@MB1!0f`oZGY2NmsNN7zH3_!hTI zW^bn=h2q%vcJ>l~@=$53U`vicEcgvr0{AK?;|TjfXXuAvEs-%rFRjXtUBw1wHF@`9 z**MapEb1Ok6dZp^b_DGPE(^{Rdk|vcw-|;Y0%=M7$hEa3gZQj;^F@=oeB}EgYAV(5aQWQZNawO3t1s7x>M-oL+ zP(c=QB*7&G6XZaSB&ehyf*i_`1e4@lkOw)EAdeeTW9;DLW;Pw&OEV69KS(uU42m_{%2JBm?ZVrNqqQX|^&p*| z!xudJ{2&|C_RI6UKc8d5jJ*aQP}Ou`Kw_48e$D&cTkKrnOy!pj=6n6=XVFU9TdEvuawa8p+Q0JY~r;R~>3AsZ@~F zRL)^M+DfycUC)2y1NskH3gS@JT;jTBy_c6V>F1Llr?uy)IXhG@V^y@JIC(unsN(hBz+y=zh8fnygmQG#gdtry++> zeiqXhZj|WBs{FN}Dw<*M0Zn$!@;4L{9Lo`>XrfU`#1O0Lok=w*vx(he?iw%7Chu3z zUH#gFE#!#PEzqna;uMG6uIZ4YM!eBwhq%H{l}@mfLl{+%#9*DYjm2)yU78*|9JzdIFchSj4W%Q~dN+A9Xy*5tsIag(N*Z z$`P0Mh<8bz<%kfT@g^yN91$h}&LstsBSHnjnWTVnM7V%hOA0JUgba+aqzH0E*a&D# ziX=ybj)bzLh;l^uh}24oEJvgenNmp&kR#G)0RKs9h#ZkhL%5Q(;J;=ac+~_sEiElA cEiE^jKhCN#VYlling9R*07*qoM6N<$f_Od_^kDN&54$7;2jeRDDED3 zy`;xGpn(X*GQ4v{2wHW}66k-#3Z%daq`(TKzzU?m3Z%daq`(TKzzU?m3Z%daq`(TK zfKQ+(`UP);z7TK+Ot1+QfvDn-GH2mZ6ynq!z-kn|L4i=1qwPcQr}GF!h{99I6BGnR zS;z0M4&1>S?kNEioEcO)Zv>@H-|KH5eyCD`b8!>7W(dWdL$6DlLKKdGkpeJ6F2c7i z{XQ=6DvIWh_wz!o0oaU%Aud|?6>OLiFv5Km8@Xt52Ufs$U07vx(<|3Jyj9Y{w^i9^DcsaUXY9`w z#+-WyGb3pMD`#KtEAtLX;wG$geY@rr=ZW)#8TSyzrW%e=7nNZHy01SA!%^1w zs=r~GHFmoV zV4&j%%NNby7=(L;o5ml<$!AR(yBxl*E?PmRF$)E8xP)1QIR`nRB~auPv@&Aq{0RKC z0d6vg=b`lo9>KH#){h{p@6qZwWGj&fDLqdCKpcL|Y(&mNOg&It;CO z`8a_3Cx0}anSz2CvxdaUmNj$MkyNA-h@h6m3FUQWktBtuAPx&~#FRBXY=rWxMo^Jj zpqO^!;RJ-U2N}U`>*LJ6{xl+nE0(NzT4eKe$5$`P1q`q)%+viWG3rj4FW+hMMh1&O z1Z&G@Aw%BCU=xU7%cb;W${QK10>yCUk`@ekBg2S5gs~fj61eh4hB1K%SB^_Pmi{T%Z`%Tr!k5GIA4$;K(JDc_SlNfr!+(gn1J>xFoCbzg`^V{){435GT5H zCqk#9y~iP}=PeGAyMrc4luMX5^yC;Uh=mG7oHv6i7DBq{o_F5JShzsMR4y$jZ)Cg) xfr#eHy1D#;4QtU$5?ofU+v zKuU?J8l}&i1KboUNO#}92vzrc5wP#Q&ClPbPoHjpgoK2IgoK2IgoFVgJOY>NuW~wo zr4$5ZqTywpG|2$%&22&jpK z$E4dI#wAv)0-YC&*(WnsZ!|*DRg|Hy!!+ov=hgQ$h>_R?YHh3)383sm$BX9wv)gX8T|jA`)4k2^A+KvPh9)kPNE{7Dvc`Ev=Oy z0?rPSfXtWgz%-!gZRXFzU2wojAeqW#wu(K+@dh=o+vsrLX=`JF2zB1DX`LIda{kbOF(J<)#AU8del%&XD0m5m7z?BV z_}Q>&?pi}#rE!^M{Qxn;qU_D2pT4-c;qok+^^q%+D`1F`K%L=5=6Mh2N#&=N{YGZ{ zFdvtjLf6bz4~kgXZ3d_-7FQb&Gb4d8&`V$gug@ggmY138e(gX0g$ZE~JQ2EP_K*F# zyq9Mwg~r3C)5W$j`c5g6MnsrH%SDN}i2rm}(sTR^^Pl47X5m;79dRjk9vl$YXvEdo z?XEB(UH8~^5EU+(v@>%M!jE7}pNm4|7w@_Wt&3TAT@&Ksp3eP%{5ePyEht+HF}?NA za{p&NH&wn>3N?LAC!^dn%rzk{?&)9{Q;i(N;`{_|&~;KA&hzkEezqkI40*)N=-hFxnnbGZ?_K=6QzLV6CVhwq8#lgxe(T@%SY z7K}q64q`ZRfp}}EsnO0zDe}6#GYq5Xc2Qbu*v6sjHZIs!@LC(MPuM*;TRqI#T-V#I z{A_cLY&2%72MeQ`nFi@|u*7K-FRkCEo~XRdC4HNfR`4|c#iX6lG|#vDm(6CEO-o5u z!47W=E%KJ|mWi7(mG@_0h!noKw!>)zuDI7oGRIMOZg!XCx4zau-P8oP($Plc;-C0>`Nx41$xWwJ8d;(RVU-XKQoq+-5~T z6vtB-oj|PUAMUZ`P#@TdCRZBfOj?>x^M=K!kvN>f_#TM8h$CIVW7D>VLAo={YDnZM zF*6I`(F5^dG`5Wkc~;N$Hq82w!cZv zjtGG2v_F9R3dDopJk+YxV&$OoN->+hx%%wgMIpVTzYx<2HCy)xRu1aaawza}a%&)6 z$K)U;Y~3R`#Xeax!DF05jDU-K1gF(}kj7O`MU7JRiGcgs-G;KqNg$~P#yZq|L$KB9 zvjficpv?APyDr7|aYIO3oHaY0E)yc>Ul$u|H3jik_FT}sv-?~&FC*Y3L7haAe261> zDY;5VCTY0Iu<{{};B$$?)BkTp-qS6|mPn35W>yZ!QDV-$TY_hJLvY??L(n&}6C&kW z*V$?q-USM2l?r)8D#tEV46eC#dx)9XgkoU`)Ltg_!|p?yi;*7#W8!kNkVDdWkV8(c zF{0dg&a@5_jF*chf{)xG3L5AgL3bNnLzgq9i0FBqSsx dBqSt^!xSHa}pek5ed_N+@VkJu8^AXtgS#qS6%f zhN=m|z-e0cA!9J!ZNaAjSVPYFGk$n2%O@E#&}tg-5d(I}8FPSh2c%gUiwEJb`S*X% zV1Nb~Br*;_8;t{MMAtikWgGKNMyD95C}8jq8A;`OR8PR+$mDc0?t@f~REBYgQk=A` zk;*a-QQ9iD8~Y?vW@KGj9JCBAg;mTvr5VU-@V01M8=wOvk!YZ$cYL$Bch8|9f{-5y zH|7#;CBcBTGrxBSN#Ca^h&dGDEu(i!}Sg}4aFGy z3pC>2ee3yue0hO&*1!tG%cQoctJuxl6oRDhJFk>{#`@KlHG&o7uq#Fq5C$@OlddOAF}Qt6iFwk zD5h#^N>j~y8~n{p*Xu(DVu50UiegAj4aT2lcgLk?0kc#S6J+!$MtColrJ@ZUaqrYO zttJuGytfrp4kgU43;dzy_>1`%O}S$r8&r!BKJu=j0evF%;H}$`oAm&GA_HdGQ=Hn5Sw&hx3eq>C zsZWVi1g(~1;91W;XQv{*Np7=B=SK{R+odyp6}iO%YZN&yEPM0$K(xG1I+FI$A7KYZ z#g4FkXt~D~t)G^l{|u$A22DAtE6lUqFbO5+_hz%6N>OO8>W;--_kvlxQib1JUzz!lK#|<#FJ>IL3gV794Q=&7ORtNg#J@uYkafgqXf2?kGcpTTxzf}`QGLiyWgT(q zEkQF;p4eg|ncTIO=b|H~gFxN+Z|w$(DLiJ1(cp+vZx01hv;&U{DJ<)>`R%T-qH-fe zoJBZrosKvSBL*V0IdGg(EC~7yft|Pxj2VbfIq2KEz92`OhEW5>s5o$(QkO+J;xtMz z5FzToO*rB-N~@EmlM#Er^%dVG=Cvb7{5JbqmT`#E6tu~X12^o5)2M`j2%2&WfGbA- p4`$dA*VNS1)YR0})YR1I<`-!Qwe!UGU~K>Z002ovPDHLkV1kdYm4g5P literal 0 HcmV?d00001 diff --git a/assets/badges/DB_ModeratorProgrammesAlumni.png b/assets/badges/DB_ModeratorProgrammesAlumni.png new file mode 100644 index 0000000000000000000000000000000000000000..a378cf182f0d346bfd516e71e70e85b930b12b20 GIT binary patch literal 1265 zcmVja1sNUlWoBjN;6RV;@$i4$N>kmUyE z1q!WpIx{K^6lJtCqnX_`HNPjjs@FUEd%CB4x&`3zcsw4D$K&zb0D@)KlTHeVKSOCy z8XjHz0*+u{5gK)y<%%Q0ghs6^-r~t;;AK(aUF^EQY zle`i92Ngj%wxdVqOR$W!9mE@K0TqG)f94_pUUA1S$oSJpOS6mf6|G^3!`G z0yu`cKrjva^Fy$Nu|OYV&NK023u*_Y*$3X<8@xziN3;ZzKE4ir*vBAzEPhiyvBXO* zbAZ>|YyyB^#ZKG@n-EQj^XJi{7fUciNuc%Vy#)d_i7*jQXa_>h`5=Dy?|7R{Ht7rz z@d-FWtp8HP$*b^a-qv|8RJ3c6)Y8x)^Pn+fe7ejhEe-A?;eR-3?h0{SfvwQiE#XuBQ8a-okqR+66yxQ6=EuR3wsyV z5;PZxGbRO1)Le{VWksk>IM7?rL`@)qH}HL+?P5v-aSoS7HpJ;Cs6U0D<7<=zVhq#b zKUDTrt3JrdjX(jei+2z}0yQTK8*T)`o~VlDQNPs)n(xoJtKm2@>!$XUDu1C#~A!R$)JndNpP zXl8%jZ$Zrv?)B2NCe$ldIXy2j!GN4ydYK~JYYK*F3AAyuO;Ng)*85S7PBT%UMyq$m z7j{|#NjD?lCq;Hq%<8j?7|d|6)GjeTKdwo*ipPaUhzE6vMY~?uX$!Oo)&PaEhy~nw z6Hglp*S$tJiUCH$A{%*0zWVF;N*jtcu6vCHLh)Y_Eug|!#26b@=4zIj1;%&M;VK*| zoM@Y&f(lMGYs~^yE+%^3#h&3Xo4aR!R~%UK8~%oa9{g8i#@) zi;j6CQ=ao7#Nqn1vmbnTcen;)(iKLEF0PN&-n=~enOLk|2NSz_08B z{#67CoplpV*}`$BBQ0Y%!ihi<$0DU=O^!GdNFu+xA!5?P=Io&i$ZRia3O;eG@UHYva{2N=K(i27~GDulyZt5 z#Qm9e+t>!B?4WDphZJc*8x^N4uE+SQ5=T<%4*C)imxdxPeKV7;BHr9YWdcdolg@$I z#3MlZJe)2naxPNNxc|=-YCxp|NxsUL(z;E?RxXf4=1c2%bsXM_$7SU=9*@W4@pwEQ b&rbXgJRGav#ihUQ00000NkvXXu0mjf=l&|E literal 0 HcmV?d00001 diff --git a/assets/badges/DB_Nitro.png b/assets/badges/DB_Nitro.png new file mode 100644 index 0000000000000000000000000000000000000000..38d2850a1135b902ac8467df4d68f3efb1b55a24 GIT binary patch literal 1836 zcmV+{2h;e8P)0K~#7F?VC?* z(^eeEf6sP1pg`L}s}_}!N}JYdXa#m)mr3bPJ-|qJ>QI3oq=_4_+a|U+tkSeo*{%~J z6o$IX8ej+5VFYc5au@^zS|%nn9h!>TsZ04=AhGxRd6fBIlIPe?g5;0XCVsJ9=j-45 zz3=-y7a$-YARr(hARr(hARr(h;KhQ0heU?tkRmAu8Dl%38mN%N-#Hc3YpSBAMMX>{ z$K@<|h^GSW*cF??mk`vJtg5PKguHOn3$Z*CX#37jqk>- z%*puPay$7V5D$@InMAq>H3aQ|eD>6lc&UB7%Rx?&APp7Jv|<^wul1$}V|SAWcgOdX z+y`m|uW#ypr31EZ>4A;CA?V)Fp$W9agNKVSHGKzu`Z*0ZGFh1YyP`27hhAxOF|TA1 zC=!ud@+ z27$JHa5y4LBHh*J7cMX%Ix!YILGL5O@tDdK8GL5n&H>my@HSKeMb-HCDLD7zq@&{s zYN7v!QzI#JyCDamIHO>?tBR_Szkx_pZt+_j>OP~N@2^;#rE}~X9)O`p*vVml9?8}p znUi!){maP5Q7zAS!O;6*ry_;XXQ;8*%*-voeC}b{<2%|{!zj>(g&b;4@?_l~r0|57~WgmzYT$yGY>S?)^nr zxc>;6S1vcSZ+)vrbK7NMV7Ozh1fp5HDrytXqV@m_>LnAM`OZ@G%+22iH~cX@XGz%H z^EcJ_U0iiB6lVfldM9&kxOr;^+(OYeGrM4DYj3OUGTr8&5O@gXkOKaA!Tdsb@5F;! zfs)`7y+5HY(b?7vUeMXL+W2=KaQPq$t^`6;HOPSNMR$F|{KI>W**W9PyR*GnGktD& zxp@V&uUTbiBS*~zGgd-fk7CJ_aspox=5}0aq1Dy09iK)P{YXYp^y-E-SGlOWYptb? zS0KE()B0^ceGpg0&~BbYL-gvEe8$d9S4WF&1m5^93tX5Ct#1P1ow&xcA6>YeKcOfx z&#THo!mMkz1}zoRc#CKXC@KB6Zvx@Wm^*<}70}GG#sF~a_+*U7LnZI0O`XH;q|7i?LPCY zST^PGFs%$i%RWw`iE<4I!#$)gQ6zc@Un7Xfq*J-xH~aAhLDEz>5o zjSbe6Nm264`aB%__IyQ)hsC1jzt5_~j@_}VI83-&aHP@*iM0exQz~3deGV;3 zoEylMSr z-(%ga%J5Vnedm91vgLNI`r|Lj({h@LY%^UX)B*?M5H)!|Nb7ERkziWI^czaZ_;)w+ zibK@w`Jg2tyJ81%xx3_}Fs`AfQP?4zA3Cmp`tF0uk-2_pvUf}WcR0ee;=Ik34X}XK zK|JS|7&Uv7V=`BL%6f`Af?PKiWTH5$-s8p&(5zelmIRR{%8gRxs4Ic=Xiv(DYFGg^ zf>F?CUavBuPOB=U1jf={h@z)%1u{bqaKR#qBt45PddwJqy#DW=fPjF2fPjF2fPjF2 aD)2ALA(MjrN|Po400001($D literal 0 HcmV?d00001 diff --git a/assets/badges/DB_Partner.png b/assets/badges/DB_Partner.png new file mode 100644 index 0000000000000000000000000000000000000000..b452900dd8321000097ced7cf2f42ad99967b2c0 GIT binary patch literal 1147 zcmV->1cdvEP)jpp&1VIo4K@bE%5ClOG1R*I1bE3S}Sp`t{ z2(g4fB_vqk&nx|lBI*)gn~*+ZpxdC~W3y54VGd*}kP(GYtt*1ZLot#sF>8va*sy!mCf_2D;OTFgWP0j@By9U*39-;`& zAU^>8;Qdjd4UTXkP|OOPq#_b&C_R-@1b z%P6qK##X0_IrS-faST|zmh(P<19C7U#x;=hUXzsyH4{#ziwvBPk z_Zz`xYd`!ZqaP&sTI=0+uL`Z0agyOS^f5$V_zC+kxTrf^z9&9_#I7-O%3xZLEZAD6-H zu-7eCpp9o2FI~8XFTRcH=Y!^9c)%+^XBPxsgWXj$!LxakZ$$m(u%f1&8;NN5^mut< zZx<<$D{*)|<3+Q+Tmy@wam_yvuMiyP*Crhb%|YcSor(i-&J_gJw{?5Hla(A6@!jyC z=y{L95@xQ^L@&Z@JS~4+1I{XHs6c#EB?2p)lNVG@5A8LR*3&z|dDx*`_;+S|Dp$%i z2#v5q;jh>rm)wG>#!FU?(=c3>wBGX}_|1BFbqp6sv8u#5B;{bBar5N(=Etbh25Zya zjw1B=+})^iT?W)))QCDKw9Hrd!g`C|r_rDmIT+Bvj~luc7yZX?)-1+r(3|6{f`c|e z?eGOwowPLxqef&7dbHi)iP}4hoR5CHrkTJs(P^9)<9Vy6pRRcuh<84Uj{3cG;G)q? zSTtgjbU)2%?`+&jQEkE~&U?6oOj|S(H>>5XZ>tEp)OV9czn2eMag%U13-^gg<(g5P ztioM&*NigrlItXv7F3PJ*@5|DC7?PHh_gx;EXDA&3?_NljqChV{GJ+&V(^@~5 z1Q!9->DKec_QgJzZuhTR!l*F~*7n6FadNa=HGvEqVghRKI`6DH5XX?szdI%@pU#X! z*No!SK|}fzrV7@$0e%BBVkTkZN|&w~8!ub>$^56PA>#d1ODbk{fg9+!CM literal 0 HcmV?d00001 diff --git a/assets/badges/DB_Pomelo.png b/assets/badges/DB_Pomelo.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d3e37914475e0d6cf244840ed8ea71584d0d7f GIT binary patch literal 1414 zcmV;11$p|3P)SuQC#*dJgRG=}u~=&OD= z@Z-3POQ{a!5+=Ui_|RyDU=a^2LSEy=@%0MCAp-i}8y80hU=eE`w0U{_Bknbauns77 zc>C@5ZLok9fi^EYT|B0nutwm-PHuKywjd|D1zJaO#@G-k*B_MYr{0-a#wAMeo-`z7BtC2u-l+%d;#m6|dh%f|rY7zn%Ein|Q5BEnLqDrwD7$6p? z_U^cezXHflh&fdQqu{5w2HFMKPe8GmNsJ_3Vw=6rZ(u>7e{iCIK6^D7U)L^=uW_%~ zwq-wu=%epHi5jhldxOY>EP4-QC!3;mWYc~Q)knjj$csb*X;0@mGCw^?4etC+sj4;m zMJTl|F=q=z^&GI|Jpjq?*{cA{B8!)c)P5n=(Og)t1&YCHKsezM!{Kn*WTo~CNw9Fo zwXJXsl~Uh<8IhWrAYNbHdH#&QaqSJN2UOK$r68R^DUQ~+fmJoZu0Esh;aAbi*t zU;qmH0^Pp}1wtxc3f)X%o zgV76;<1D;L8sq|1D#HLuV58Sr>IJj#nR8;-q%j))3uJ4ZI>XxFd1;OmV?6U=>eHsl zd2>!Bjy-z8*M_}E(e2L5FFA(ndJt~X=fZucic#=uoIrYku6hm`x26;6?>PQh>)D&X z)LzIL*N`0t`5I0jA1kdQW}y~7wk_9iv>A#@3R%`D2MZ+|yDXB%0vH&wE;$&r>q+cI z0zIr$-hiPO`SFA4`?hS_GYO@!nMj}z-$*Kh*S>^$nEd}fs@BIE@)D1b+Ox(W^q%w{ zFre1!^bH3bVy+MYKcAA?FMJjr?N2}m`nM^9 zaR@6V*BcthIxRO^Ru;q|tbSLcc5!roDFXEnm0CB>5b2zI&NNm9B1RpsRN)JtM5xL+yH_jn+a07*qoM6N<$f-=&4a{vGU literal 0 HcmV?d00001 diff --git a/assets/badges/DB_Quarantine.png b/assets/badges/DB_Quarantine.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7df1cec1d763310d68750e6e5c7a1d58aab301 GIT binary patch literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UH$0z*rLC6XFWwe(vV^GL`%LWd0xh z{2wOqf9&J?)X)2ABJZa@-p>m0SObJV}i)%ZGB^XojVuk*COEwlZ$-0s_Q`|oRgzOVEBzRvIa`hf521HW$w`o1Cf z`^MlOTVsA~js3AT?&toJp9ji*9;*C#sQTxTx}V1ye;#Z4b*ksr>AqiQCj2@JM3a7B zTk`w*vftNN{JypB_w9{;?ri#VZ~LG7JO13?`RB>eKTnVUeSYfiyPJRC-TwRj&foWU z|9yP$@8iRNpC14F{N&%~r~iJu|M%m=zn`D}{rd9%_t*cwzy1I7{r}(J|Ns5@|Nr0r z|Nk8#cKZOs-LxdgFPK40LQzRs#oET!&fXy+DmFeLDY?9+uD-Ej{(^;zHf-FqdCS)A zr%sSvZt~$*S5flu}$=r1F`TXy;b${pG=j&g7o%{GRd8vL? zqnSURZdA0tWi7hTE8Of(ci7$F9HX19YJWAid9YqcXvyt8^w{SAL!FqvCPl?1wr4JL z9JpB9ddn*{e_G$oyQhM)R{BK*UzvB^HSXd@t)O~0U8ct-Tc_^okh!;bqP@t(U&2}H z3td;-u@lJcKE{4g%Th~GKnx}bh^Gy^b&DsI>m2jH@W}&Y1U8O68Bg7Fna{A?D{xM zr+dl?^Q4fKXBa$!Bcsiqo!sQnIVaxy+6th+2FHalQAy3242J*QMGi>pl?#};I9%X> zfvw!hbH|SLiM%jmI52u2GH-|{X_{piSf`D>8O>Jndv*H0(z-hbrdZ@d042WBjJ zym!a87aRv)d0m_#-k&OUlFx$4q-eHj;T5ybSJr(!SlSo1Z%6F9u|k3?#4J%UH$0z{nKf6XFWw{s*Ck|DmD#9USf} zI6Strd}i$XLeK50w!;l|>zl?7w+%h-=(*k0ce<_Ta7V}OuC~j41CIxKZnt%u?r6K; z)px$9=XhV&?VhgNeO=c(`p!VbclBKF>bl(1alWVTdSBn=j-E4E+!-Q%R~N*+tLJ=A z*Y%#R%Uxa9yLv#<`L4dpU47SkKsJc$dI!V+ngbSx2tr7(8n7%-8CWq`9HtRy9YPRf zl%5Mz3Pb$=|NonGbDsc1A*3Y8FBljo%q$$7T--doBBEl_GO}_CipnZ#>Kb zLc5ZJ5_92#j+{UL??0MUy0}MAKI8Kz6W_^O8Ro>U+WT^SqR#TYUQ8`z5mI>;)!J;| zXZ}fgys`3JbIW{lrq>=e#YQ(da&?N&%;}6beHzlGV$AD4V|U1mqmuV>t}i{V6V}1$ zXJ=~H+>kZlM%weD;2R4SwkjEVe|>oF-9n9NeP6Xc9>2MC)snl>#;ZPWP&?!8oSE>o z``>O>#i_1Gdz!tTZfJ3LGp*=)71}m$cZ|sDPA74@!hi$qK^Nv95NbF6uyEbQzip;` zes8~j>RR+Y-P!$tvujSrw%tXKtIPIm*gkvLU%|j~i>nVr+toiTd}UGH$i>IKuc0Px zSL~UV&Sa^UjX_tYNo0SpP*`&Be3R$jhV!MeQgV#uV6A1e2)Gj_DUw{Eiik?S=opCvtV1ut_| z-kZASoom|5zwBB+3=Fon+|-xpkl$Ug(>ik9b^EC8GLOI3pXs=?Dew2XN?>#`c)I$z JtaD0e0sy=Vd^-RD literal 0 HcmV?d00001 diff --git a/assets/badges/DB_Staff.png b/assets/badges/DB_Staff.png new file mode 100644 index 0000000000000000000000000000000000000000..f743bcd572d37550b9b051b581cc22ddcebe5bfa GIT binary patch literal 1478 zcmV;%1v&bOP)|vZPUWPqie!H-7_98jYks)iqt!Er5c8f`WpAf`WpAF$h=?e%xuTX)Uj{ z5LeJi4jOT#2@8OP1>vg>G(n`-D}qvRSKVo!RioA_%$bFWAfmeaPzNpchaS|r4qf$j zUJ#Q%88k?uQ-}q7Ef_UH!Qg!5mnq2qMNt(E#0qL>)AKuf#AT7EVwUwN^f2 z4$=TClaE4CTGbk-mG|HoXF(hIMarRkg(uj#ZQl`CMPy4$`34Xe|R!$`YVkgS*Rf2HMy7O)}`b;~sjt&{ZD zc54qraQ##cYHsQh+yW;mshJ#xS9nE2aIF$p!-T#sK)iw=IHPF-Fklrym_YY2f!4=7 z6*o?njJ}Z7`|Y&xLcmLKM1#Kl*iq|OapfKyF^-_`e`#$@kV8b(?T3BfMkfc51B|A% zXE;Tmd-BSl}mw1!XJxS1ckCblyfG28h%N6qv(;y zHHwS`2_e1%QCQKa=-m=i{Vl+d59qK0=;1amd z$+}IE%Tmqzl9UcDoap6=oRN?4SiAjoQZXux*xDW3l6=S+d;|+gY#l|;oJ0+LUvkoq zfCX*{p;0l*+Hy6Plo7eqN>LEpSjo})z-kIW-G`vNX>urgPkO2({4zMi>XV)pLR!^L zG+gL>#`7eU0}>Op;k?L8(|)3)DRL<9WVc#Jh%Zi-D)i4Em`|okvXn!3Th$nmWFW^T z?+C45Loi&(W=e99(|eg`(z~0YqLWV!Qo{yaJn6}Fl@_~^t>f>mpX*GI((5WiP-O*oT;3 zIU^@%LPxFp9CBEyWLBmCRpCe(~3OpQ5&3^VZ+qt1rjwu>(m13GCS{qXWHZM+>a}95Y2r|eg zp4%3w^bAQPhZYe3JYLHE(+Ib_SjH`vat>a#nN-_!X9E>n5B;Vi$0Ff4+$M@x0tlS7 zj(LVX=VZ~3q`^`%vz*>3bAXW);hzXk@?2^7TT6&J!rGQzIT9Xz_@=vgb;MU@6ciK` g6ciK`6ckM4f8=VniFxDjE&u=k07*qoM6N<$f;@_)>i_@% literal 0 HcmV?d00001 diff --git a/assets/badges/DB_VerifiedBot.png b/assets/badges/DB_VerifiedBot.png new file mode 100644 index 0000000000000000000000000000000000000000..0537e93011cf699eec5120af2184c220c875965e GIT binary patch literal 4637 zcmcIohdUeI_l{j^lvZtu+G?*TTC4VoRhqUo6-ted)QC+{qeRSV)oQ8K3bj&dl{ASN zdlWHhhFZ10>HqNiJ@+~H-1FY~-1|K5x#uKVnj0`Na5De^045_tJrG&@|C1}UEmj)j4q6uz13kdyzw*AlB8!aB`x`n00szci|AeB?@1q+4z-nov zr)>kB+IssagRkdhU*xQ&;wlWcot%BmP$$amwsSW&A!9*JrPCc~OHo)S(TCjA1+x~L z+78HP+bj>DRg$pNx@L3?mO+ zR`?yb4i8r-?>0gBN91})X z`QI=+xM&!mmE#s-a{l;f^iRk@{SXKG@@F-~5tk2`X}Xk))jz5_DGXI0O7b3^)B6Is zZZUMSC}&r~T)aikrW{c}Y^lN*Fv52e=w@B>8nU7`-UBlZ9&{huKu@D94*8#K0qt$) zSu|Dlc6$YP9%^kYi0rBxQx;u4`P@YYA_YQymhpCBICfM=#3_rSP0%~s>ZouYT<4S2 zW94(P>f&vPr0qFAOYv8il=3G{s((i+NVJwED&X3a`oV8kOubS3Z~6I-nyRT?@CWz) zE#O`lc0H>(6q`2+?wwR8BahaBEd<^4)bPd(>vXm4Z1lkqf|r8hXKcy;g~o-5;0%gNTWsDw zdQEhT@TUKM=Sxwd$S%Qz&G2P%bj(P${Zu2(_H<-!wS7evp$V4{iLbybs~^Vu_E80L z9RTs{RWTJzoKytLoKQQxvn(V_3 zU)<9uI4NR)`G~VGF$Vk~g8q2=ztcvVT=RZ|F-dQw;RVT*r5?D<*u)*D>QpHVXSe`d z_=Vkq9M)Y$8qsi7QsfP&I4C;)2xltQ5r85P4tkw+=w&?;OzA2Z^C-=%1_`s zS3mnJ;nARlmbZRE&he+ky^dc!)OyUuS0@5p5m+8;_#QJ-7?6w9BfmjgaCv7z#YUU* zl#{o5ckqq57;1fCxy>2GuR~256}W~_wF9;z6_jkrQ*@awKTz*s<&Xnv@(7x|nQK&) zIAfb@;d|@K9RYON556#lS%Hc>bTB0x%M)}|EdoBR^+Im^H#ho$5vJ=@g;d*`h?xBb z4-qHw{r4P0>3`UU4~c{pbs0!4*E5W#>`ZuJR#N%D1w)eHt^e_Nq+dWXlLDyJ3#}=U zQa?(^VmtP?4qHp%%S%=Hw9c;AiOnA>y5MZ#e=kzc);$~LEQ3h8vxM+?3eJ+rVBLg! zmy5xe?<0SQv8z*N66oU&5B@g4+)$@0;jv@gqT`O>vFU@5OgP&RQKBs4BUEOn&U>8h zNz?Bt)PGj<_Z*nj{>;1M%#OdB&xnlj3sxSjGZ8bl=X%*b(0r8w=5$3!cgmU(!JClGf48Y(vQ{|- z9@CkL5rc)j`la2|^i<8FR3y#jb=#a%(4Mq|Ju7zd^0@Je5T+3Vnh7>}L*6>dJzR3( zDf8p^+dRBun?VI2(0lm8CiE@;d2%D~6vYh6I|^Iy)>?Cv7YM|VMwmcIN{S+?K8rC4 zBKsp%&*Rv1W~-llx3=4weZxjomREGCAw zxNsIQ0##Z4$1?iPj~FRyU-F2*)U#r8z1cdi9^>O!d)mvW>eG+&i#%VJrh{qpPnQJW z&oI0DYNflfx#m4++!U_+z2lY$`I6{GmZmOdr%g0MykbJVNW8nl$z?ZZyst5UkUfuf z!4h;}_NU|efOTH2&v9KXy{j>Hyrnj0fj3Guew4DqyiUd-BPnST9_&S}YSejU8il)vey`suuPxcU)A+Yu)P7LK6Beu{0lsvNJ8Rc zY7ew&^Kyj^uP#IFgsF?RF>7CLCD+lN3%6wVmeMvoj=1E2<7_;-?%SI^mmqASSv`S85e9mFV~==iQkq#tjC^@6SmeZ z{Wc!jofb5`k8{%Pf7H+p9{Tw+A*Jz|??i9}f^Rxtf7+um;a&RA43oYQ?$$Q}P9Apq zfBPk2gCBy=5sZ_cW7m~Kzfo4%f061?+h9A=ckG*fousIO{$dms^C$%6(%bSy!h-IK z#5L>#uc#jnX#?gyOwLu{2+%Dk`}md?>HY1mX-+NNq=72M{b>^*oqhDWd_ek2{(`#Q zhI^!{OL0RZb#W()siLfe9DywX5pEu^itTwxN4xMNiGgE4Fm1$G{NZ)FNnNUHz&xi( z8B#mBDDV@=ILIw8e`tT2HklbI6=wd<0aID0EH%_ZX&P1&0l8U5ZLZjXFK3SxN%ys{ zI9|XZjKY_y8ScGwSEv1&VO&qcan)N(bA>L!QNORqEuAmJ>#)6k43T%J0Tif^Ie^Xk zI@(9|v~?Nmh+EBO86;1XdJHo+OEa=-xLqHeh{J!ofM%A6Rf$U&mLb&S2@00}tMwY% zoU7LEO%iD|ncZ9^dz);l64jP#d~w*SIT#W7pa#dPTfVx}LrsIJi;Qr!;DSg7_mMe&SM!ypqQPRk&p`W(AQ3ZoTwTf$65=%(q|kxKa_f>T{4K4>oz_&r=Y~YDFwOcGslS>>ZP3Y@I6L3Cw+&4NttXf>^udPs>kP( z9Okzj7(NWL=~I@_5X8CBWHwq{>*vPv@h-`tU%X!O8((3W3<%D@8{$dgl@|yVr?;*b z)V?u}0L3&&)lL*W`hZ$civgkCON4#tg=ghs>%a~>llPw(MVC+)N$qMF4a5d1HWy+f zlH-qGTo&vUmDS#=;paE4jWFS!HBB{?5VtUhGm8pb1^18Axh}pr(m@i%u{Mi=7#YI} znzWR+Jc*75)vdA8`GHRnT9cV-?L;7R$!bJ-`J*S!T01q)9l8ZyA~pXYQ~XOQrKmZ|V@?S0 zgWD&czfXOI!DH5qUp?!Y^WitIKhIaPDs7d)tWBIfpUYVMOEX8h>&o;StsQ&?aK~OW z=%LM1`^MuGWz|Db_bLyB`c-4eIiP?)Oel9=MQOqRXin%LLGZPD&UK3uImR2jS~U?b zyaJc8+={ld9EwBJ6dH|l9M@M3l|R83epe~%uYBC*@$hi1&{0Z!FY2lDMDvMr3s+Qy zb@HPSA{T$a6&Lv(2i-oi4VZglB{U=<)6RMXd&3U z_?|68n4E81ekzaxQe*W2VEceRq!16SvraC1ky?;t4!zEySaCLriS*F3Y1i+eU)gtFK-*iKQzK^bNZ z6v3WNpZlJ|=x^5E+>@Yu)HSXjrN5V{^ftGMM5Fl5(=6;0V{?0=~Zr1(|EUG z=J>YdqDLkv{IpS|Pf=tCAq|qj?SYNBAcG09TZaxeo!X1vvFN6(R`V8La~Wd%3>TX` zjRubt_`Li2c~nXEJRq4&&X&GQXByf;>`LG94?dB@P4Ns&gN!=vqqIy=W97>YpKM_mAc*{^iWu@&DD zlEa8lr;lSyS=KM0azMUcY7BkP?ip6y7PnxF^FQ07MYa4=75nWowO}PJ4l3$+L#aLU zjzER^I}89j3XKshyuMGQRe>-RC%PD?IJsJ?ZM6QXrEre0yc3m+J_KM zZnQ_a_sU3U+V!UV?3t(6Vwjim0CoVvVhck^Hpx}?OHOdO?oqlxPohM$+eQW5Fpb>mftF*g49ye-wj0zQYB+wf*s0^z=>G$^*-3(=ILjuspo4&6t;+yO@)T5z! zN=<|KW1HjtCj`@tsZarOp!Msjb!Q3F)4+HG%eg>>ZrP7dav6%$c1Py~4g-AfRqU_} z()h(Qua47A@3vvR6!thd2WDni#nmr?pF$7ciF$rdtU6c=x|Z3{Z98zStBO!E)Sp-5 z39X@wlGO_1DOtK`><`!tuSWbylFBBKlG(F}3kz#sBe5-aj$17M#i(OdwC!S9?2KU} zgv9REWGG(Z<%?{N)-~n`RGCBpd zTu)_TfsIQ?L$vPJSYlZsHFEHkbXhEs;6K08V~LY%7a_#Ndx*-D^|!KR)_YQu4O8b@ z7k_Z11V6Mx^~SgD6pJ0O@ybafmGuKN5w34DK>yC`tjx++4UkAA5{X12kw_%mQHac-__;s9@+s5I44htYq%P7O2>oF2`lnD9< zy=^RxI1J^&&k95!ID!@-F>4rK;cESD`Sl0^1V<2;bu1>mWvm1z?4SsGT6`E}$mU+T zOoW#Gpa>#ye!#t;D9L8)Kz%?@@FxTiTK2soh|9V{elG&mz~OoM_~n1U4~k1_U#jN{ zHI;Am9UQ4q?VOiuB|PvFs7=f~wEDOQYSb^z%P)_+wtZWC{Dbyz?eoS|_E&w%zSj_& zV8x-Vs}V;89H6Fi*!6eLd7s3okNDh>(eo|)&H{1tP}m7Crbbs#n+nzM5L2J%o^%Ga zbz?uuQ)*K#QnvdI-8&p{7D!&!8*$#2t0Oo-(ROS&=dJuRq;tE7w2WovoarP`({HKo z?R)x(!(1aDcKy8>UU!GJi%8t3wdWDzBoI|CLCN$NhvM^0cU)%hm|R41otlUR+9-bG zywf-D6(Ww?@S4Rzr2aG+q_qpILtMcj&;|kk0-Do6-iOTW(NWSL;|&m zxv$?NTpT*bh3fp0#2XsCjy(#B3I)c~aRkSgFno*XTGtd!~y5iAX$E zktA%ZKr~~1t>0=Fhm16yaa)H+hFUwksKpp`Yf?Dh`vQI_f^x zWv@H`+#y6HqdlAHH&mKVpJprg8+!O2olJtUet1m=5TjsT%;kHo;fg_^tkfyKLRN>a z@uR0TZlBf#1ehj=^p%C>U0v`s`PyAu&GrnNb4yyUNGlLujEyGE=7=KIrt&T@$JEGQ zoT-_%uRE48CTTXUYN(-Ra}<%t`{|4zU2}SyCLj8W!^hKiJcI%3JgCNG->^AQr0PuO z{d8d~7IxS3YI<*GtO7MF0`-Am7pq8=Zcnh1l^Fm*Zm!hJ{5 zvObHKKuw=kdtH#8C9Nv_dde#cv%^o|{rFvx60@&g?&M3%vQd0Il@AFm7u>K`H0)?X z`r6~g1Pff&zgUGQLGK4y`ZOt2($#kJB35j1_zQ}rCWhk!Xv)56!Z%+yF%JV@Di3}~ zF-NxJkgy*V-^6^AV1b&lZ|&3OfPZ4XNtE}b4fgDuFx#juL=mX9XJaJnDA;UN7lO+C zERo87AYo;FmZ<;j6RGS6A+b?ih$>KP&mLh;`1V^SqW{Ms&4vr|jrw?a$VSZ=0.10.0" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", + "integrity": "sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==", + "dependencies": { + "@discordjs/formatters": "^0.3.3", + "@discordjs/util": "^1.0.2", + "@sapphire/shapeshift": "^3.9.3", + "discord-api-types": "0.37.61", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.11.0" } }, "node_modules/@discordjs/collection": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", - "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==", + "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.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/formatters": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", - "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", + "integrity": "sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==", "dependencies": { - "discord-api-types": "^0.37.41" + "discord-api-types": "0.37.61" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, - "node_modules/@discordjs/formatters/node_modules/discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" - }, "node_modules/@discordjs/rest": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", - "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.2.0.tgz", + "integrity": "sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==", "dependencies": { - "@discordjs/collection": "^1.5.1", - "@discordjs/util": "^0.3.0", + "@discordjs/collection": "^2.0.0", + "@discordjs/util": "^1.0.2", "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.2", - "discord-api-types": "^0.37.41", - "file-type": "^18.3.0", - "tslib": "^2.5.0", - "undici": "^5.22.0" + "@sapphire/snowflake": "^3.5.1", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "magic-bytes.js": "^1.5.0", + "tslib": "^2.6.2", + "undici": "5.27.2" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, - "node_modules/@discordjs/rest/node_modules/discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "engines": { + "node": ">=18" + } }, "node_modules/@discordjs/util": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", - "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz", + "integrity": "sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==", "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, "node_modules/@discordjs/ws": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", - "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz", + "integrity": "sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==", "dependencies": { - "@discordjs/collection": "^1.5.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", + "@discordjs/collection": "^2.0.0", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", "@sapphire/async-queue": "^1.5.0", - "@types/ws": "^8.5.4", - "@vladfrangu/async_event_emitter": "^2.2.1", - "discord-api-types": "^0.37.41", - "tslib": "^2.5.0", - "ws": "^8.13.0" + "@types/ws": "^8.5.9", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "tslib": "^2.6.2", + "ws": "^8.14.2" }, "engines": { - "node": ">=16.9.0" + "node": ">=16.11.0" } }, - "node_modules/@discordjs/ws/node_modules/discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "engines": { + "node": ">=18" + } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -128,23 +158,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -160,21 +190,29 @@ } }, "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -196,9 +234,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -236,6 +274,26 @@ "node": ">= 8" } }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@sapphire/async-queue": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", @@ -246,9 +304,9 @@ } }, "node_modules/@sapphire/shapeshift": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.0.tgz", - "integrity": "sha512-iJpHmjAdwX9aSL6MvFpVyo+tkokDtInmSjoJHbz/k4VJfnim3DjvG0hgGEKWtWZgCu45RaLgcoNgR1fCPdIz3w==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz", + "integrity": "sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ==", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" @@ -267,54 +325,52 @@ "npm": ">=7.0.0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, "node_modules/@types/bunyan": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", - "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/validator": { @@ -323,40 +379,41 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", + "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/type-utils": "6.14.0", + "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -365,25 +422,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", + "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -392,16 +450,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", + "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -409,25 +467,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", + "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/utils": "6.14.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -436,12 +494,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", + "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -449,21 +507,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", + "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -476,70 +534,53 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", + "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/typescript-estree": "6.14.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", + "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.14.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "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", @@ -549,10 +590,21 @@ "npm": ">=7.0.0" } }, + "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==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -570,19 +622,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^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==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -600,27 +639,27 @@ } }, "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "dependencies": { - "type-fest": "^0.21.3" + "type-fest": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -670,15 +709,15 @@ } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -697,15 +736,34 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -716,14 +774,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -733,13 +791,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asynckit": { @@ -747,6 +817,14 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -760,9 +838,9 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -773,13 +851,53 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -797,10 +915,33 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -809,42 +950,30 @@ "node": ">=6.14.2" } }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, "dependencies": { - "streamsearch": "^1.1.0" + "run-applescript": "^5.0.0" }, "engines": { - "node": ">=10.16.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -875,38 +1004,32 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "dependencies": { "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "string-width": "^7.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -948,19 +1071,19 @@ } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "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=", - "devOptional": true + "dev": true }, "node_modules/confusing-browser-globals": { "version": "1.0.10", @@ -1004,95 +1127,196 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, "dependencies": { - "path-type": "^4.0.0" + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/discord.js": { - "version": "14.11.1-dev.1686398626-6c2242f.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.1-dev.1686398626-6c2242f.0.tgz", - "integrity": "sha512-KCLYvTCKR3T9WuXjcaIaLhSObLiiepJ8Z6fwSK1AZLpFzVKjJSO0HrSz3XRw/iFRf8iUz6Ryzpy4ZC4b/eTg2A==", - "dependencies": { - "@discordjs/builders": "^1.6.3", - "@discordjs/collection": "^1.5.1", - "@discordjs/formatters": "^0.3.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", - "@discordjs/ws": "^0.8.3", - "@sapphire/snowflake": "^3.5.1", - "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.42", - "fast-deep-equal": "^3.1.3", - "lodash.snakecase": "^4.1.1", - "tslib": "^2.5.2", - "undici": "^5.22.1", - "ws": "^8.13.0" + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, "engines": { - "node": ">=16.9.0" + "node": ">=14.18.0" } }, - "node_modules/discord.js/node_modules/@discordjs/builders": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", - "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", + "node_modules/default-browser/node_modules/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==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, "dependencies": { - "@discordjs/formatters": "^0.3.1", - "@discordjs/util": "^0.3.1", - "@sapphire/shapeshift": "^3.8.2", - "discord-api-types": "^0.37.41", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.3", - "tslib": "^2.5.0" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" }, "engines": { - "node": ">=16.9.0" + "node": ">=8" } }, - "node_modules/discord.js/node_modules/discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + "node_modules/discord-api-types": { + "version": "0.37.61", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz", + "integrity": "sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==" + }, + "node_modules/discord.js": { + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", + "integrity": "sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==", + "dependencies": { + "@discordjs/builders": "^1.7.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.3.3", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", + "@discordjs/ws": "^1.0.2", + "@sapphire/snowflake": "3.5.1", + "@types/ws": "8.5.9", + "discord-api-types": "0.37.61", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "2.6.2", + "undici": "5.27.2", + "ws": "8.14.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/discord.js/node_modules/@types/ws": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "dependencies": { + "@types/node": "*" + } }, "node_modules/doctrine": { "version": "3.0.0", @@ -1107,55 +1331,37 @@ } }, "node_modules/dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "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": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -1163,19 +1369,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -1199,12 +1409,12 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -1237,27 +1447,28 @@ } }, "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1265,22 +1476,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -1313,18 +1521,18 @@ } }, "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -1334,14 +1542,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -1380,26 +1588,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -1430,18 +1640,47 @@ } }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -1455,9 +1694,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1537,12 +1776,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -1595,24 +1834,46 @@ "node": ">=0.10.0" } }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -1623,10 +1884,16 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1660,9 +1927,17 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -1684,22 +1959,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-type": { - "version": "18.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", - "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1779,21 +2038,24 @@ "dev": true }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -1819,28 +2081,40 @@ "is-property": "^1.0.2" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1895,9 +2169,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1956,10 +2230,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/has": { @@ -2043,18 +2317,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-to-image": { "version": "1.11.11", "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz", "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" }, "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16.17.0" } }, "node_modules/husky": { @@ -2136,15 +2422,6 @@ "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflection": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", @@ -2157,7 +2434,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "devOptional": true, + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2166,7 +2443,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/internal-slot": { "version": "1.0.5", @@ -2237,12 +2515,12 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2263,6 +2541,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2296,6 +2589,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -2417,16 +2728,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -2447,22 +2754,45 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2513,48 +2843,45 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", - "dev": true, - "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", + "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.0", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -2564,89 +2891,20 @@ } }, "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/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==", - "dev": true - }, - "node_modules/listr2/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/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==", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", + "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, "node_modules/lodash": { @@ -2666,81 +2924,92 @@ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/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==", - "dev": true + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/log-update/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==", + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "get-east-asian-width": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/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==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/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==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/long": { @@ -2759,6 +3028,11 @@ "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/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2822,7 +3096,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2834,19 +3108,7 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "devOptional": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "optional": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } + "dev": true }, "node_modules/moment": { "version": "2.29.4", @@ -2857,11 +3119,11 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.37", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", - "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", + "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": "*" @@ -2872,52 +3134,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "optional": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "optional": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/mysql2": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.1.tgz", - "integrity": "sha512-UD84/AvLwO5qmSABEsBTZ7y7JKv3sM8JzWGhuL4tDkJwVsClVVAcelNSR5Unyhxj6/KHBAkjS7qe5/c+gEmNvA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.5.tgz", + "integrity": "sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -2959,33 +3179,12 @@ "node": ">=12" } }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, "node_modules/node-gyp-build": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", @@ -2996,15 +3195,6 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -3033,9 +3223,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3082,15 +3272,44 @@ "node": ">= 0.4" } }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -3099,11 +3318,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "devOptional": true, + "dev": true, "dependencies": { "wrappy": "1" } @@ -3123,36 +3350,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, "node_modules/parent-module": { @@ -3182,7 +3412,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3211,22 +3441,16 @@ "node": ">=8" } }, - "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "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/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -3252,6 +3476,41 @@ "node": ">=0.10" } }, + "node_modules/pino": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.0.tgz", + "integrity": "sha512-ey+Mku+PVPhvxglLXMg1l1zQMwSHuNrKC3MD40EDZbkckJmmuY7DYZLIOwwjZ8ix/Nvhe9dZt5H99cgkot9bAw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3262,20 +3521,32 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-ms": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", @@ -3290,15 +3561,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.1.tgz", + "integrity": "sha512-JjBvFEn7MwFbzUDa2SRtKJSsyO0LlER4V/FmwLMhBlXNbGgGxdyFCxIdMDLerWUycsVUyaoM9QFLvppFy4IWaQ==" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -3324,43 +3608,43 @@ } ] }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">= 12.13.0" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -3370,12 +3654,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3396,16 +3680,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/mimic-fn": { @@ -3432,6 +3719,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor/node_modules/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==", + "dev": true + }, "node_modules/retry-as-promised": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", @@ -3468,6 +3761,128 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/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==", + "dev": true + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3491,13 +3906,22 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { - "tslib": "^2.1.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-buffer": { @@ -3519,12 +3943,6 @@ } ] }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -3539,15 +3957,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "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" }, @@ -3564,9 +3990,9 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "node_modules/sequelize": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.1.tgz", - "integrity": "sha512-cahWtRrYLjqoZP/aurGBoaxn29qQCF4bxkAUPEQ/ozjJjt6mtL4Q113S3N39mQRmX5fgxRbli+bzZARP/N51eg==", + "version": "6.35.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", + "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", "funding": [ { "type": "opencollective", @@ -3574,21 +4000,21 @@ } ], "dependencies": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.35", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^7.0.3", - "semver": "^7.3.5", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", - "validator": "^13.7.0", + "validator": "^13.9.0", "wkx": "^0.5.0" }, "engines": { @@ -3624,12 +4050,41 @@ } } }, - "node_modules/sequelize-pool": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", - "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">= 0.4" } }, "node_modules/shebang-command": { @@ -3668,10 +4123,16 @@ } }, "node_modules/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==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/slash": { "version": "3.0.0", @@ -3710,6 +4171,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "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/sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", @@ -3718,14 +4195,6 @@ "node": ">= 0.6" } }, - "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", @@ -3744,17 +4213,17 @@ } }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3788,14 +4257,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -3805,28 +4274,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3847,7 +4316,7 @@ "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { "node": ">=4" @@ -3877,22 +4346,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3917,17 +4370,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", + "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -3941,69 +4424,44 @@ "node": ">=8.0" } }, - "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "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=" }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "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/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", @@ -4029,6 +4487,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -4044,17 +4553,15 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "peer": true, + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -4073,16 +4580,30 @@ } }, "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4104,11 +4625,6 @@ "node": ">=6.14.2" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -4118,9 +4634,9 @@ } }, "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "engines": { "node": ">= 0.10" } @@ -4157,17 +4673,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4184,71 +4699,72 @@ "@types/node": "*" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/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==", - "dev": true + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "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==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/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==", + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "devOptional": true + "dev": true }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "engines": { "node": ">=10.0.0" }, @@ -4271,9 +4787,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" @@ -4293,73 +4809,87 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@discordjs/builders": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", + "integrity": "sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==", + "requires": { + "@discordjs/formatters": "^0.3.3", + "@discordjs/util": "^1.0.2", + "@sapphire/shapeshift": "^3.9.3", + "discord-api-types": "0.37.61", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.6.2" + } + }, "@discordjs/collection": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", - "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==" + "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.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", - "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", + "integrity": "sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==", "requires": { - "discord-api-types": "^0.37.41" - }, - "dependencies": { - "discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" - } + "discord-api-types": "0.37.61" } }, "@discordjs/rest": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", - "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.2.0.tgz", + "integrity": "sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==", "requires": { - "@discordjs/collection": "^1.5.1", - "@discordjs/util": "^0.3.0", + "@discordjs/collection": "^2.0.0", + "@discordjs/util": "^1.0.2", "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.2", - "discord-api-types": "^0.37.41", - "file-type": "^18.3.0", - "tslib": "^2.5.0", - "undici": "^5.22.0" + "@sapphire/snowflake": "^3.5.1", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "magic-bytes.js": "^1.5.0", + "tslib": "^2.6.2", + "undici": "5.27.2" }, "dependencies": { - "discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + "@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==" } } }, "@discordjs/util": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", - "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz", + "integrity": "sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==" }, "@discordjs/ws": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", - "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz", + "integrity": "sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==", "requires": { - "@discordjs/collection": "^1.5.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", + "@discordjs/collection": "^2.0.0", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", "@sapphire/async-queue": "^1.5.0", - "@types/ws": "^8.5.4", - "@vladfrangu/async_event_emitter": "^2.2.1", - "discord-api-types": "^0.37.41", - "tslib": "^2.5.0", - "ws": "^8.13.0" + "@types/ws": "^8.5.9", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "tslib": "^2.6.2", + "ws": "^8.14.2" }, "dependencies": { - "discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" + "@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==" } } }, @@ -4373,20 +4903,20 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -4396,18 +4926,23 @@ } }, "@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true }, + "@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==" + }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" } @@ -4419,9 +4954,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "@nodelib/fs.scandir": { @@ -4450,15 +4985,29 @@ "fastq": "^1.6.0" } }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + } + }, "@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.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.0.tgz", - "integrity": "sha512-iJpHmjAdwX9aSL6MvFpVyo+tkokDtInmSjoJHbz/k4VJfnim3DjvG0hgGEKWtWZgCu45RaLgcoNgR1fCPdIz3w==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz", + "integrity": "sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ==", "requires": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" @@ -4469,54 +5018,52 @@ "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==" }, - "@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, "@types/bunyan": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz", - "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "requires": { "@types/ms": "*" } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "@types/validator": { @@ -4525,139 +5072,136 @@ "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" }, "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "requires": { "@types/node": "*" } }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", + "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/type-utils": "6.14.0", + "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", + "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", + "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0" } }, "@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", + "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/utils": "6.14.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", + "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", + "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/visitor-keys": "6.14.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", + "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.14.0", + "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/typescript-estree": "6.14.0", + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", + "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.6", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.14.0", + "eslint-visitor-keys": "^3.4.1" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "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==" }, + "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==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true }, "acorn-jsx": { @@ -4667,16 +5211,6 @@ "dev": true, "requires": {} }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4690,18 +5224,18 @@ } }, "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "requires": { - "type-fest": "^0.21.3" + "type-fest": "^3.0.0" }, "dependencies": { "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true } } @@ -4738,15 +5272,15 @@ } }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" } }, @@ -4756,41 +5290,68 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -4798,9 +5359,9 @@ "dev": true }, "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -4811,13 +5372,33 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4832,41 +5413,41 @@ "fill-range": "^7.0.1" } }, - "bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "requires": { - "node-gyp-build": "^4.3.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" + "node-gyp-build": "^4.3.0" } }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, "requires": { - "streamsearch": "^1.1.0" + "run-applescript": "^5.0.0" } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "callsites": { @@ -4885,29 +5466,23 @@ "supports-color": "^7.1.0" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" } }, "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "requires": { "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "string-width": "^7.0.0" } }, "color-convert": { @@ -4940,16 +5515,16 @@ } }, "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "devOptional": true + "dev": true }, "confusing-browser-globals": { "version": "1.0.10", @@ -4982,6 +5557,82 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "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==", + "dev": true + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, "define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", @@ -5011,45 +5662,39 @@ "path-type": "^4.0.0" } }, + "discord-api-types": { + "version": "0.37.61", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz", + "integrity": "sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==" + }, "discord.js": { - "version": "14.11.1-dev.1686398626-6c2242f.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.1-dev.1686398626-6c2242f.0.tgz", - "integrity": "sha512-KCLYvTCKR3T9WuXjcaIaLhSObLiiepJ8Z6fwSK1AZLpFzVKjJSO0HrSz3XRw/iFRf8iUz6Ryzpy4ZC4b/eTg2A==", - "requires": { - "@discordjs/builders": "^1.6.3", - "@discordjs/collection": "^1.5.1", - "@discordjs/formatters": "^0.3.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", - "@discordjs/ws": "^0.8.3", - "@sapphire/snowflake": "^3.5.1", - "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.42", - "fast-deep-equal": "^3.1.3", - "lodash.snakecase": "^4.1.1", - "tslib": "^2.5.2", - "undici": "^5.22.1", - "ws": "^8.13.0" - }, - "dependencies": { - "@discordjs/builders": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", - "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", + "integrity": "sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==", + "requires": { + "@discordjs/builders": "^1.7.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.3.3", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", + "@discordjs/ws": "^1.0.2", + "@sapphire/snowflake": "3.5.1", + "@types/ws": "8.5.9", + "discord-api-types": "0.37.61", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "2.6.2", + "undici": "5.27.2", + "ws": "8.14.2" + }, + "dependencies": { + "@types/ws": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", "requires": { - "@discordjs/formatters": "^0.3.1", - "@discordjs/util": "^0.3.1", - "@sapphire/shapeshift": "^3.8.2", - "discord-api-types": "^0.37.41", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.3", - "tslib": "^2.5.0" + "@types/node": "*" } - }, - "discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" } } }, @@ -5063,51 +5708,37 @@ } }, "dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" - }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -5115,19 +5746,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" } }, "es-set-tostringtag": { @@ -5142,12 +5777,12 @@ } }, "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -5168,27 +5803,28 @@ "dev": true }, "eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5196,22 +5832,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -5273,29 +5906,29 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "requires": {} }, "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { "debug": { @@ -5330,26 +5963,28 @@ } }, "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "dependencies": { "debug": { @@ -5371,17 +6006,27 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, + "eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + } + }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -5389,18 +6034,18 @@ } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } @@ -5435,20 +6080,36 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "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==" + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, @@ -5457,10 +6118,16 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -5490,9 +6157,14 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==" + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -5511,16 +6183,6 @@ "flat-cache": "^3.0.4" } }, - "file-type": { - "version": "18.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", - "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", - "requires": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5577,21 +6239,21 @@ "dev": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { @@ -5608,22 +6270,28 @@ "is-property": "^1.0.2" } }, + "get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true + }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true }, "get-symbol-description": { @@ -5660,9 +6328,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -5700,10 +6368,10 @@ "get-intrinsic": "^1.1.3" } }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "has": { @@ -5757,15 +6425,24 @@ "has-symbols": "^1.0.2" } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "html-to-image": { "version": "1.11.11", "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz", "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" }, "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true }, "husky": { @@ -5809,12 +6486,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": 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==", - "dev": true - }, "inflection": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", @@ -5824,7 +6495,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "devOptional": true, + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5833,7 +6504,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "internal-slot": { "version": "1.0.5", @@ -5883,12 +6555,12 @@ "dev": true }, "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-date-object": { @@ -5900,6 +6572,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5921,6 +6599,15 @@ "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -5997,16 +6684,12 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-weakref": { @@ -6018,18 +6701,35 @@ "call-bind": "^1.0.2" } }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + } + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -6071,100 +6771,49 @@ } }, "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true }, "lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", + "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", "dev": true, "requires": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.0", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" }, "dependencies": { "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true } } }, "listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", + "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", "dev": true, "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.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==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } + "wrap-ansi": "^9.0.0" } }, "lodash": { @@ -6184,60 +6833,56 @@ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "dependencies": { - "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==", + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "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==", + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "get-east-asian-width": "^1.0.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==", + "slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" } }, - "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==", + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^6.0.1" } } } @@ -6255,6 +6900,11 @@ "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==" + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6300,25 +6950,16 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "devOptional": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "optional": true, - "requires": { - "minimist": "^1.2.6" - } + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "moment": { "version": "2.29.4", @@ -6326,11 +6967,11 @@ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.37", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz", - "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==", + "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.9.0" + "moment": "^2.29.4" } }, "ms": { @@ -6338,45 +6979,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "optional": true, - "requires": { - "glob": "^6.0.1" - } - } - } - }, "mysql2": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.1.tgz", - "integrity": "sha512-UD84/AvLwO5qmSABEsBTZ7y7JKv3sM8JzWGhuL4tDkJwVsClVVAcelNSR5Unyhxj6/KHBAkjS7qe5/c+gEmNvA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.5.tgz", + "integrity": "sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -6410,41 +7016,17 @@ } } }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "optional": true - }, "node-gyp-build": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, "npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -6463,9 +7045,9 @@ } }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "object-keys": { @@ -6497,22 +7079,50 @@ "es-abstract": "^1.19.1" } }, + "object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, + "on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "devOptional": true, + "dev": true, "requires": { "wrappy": "1" } @@ -6526,27 +7136,30 @@ "mimic-fn": "^4.0.0" } }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "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==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" + "type-check": "^0.4.0" } }, "parent-module": { @@ -6567,7 +7180,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "devOptional": true + "dev": true }, "path-key": { "version": "3.1.1", @@ -6587,15 +7200,16 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" - }, "pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "picomatch": { "version": "2.3.1", @@ -6609,6 +7223,38 @@ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true }, + "pino": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.0.tgz", + "integrity": "sha512-ey+Mku+PVPhvxglLXMg1l1zQMwSHuNrKC3MD40EDZbkckJmmuY7DYZLIOwwjZ8ix/Nvhe9dZt5H99cgkot9bAw==", + "requires": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + } + }, + "pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "requires": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6616,11 +7262,20 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-ms": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", @@ -6629,15 +7284,25 @@ "parse-ms": "^3.0.0" } }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-warning": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.1.tgz", + "integrity": "sha512-JjBvFEn7MwFbzUDa2SRtKJSsyO0LlER4V/FmwLMhBlXNbGgGxdyFCxIdMDLerWUycsVUyaoM9QFLvppFy4IWaQ==" + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "queue-microtask": { @@ -6646,42 +7311,46 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" } }, - "readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "requires": { - "readable-stream": "^3.6.0" - } + "real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" } }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -6693,9 +7362,9 @@ "dev": true }, "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "requires": { "onetime": "^5.1.0", @@ -6716,6 +7385,12 @@ "requires": { "mimic-fn": "^2.1.0" } + }, + "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==", + "dev": true } } }, @@ -6745,6 +7420,88 @@ "glob": "^7.1.3" } }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "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==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6754,13 +7511,16 @@ "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "requires": { - "tslib": "^2.1.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" } }, "safe-buffer": { @@ -6768,12 +7528,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -6785,15 +7539,20 @@ "is-regex": "^1.1.4" } }, + "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==" }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "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" } @@ -6804,25 +7563,25 @@ "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" }, "sequelize": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.1.tgz", - "integrity": "sha512-cahWtRrYLjqoZP/aurGBoaxn29qQCF4bxkAUPEQ/ozjJjt6mtL4Q113S3N39mQRmX5fgxRbli+bzZARP/N51eg==", - "requires": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", + "version": "6.35.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", + "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", + "requires": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.35", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^7.0.3", - "semver": "^7.3.5", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", - "validator": "^13.7.0", + "validator": "^13.9.0", "wkx": "^0.5.0" } }, @@ -6831,6 +7590,29 @@ "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==" }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6858,9 +7640,9 @@ } }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, "slash": { @@ -6887,16 +7669,24 @@ } } }, + "sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" + }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" }, - "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", @@ -6912,14 +7702,14 @@ "dev": true }, "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", "dev": true, "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "dependencies": { "ansi-regex": { @@ -6940,36 +7730,36 @@ } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "strip-ansi": { @@ -6984,7 +7774,7 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "strip-final-newline": { @@ -6999,15 +7789,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "requires": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7023,16 +7804,34 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "synckit": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", + "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "requires": { + "real-require": "^0.2.0" + } + }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true }, "to-regex-range": { @@ -7044,58 +7843,39 @@ "is-number": "^7.0.0" } }, - "token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "requires": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - } - }, "toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "requires": {} + }, "ts-mixer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "type-check": { "version": "0.4.0", @@ -7112,6 +7892,42 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -7124,11 +7940,9 @@ } }, "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "peer": true + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==" }, "unbox-primitive": { "version": "1.0.2", @@ -7143,13 +7957,24 @@ } }, "undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", "requires": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7167,20 +7992,15 @@ "node-gyp-build": "^4.3.0" } }, - "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": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==" }, "which": { "version": "2.0.2", @@ -7205,17 +8025,16 @@ } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "wkx": { @@ -7226,44 +8045,36 @@ "@types/node": "*" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "dependencies": { - "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==", + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "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==", + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true }, - "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==", + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^6.0.1" } } } @@ -7272,12 +8083,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "devOptional": true + "dev": true }, "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "requires": {} }, "yallist": { @@ -7286,9 +8097,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true }, "yocto-queue": { diff --git a/package.json b/package.json index a6a23b4..caddfa1 100644 --- a/package.json +++ b/package.json @@ -4,32 +4,34 @@ "version": "4.0.0", "main": "dist/index.js", "dependencies": { - "axios": "1.4.0", - "bufferutil": "4.0.7", - "bunyan": "1.8.15", - "discord.js": "14.11.1-dev.1686398626-6c2242f.0", + "axios": "1.6.2", + "bufferutil": "4.0.8", + "discord.js": "14.14.1", "html-to-image": "1.11.11", - "mysql2": "3.3.1", + "mysql2": "3.6.5", + "pino": "8.17.1", "pretty-ms": "8.0.0", - "sequelize": "6.31.1", + "sequelize": "6.35.2", + "typescript": "5.3.3", "utf-8-validate": "6.0.3" }, "devDependencies": { - "@types/bunyan": "1.8.8", - "@types/node": "20.2.5", - "@typescript-eslint/eslint-plugin": "5.59.6", - "@typescript-eslint/parser": "5.59.6", - "eslint": "8.40.0", + "@types/bunyan": "1.8.11", + "@types/node": "20.10.4", + "@typescript-eslint/eslint-plugin": "6.14.0", + "@typescript-eslint/parser": "6.14.0", + "eslint": "8.56.0", "eslint-config-airbnb-base": "15.0.0", - "eslint-config-prettier": "8.8.0", - "eslint-plugin-import": "2.27.5", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", - "lint-staged": "13.2.2", - "prettier": "2.8.8" + "lint-staged": "15.2.0", + "prettier": "3.1.1" }, "scripts": { "build": "npx tsc -v -b", - "lint": "eslint . --ext .ts", + "lint": "npx eslint --fix ./src && npx prettier --check ./src --write", "prepare": "husky install" }, "keywords": [], @@ -55,5 +57,6 @@ "homepage": "https://github.com/FlipperLP/agent-black#readme", "lint-staged": { "*.ts": "eslint --cache --fix && prettier --write" - } + }, + "type": "module" } diff --git a/src/classes/banManager.ts b/src/classes/banManager.ts index 3e11a17..917d73f 100644 --- a/src/classes/banManager.ts +++ b/src/classes/banManager.ts @@ -1,5 +1,6 @@ import { Guild, GuildBan, PermissionFlagsBits, UserFlags } from 'discord.js'; -import { Model, Sequelize } from 'sequelize'; +import { Sequelize } from 'sequelize'; +import { Ban } from '../typings/Models.js'; /** * @description Ban manager data @@ -10,40 +11,34 @@ type ManagerData = { */ bans: GuildBan[]; /** - * Sequelize instance + * Sequelize */ sequelize: Sequelize; }; class BanManager { - /** - * @type {GuildBan[]} Array of bans - */ - bans: GuildBan[] = []; - /** - * @type {Sequelize} Sequelize instance - */ - sequelize: Sequelize; + declare bans: GuildBan[]; + declare sequelize: Sequelize; /** * @param {ManagerData} data Data to initialize the manager with */ constructor(data: ManagerData) { - this.bans = data.bans; - if (!data.sequelize || data.sequelize instanceof Sequelize === false) - throw new SyntaxError('Invalid Sequelize instance'); + this.bans = data.bans || []; + if (data.sequelize instanceof Sequelize === false || !data.sequelize.models.ban) + throw new SyntaxError('Invalid sequelize instance'); this.sequelize = data.sequelize; } /** * @description Adds bans to the manager * @param {GuildBan[]} bans Bans to add to the manager - * @returns {Promise} Bans in the manager + * @returns {Promise} Bans in the manager */ - add(bans: GuildBan[]): Promise { + add(bans: GuildBan[]): Promise { if (bans instanceof GuildBan === false) return Promise.reject('Invalid Ban instance'); this.bans.push(...bans); - return Promise.resolve(this.bans); + return; } /** @@ -51,65 +46,58 @@ class BanManager { * @description Adds all bans from a guild to the manager * @param {Guild} guild Guild to add bans from * @param {boolean} [cache=false] Should the manager cache the bans - * @returns {Promise} Bans in the manager + * @returns {Promise} Bans in the manager */ - async addGuildBans(guild: Guild, cache = false): Promise { + async addGuild(guild: Guild, cache = false): Promise { if (guild instanceof Guild === false) return Promise.reject('Invalid Guild instance'); - if (!guild.members.me?.permissions.has(PermissionFlagsBits.BanMembers)) + if (!guild.members.me.permissions.has(PermissionFlagsBits.BanMembers)) return Promise.reject('Missing BanMembers in guild'); const bans = await guild.bans.fetch({ cache }); this.bans.push(...bans.values()); - return Promise.resolve(this.bans); + return; } /** * @private * @description Removes invalid bans from the manager - * @returns {Promise} Bans in the manager + * @returns {void} */ - clean(): Promise { - this.bans.forEach(async (ban) => { - if (ban.user.bot && (await ban.user.fetchFlags().then((f) => f.has(UserFlags.VerifiedBot)))) this.remove(ban); - }); - return Promise.resolve(this.bans); + clean(): void { + // If ban features a user or non verified bot, remove it + this.bans = this.bans.filter(async (b) => !b.user.bot ?? (await b.user.fetchFlags()).has(UserFlags.VerifiedBot)); + return; } /** * @description Syncs the manager with the database, adding bans that don't exist in the database * @returns {Promise} Result from Sequelize */ - sync(): Promise[]> { + sync(): Promise[]> { this.clean(); // Clean bans - const p: Promise<[Model, boolean]>[] = []; - this.bans.forEach((ban) => { + const p: Promise<[Ban, boolean]>[] = []; + for (const ban of this.bans) { p.push( - this.sequelize.models.Ban.findOrCreate({ + this.sequelize.models.ban.findOrCreate({ where: { - serverID: ban.guild.id, - userID: ban.user.id, - reason: ban.reason - }, - defaults: { - // userID: ban.user.id, - // serverID: ban.guild.id, - userTag: ban.user.tag - // reason: ban.reason, + guildId: ban.guild.id, + targetId: ban.user.id, + reason: String(ban.reason) } - }) + }) as Promise<[Ban, boolean]> ); - }); + } return Promise.allSettled(p); } /** * @description Removes a ban from the manager * @param {GuildBan} ban Ban to remove from the manager - * @returns {Promise} Bans in the manager + * @returns {Promise} */ - remove(ban: GuildBan): Promise { + remove(ban: GuildBan): Promise { if (ban instanceof GuildBan === false) return Promise.reject('Invalid Ban instance'); this.bans.splice(this.bans.indexOf(ban), 1); - return Promise.resolve(this.bans); + return; } } diff --git a/src/commands/about.ts b/src/commands/about.ts index 3536a31..7ac4fc6 100644 --- a/src/commands/about.ts +++ b/src/commands/about.ts @@ -1,16 +1,14 @@ -import { CommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; -import { commands } from '../configs/config.json' assert { type: 'json' }; +import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; import { readFileSync } from 'node:fs'; +import { default as config } from '../configs/config.json' assert { type: 'json' }; +import { CustomClient } from '../typings/Extensions.js'; +const { commands } = config; -export const name = 'about'; -export const data = new SlashCommandBuilder() - .setName(name) - .setDescription('Displays some information about the bot'); -export async function run(_client: CustomClient, interaction: CommandInteraction): Promise { - await interaction.deferReply({ ephemeral: true }); +export const name = 'log'; +export const data = new SlashCommandBuilder().setName(name).setDescription('Displays some information about the bot'); +export async function run(_client: CustomClient, interaction: ChatInputCommandInteraction): Promise { interaction.editReply({ embeds: [new EmbedBuilder().setDescription(readFileSync(commands.about).toString())] }); - return Promise.resolve(); + return; } diff --git a/src/commands/alias.ts b/src/commands/alias.ts index b8dccfe..dc820c7 100644 --- a/src/commands/alias.ts +++ b/src/commands/alias.ts @@ -1,7 +1,8 @@ -import { CommandInteraction, CommandInteractionOptionResolver, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'alias'; +export const ephemeral = true; export const data = new SlashCommandBuilder() .setName(name) .setDescription('Creates, updates, or removes an alias for a user') @@ -12,7 +13,7 @@ export const data = new SlashCommandBuilder() .addUserOption((option) => { return option.setName('user').setDescription('Primary user').setRequired(true); }) - .addStringOption((option) => { + .addUserOption((option) => { return option.setName('alias').setDescription('Alternative account').setRequired(true); }); }) @@ -20,10 +21,10 @@ export const data = new SlashCommandBuilder() return subcommand .setName('update') .setDescription('Updates an alias') - .addStringOption((option) => { - return option.setName('aliasId').setDescription('Alias ID in the database').setRequired(true); + .addUserOption((option) => { + return option.setName('target').setDescription('Alias ID in the database').setRequired(true); }) - .addStringOption((option) => { + .addUserOption((option) => { return option.setName('alias').setDescription('New alternative account').setRequired(true); }); }) @@ -31,25 +32,24 @@ export const data = new SlashCommandBuilder() return subcommand .setName('remove') .setDescription('Deletes an alias from the database') - .addUserOption((option) => { - return option.setName('aliasId').setDescription('Alias ID to delete').setRequired(true); + .addStringOption((option) => { + return option.setName('alias').setDescription('Alias ID to delete').setRequired(true); }); }); export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - await interaction.deferReply({ ephemeral: true }); - const dbUser = await client.models?.User.findOne({ + const dbUser = await client.models.user.findOne({ where: { userId: interaction.user.id } }); - if (!dbUser || dbUser.flags < 1) { + if (!dbUser || !dbUser.flags.any(['Moderator', 'Maintainer'])) { interaction.editReply({ content: 'You are not authorized to use this command' }); - return Promise.resolve(); + return; } - await client.commands?.get(`${name}_${options.getSubcommand()}`)?.run(client, interaction, options); - return Promise.resolve(); + await client.commands.get(`${name}_${options.getSubcommand()}`).run(client, interaction, options); + return; } diff --git a/src/commands/alias/add.ts b/src/commands/alias/add.ts index 8e6c5e4..21b9452 100644 --- a/src/commands/alias/add.ts +++ b/src/commands/alias/add.ts @@ -1,24 +1,33 @@ -import { Alias, AliasCreationAttributes } from '../../typings/Models.ts'; +import { Alias, AliasCreationAttributes } from '../../typings/Models.js'; import { Op, UniqueConstraintError } from 'sequelize'; -import { CustomClient } from '../../typings/Extensions.ts'; -import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; +import { ChatInputCommandInteraction } from 'discord.js'; -export default async function add( +export const name = 'add'; +export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { + if ( + options.getUser('user', true).id === options.getUser('alias', true).id || + options.getUser('user', true).id === interaction.user.id || + options.getUser('alias', true).id === interaction.user.id + ) { + interaction.editReply({ content: 'You cannot alias yourself or the same two users' }); + return; + } // Check if the alias already exists or exists in reverse - const alias = await client.models?.Alias.findOne({ + const alias = await client.models.alias.findOne({ where: { [Op.or]: [ { - alternative: options.getUser('alias', true).id, - user: options.getUser('user', true).id + user: options.getUser('user', true).id, + alternative: options.getUser('alias', true).id }, { - alternative: options.getUser('user', true).id, - user: options.getUser('alias', true).id + user: options.getUser('alias', true).id, + alternative: options.getUser('user', true).id } ] } @@ -27,20 +36,7 @@ export default async function add( interaction.editReply({ content: 'The alias you attempted to set already exists' }); - return Promise.resolve(); - } - // Check for inverse aliases - const inverse = await client.models?.Alias.findOne({ - where: { - user: options.getUser('alias', true).id, - alternative: options.getUser('user', true).id - } - }); - if (inverse !== null) { - interaction.editReply({ - content: 'The alias you attempted to set already exists' - }); - return Promise.resolve(); + return; } // Create the alias const attr: AliasCreationAttributes = { @@ -48,13 +44,20 @@ export default async function add( alternative: options.getUser('alias', true).id, moderator: interaction.user.id }; - await client.models?.Alias.create(attr).then( + // Check if alternative has an alias. If so, set the alternative to the primary account + const alt = await client.models.alias.findOne({ where: { user: options.getUser('alias', true).id } }); + if (alt !== null) { + attr.user = alt.user; + attr.alternative = options.getUser('user', true).id; + } + // Create and handle the alias + await client.models.alias.create(attr).then( (dbAlias: Alias) => { if (!dbAlias) { interaction.editReply({ content: 'Failed to create the association in the database. Please try again later' }); - return Promise.resolve(); + return; } interaction.editReply({ content: `Success! ${options.getUser('user', true).toString()} has been aliased to ${options @@ -69,9 +72,11 @@ export default async function add( interaction.editReply({ content: 'The alternative account you attempted to alias already has an existing primary account' }); - return Promise.resolve(); + return; } - interaction.editReply({ content: 'An unexpected error occurred while creating the alias. Please try again later' }); + interaction.editReply({ + content: 'An unexpected error occurred while creating the alias. Please try again later' + }); } ); } diff --git a/src/commands/alias/remove.ts b/src/commands/alias/remove.ts index 7b2d31a..baf83e9 100644 --- a/src/commands/alias/remove.ts +++ b/src/commands/alias/remove.ts @@ -1,19 +1,20 @@ -import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; -export default async function remove( +export const name = 'remove'; +export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - const dbAlias = await client.models?.Alias.findOne({ - where: { aliasId: options.getString('aliasId', true) } + const dbAlias = await client.models.alias.findOne({ + where: { aliasId: options.getString('alias', true) } }); if (!dbAlias) { interaction.editReply({ content: 'The alias you attempted to remove does not exist' }); - return Promise.resolve(); + return; } // Delete the alias await dbAlias.destroy(); diff --git a/src/commands/alias/update.ts b/src/commands/alias/update.ts index f901147..83d5486 100644 --- a/src/commands/alias/update.ts +++ b/src/commands/alias/update.ts @@ -1,19 +1,29 @@ -import { CustomClient } from '../../typings/Extensions.ts'; -import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; +import { ChatInputCommandInteraction } from 'discord.js'; -export default async function ( +export const name = 'update'; +export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - const dbAlias = await client.models?.Alias.findOne({ - where: { aliasId: options.getString('aliasId', true) } + if ( + options.getUser('user', true).id === options.getUser('alias', true).id || + options.getUser('user', true).id === interaction.user.id || + options.getUser('alias', true).id === interaction.user.id + ) { + interaction.editReply({ content: 'You cannot alias yourself or the same two users' }); + return; + } + // -- // + const dbAlias = await client.models.alias.findOne({ + where: { aliasId: options.getString('target', true) } }); if (!dbAlias) { interaction.editReply({ content: 'The alias you attempted to update does not exist' }); - return Promise.resolve(); + return; } // Set the new alias dbAlias.alternative = options.getUser('alias', true).id; diff --git a/src/commands/avatar.ts b/src/commands/avatar.ts index c746f11..3e5723c 100644 --- a/src/commands/avatar.ts +++ b/src/commands/avatar.ts @@ -1,5 +1,5 @@ -import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'avatar'; export const data = new SlashCommandBuilder() @@ -10,15 +10,19 @@ export const data = new SlashCommandBuilder() }); export async function run( _client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - await interaction.deferReply({ ephemeral: false }); interaction.editReply({ embeds: [ - new EmbedBuilder().setImage( - options.getUser('user')?.displayAvatarURL({ size: 4096 }) || 'https://cdn.discordapp.com/embed/avatars/5.png' - ) + { + description: `Avatar for ${options.getUser('user', true).toString()}`, + image: { + url: + options.getUser('user', true).displayAvatarURL({ size: 2048 }) || + 'https://cdn.discordapp.com/embed/avatars/5.png' + } + } ] }); } diff --git a/src/commands/banner.ts b/src/commands/banner.ts index e5d2414..a8c3231 100644 --- a/src/commands/banner.ts +++ b/src/commands/banner.ts @@ -1,5 +1,5 @@ -import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'banner'; export const data = new SlashCommandBuilder() @@ -10,15 +10,19 @@ export const data = new SlashCommandBuilder() }); export async function run( _client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - await interaction.deferReply({ ephemeral: false }); + await options.getUser('user').fetch(); interaction.editReply({ embeds: [ - new EmbedBuilder().setImage( - options.getUser('user', true).bannerURL({ size: 4096 }) || 'https://cdn.discordapp.com/embed/avatars/5.png' - ) + { + description: `Banner for ${options.getUser('user', true).toString()}`, + image: { + url: + options.getUser('user', true).bannerURL({ size: 2048 }) || 'https://cdn.discordapp.com/embed/avatars/5.png' + } + } ] }); } diff --git a/src/commands/broadcast.ts b/src/commands/broadcast.ts index 3c62daa..fe689db 100644 --- a/src/commands/broadcast.ts +++ b/src/commands/broadcast.ts @@ -1,9 +1,8 @@ -import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; -import { StaffFlags } from '../typings/StaffFlags.ts'; -import StaffFlagsBitField from '../typings/StaffFlagsBitField.ts'; +import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'broadcast'; +export const ephemeral = false; export const data = new SlashCommandBuilder() .setName(name) .setDescription('Broadcasts a message to all participating servers') @@ -12,48 +11,50 @@ export const data = new SlashCommandBuilder() }); export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - await interaction.deferReply({ ephemeral: true }); - const dbUser = await client.models?.User.findOne({ + const dbUser = await client.models.user.findOne({ where: { userId: interaction.user.id } }); if (!dbUser) { await interaction.editReply({ content: 'You are not authorized to use this command' }); - return Promise.resolve(); + return; } - const flags = new StaffFlagsBitField(BigInt(dbUser.flags)); - if (!flags.has(StaffFlags.Maintainer)) { + const flags = dbUser.flags; + if (!flags.has('Maintainer')) { await interaction.editReply({ content: 'You are not authorized to use this command' }); - return Promise.resolve(); + return; } // Convert body const body = options.getString('message', true).replace(/\\n/g, '\n'); // Send message interaction.editReply({ content: 'Sending messages...' }); - const guilds = await client.models?.Guild.findAll({ + const guilds = await client.models.guild.findAll({ where: { enabled: true, banned: false } }); const errors: { guildId: string; error: string }[] = []; - guilds?.forEach((g) => { - client.channels.fetch(g.settings.channel).then((c) => { - if (!c || !c.isTextBased()) { - errors.push({ - guildId: g.guildId, - error: 'Invalid channel provided' - }); - return; - } - c.send({ - content: `Message from Maintainer ${interaction.user.toString()}`, - embeds: [new EmbedBuilder().setDescription(body).setColor(4182379)] - }).catch((e) => errors.push({ guildId: g.guildId, error: e.message })); - }); + guilds.forEach((g) => { + client.channels + .fetch(g.settings.channel) + .then((c) => { + if (!c || !c.isTextBased()) { + errors.push({ + guildId: g.guildId, + error: 'Invalid channel provided' + }); + return; + } + c.send({ + content: `Message from Maintainer ${interaction.user.toString()}`, + embeds: [new EmbedBuilder().setDescription(body).setColor(4182379)] + }).catch((e) => errors.push({ guildId: g.guildId, error: e.message })); + }) + .catch((e) => errors.push({ guildId: g.guildId, error: e.message })); }); if (errors.length > 0) { interaction.editReply({ diff --git a/src/commands/changelog.ts b/src/commands/changelog.ts index 1ce9268..6953cda 100644 --- a/src/commands/changelog.ts +++ b/src/commands/changelog.ts @@ -1,16 +1,16 @@ -import { CommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; -import { commands } from '../configs/config.json' assert { type: 'json' }; +import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; import { readFileSync } from 'node:fs'; +import { default as config } from '../configs/config.json' assert { type: 'json' }; +import { CustomClient } from '../typings/Extensions.js'; +const { commands } = config; export const name = 'changelog'; export const data = new SlashCommandBuilder() .setName(name) .setDescription('Displays current version and changes as of the most recent update'); -export async function run(_client: CustomClient, interaction: CommandInteraction): Promise { - await interaction.deferReply({ ephemeral: true }); +export async function run(_client: CustomClient, interaction: ChatInputCommandInteraction): Promise { interaction.editReply({ embeds: [new EmbedBuilder().setDescription(readFileSync(commands.changelog).toString())] }); - return Promise.resolve(); + return; } diff --git a/src/commands/checkallusers.ts b/src/commands/checkallusers.ts index bce8035..e3ab718 100644 --- a/src/commands/checkallusers.ts +++ b/src/commands/checkallusers.ts @@ -1,5 +1,5 @@ -import { SlashCommandBuilder, CommandInteraction, PermissionsBitField, PermissionFlagsBits } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; +import { ChatInputCommandInteraction, PermissionFlagsBits, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'checkallusers'; export const data = new SlashCommandBuilder() @@ -14,29 +14,28 @@ export const data = new SlashCommandBuilder() value: 'yes' }); }); -export async function run(client: CustomClient, interaction: CommandInteraction): Promise { - await interaction.deferReply({ ephemeral: true }); - if ((interaction.member?.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { +export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { + if ((interaction.member.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { interaction.editReply({ content: 'You are not authorized to use this command' }); - return Promise.resolve(); + return; } - const users = await interaction.guild?.members.fetch(); + const users = await interaction.guild.members.fetch(); if (!users) { interaction.editReply({ content: 'Could not fetch users' }); - return Promise.resolve(); + return; } const ids = users.map((user) => user.id); - const allBans = await client.models?.Ban.findAll({ + const allBans = await client.models.ban.findAll({ where: { targetId: ids } }); if (!allBans || allBans.length === 0) { interaction.editReply({ content: `Success! Scanned all members and found no bans. Your server is clean` }); - return Promise.resolve(); + return; } if (allBans.length <= 5) { allBans.forEach(async (ban) => { @@ -55,9 +54,9 @@ export async function run(client: CustomClient, interaction: CommandInteraction) interaction.editReply({ content: `Success! Scanned all members and found ${allBans.length} bans. See below for details` }); - return Promise.resolve(); + return; } // @ts-expect-error This function has different parameters - await client.commands?.get('checkallusers_handler')?.run(client, interaction, allBans); - return Promise.resolve(); + await client.commands.get('checkallusers_handler').run(client, interaction, allBans); + return; } diff --git a/src/commands/checkallusers/handler.ts b/src/commands/checkallusers/handler.ts index bc80071..a1fb53b 100644 --- a/src/commands/checkallusers/handler.ts +++ b/src/commands/checkallusers/handler.ts @@ -1,8 +1,9 @@ -import { CustomClient } from '../../typings/Extensions.ts'; -import { CommandInteraction, EmbedBuilder } from 'discord.js'; -import { Ban } from '../../typings/Models.ts'; +import { ChatInputCommandInteraction, EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; +import { Ban } from '../../typings/Models.js'; -export function handler(client: CustomClient, interaction: CommandInteraction, bans: Ban[]): Promise { +export const name = 'handler'; +export async function run(client: CustomClient, interaction: ChatInputCommandInteraction, bans: Ban[]): Promise { // Split the bans into groups of 5 const banGroups: EmbedBuilder[][] = []; let temp: EmbedBuilder[] = []; @@ -38,5 +39,5 @@ export function handler(client: CustomClient, interaction: CommandInteraction, b }); } }, 10_000); - return Promise.resolve(); + return; } diff --git a/src/commands/eval.ts b/src/commands/eval.ts index 79b0fd4..fa916da 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -1,9 +1,8 @@ -import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; -import { StaffFlags } from '../typings/StaffFlags.ts'; -import StaffFlagsBitField from '../typings/StaffFlagsBitField.ts'; +import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'eval'; +export const ephemeral = true; export const data = new SlashCommandBuilder() .setName(name) .setDescription('Runs snippets of code') @@ -12,25 +11,23 @@ export const data = new SlashCommandBuilder() }); export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - await interaction.deferReply({ ephemeral: true }); - const dbUser = await client.models?.User.findOne({ + const dbUser = await client.models.user.findOne({ where: { userId: interaction.user.id } }); if (!dbUser) { interaction.editReply({ content: 'You are not authorized to use this command' }); - return Promise.resolve(); + return; } - const flags = new StaffFlagsBitField(BigInt(dbUser.flags)); - if (!flags.has(StaffFlags.Owner)) { + if (!dbUser.flags.has('Owner')) { interaction.editReply({ content: 'You are not authorized to use this command' }); - return Promise.resolve(); + return; } // Execute command const result = eval(options.getString('script', true)); @@ -39,5 +36,5 @@ export async function run( new EmbedBuilder().setTitle('Evaluation').setDescription(`\`\`\`js\n${JSON.stringify(result, null, 2)}\`\`\``) ] }); - return Promise.resolve(); + return; } diff --git a/src/commands/guild.ts b/src/commands/guild.ts index 299633c..b74511a 100644 --- a/src/commands/guild.ts +++ b/src/commands/guild.ts @@ -1,20 +1,20 @@ import { ChannelType, - CommandInteraction, - CommandInteractionOptionResolver, + ChatInputCommandInteraction, PermissionFlagsBits, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'guild'; +export const ephemeral = true; export const data = new SlashCommandBuilder() .setName(name) .setDescription('Manages your server') .addSubcommand((subcommand) => { return subcommand - .setName(name) + .setName('setup') .setDescription('Sets up your server with the bot') .addChannelOption((option) => { return option @@ -41,16 +41,15 @@ export const data = new SlashCommandBuilder() }); export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ) { - await interaction.deferReply({ ephemeral: true }); - if ((interaction.member?.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { + if ((interaction.member.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { interaction.editReply({ content: 'You are not authorised to run this command' }); - return Promise.resolve(); + return; } - await client.commands?.get(`guild_${options.getSubcommand()}`)?.run(client, interaction, options); - return Promise.resolve(); + await client.commands.get(`guild_${options.getSubcommand()}`).run(client, interaction, options); + return; } diff --git a/src/commands/guild/disable.ts b/src/commands/guild/disable.ts index 5f3f4c2..6872ce6 100644 --- a/src/commands/guild/disable.ts +++ b/src/commands/guild/disable.ts @@ -1,25 +1,25 @@ -import { CommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; export const name = 'disable'; -export async function run(client: CustomClient, interaction: CommandInteraction): Promise { - const guild = await client.models?.Guild.findOne({ +export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { + const guild = await client.models.guild.findOne({ where: { guildId: interaction.guildId as string } }); if (!guild) { interaction.editReply({ content: 'This server has not been set up yet. Please run `/guild setup`' }); - return Promise.resolve(); + return; } if (!guild.enabled) { interaction.editReply({ content: 'This server is already disabled' }); - return Promise.resolve(); + return; } - guild.enabled = 0; + guild.enabled = false; await guild.save(); interaction.editReply({ content: 'Successfully disabled the bot in this server' }); - return Promise.resolve(); + return; } diff --git a/src/commands/guild/enable.ts b/src/commands/guild/enable.ts index 9250437..6c597f7 100644 --- a/src/commands/guild/enable.ts +++ b/src/commands/guild/enable.ts @@ -1,25 +1,25 @@ -import { CommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; export const name = 'disable'; -export async function run(client: CustomClient, interaction: CommandInteraction): Promise { - const guild = await client.models?.Guild.findOne({ +export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { + const guild = await client.models.guild.findOne({ where: { guildId: interaction.guildId as string } }); if (!guild) { interaction.editReply({ content: 'This server has not been set up yet. Please run `/guild setup`' }); - return Promise.resolve(); + return; } if (guild.enabled) { interaction.editReply({ content: 'This server is already enabled' }); - return Promise.resolve(); + return; } - guild.enabled = 1; + guild.enabled = true; await guild.save(); interaction.editReply({ content: 'Successfully enabled the bot in this server' }); - return Promise.resolve(); + return; } diff --git a/src/commands/guild/setup.ts b/src/commands/guild/setup.ts index 952e6b0..e4a1231 100644 --- a/src/commands/guild/setup.ts +++ b/src/commands/guild/setup.ts @@ -1,22 +1,22 @@ -import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; -import { GuildCreationAttributes } from '../../typings/Models.ts'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; +import { GuildCreationAttributes } from '../../typings/Models.js'; export const name = 'setup'; export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { const attr: GuildCreationAttributes = { - guildId: interaction.guild?.id as string, + guildId: interaction.guild.id as string, settings: { channel: options.getChannel('staff_channel', true).id, role: options.getRole('authorised_role', true).id } }; - const dbResponse = await client.models?.Guild.findOrCreate({ + const dbResponse = await client.models.guild.findOrCreate({ where: { guildId: attr.guildId }, @@ -26,10 +26,10 @@ export async function run( interaction.editReply({ content: 'An error occurred while performing setup. Please try again later' }); - return Promise.resolve(); + return; } interaction.editReply({ content: `Success! ${dbResponse[1] ? 'Created' : 'Updated'} guild settings for ${dbResponse[0].guildId}` }); - return Promise.resolve(); + return; } diff --git a/src/commands/guild/stats.ts b/src/commands/guild/stats.ts index d824842..c594e78 100644 --- a/src/commands/guild/stats.ts +++ b/src/commands/guild/stats.ts @@ -1,20 +1,20 @@ -import { CommandInteraction, EmbedBuilder } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction, EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; export const name = 'stats'; -export async function run(client: CustomClient, interaction: CommandInteraction): Promise { - const guild = await client.models?.Guild.findOne({ +export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { + const guild = await client.models.guild.findOne({ where: { guildId: interaction.guildId as string } }); - const owner = await interaction.guild?.fetchOwner(); + const owner = await interaction.guild.fetchOwner(); if (!owner) { interaction.editReply({ content: 'An error occurred while fetching guild data. Please try again later' }); - return Promise.resolve(); + return; } const embed = new EmbedBuilder() - .setTitle(`Statistics for ${interaction.guild?.name}`) + .setTitle(`Statistics for ${interaction.guild.name}`) .setAuthor({ name: owner.user.tag, iconURL: owner.displayAvatarURL({ size: 1024 }) @@ -22,7 +22,7 @@ export async function run(client: CustomClient, interaction: CommandInteraction) .addFields([ { name: 'Server Info', - value: `${interaction.guild?.name} (\`${interaction.guildId}\`)`, + value: `${interaction.guild.name} (\`${interaction.guildId}\`)`, inline: true } ]) @@ -48,5 +48,5 @@ export async function run(client: CustomClient, interaction: CommandInteraction) ]); } interaction.editReply({ embeds: [embed] }); - return Promise.resolve(); + return; } diff --git a/src/commands/guildmgr.ts b/src/commands/guildmgr.ts index 0093e32..2648bcc 100644 --- a/src/commands/guildmgr.ts +++ b/src/commands/guildmgr.ts @@ -1,9 +1,9 @@ -import { CommandInteraction, CommandInteractionOptionResolver, SlashCommandBuilder } from "discord.js"; -import { CustomClient } from "../typings/Extensions.ts"; -import StaffFlagsBitField from "../typings/StaffFlagsBitField.ts"; -import { StaffFlags } from "../typings/StaffFlags.ts"; +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; +import { StaffFlags } from '../typings/StaffFlags.js'; export const name = 'guildmgr'; +export const ephemeral = true; export const data = new SlashCommandBuilder() .setName(name) .setDescription('[Maintainer] Manages guilds') @@ -12,25 +12,17 @@ export const data = new SlashCommandBuilder() .setName('add') .setDescription('Add guild') .addStringOption((option) => { - return option - .setName('server') - .setDescription('Guild ID to add') - .setAutocomplete(true) - .setRequired(true); + return option.setName('server').setDescription('Guild ID to add').setAutocomplete(true).setRequired(true); }) .addStringOption((option) => { return option .setName('channel') - .setDescription('Guild\'s staff channel') + .setDescription("Guild's staff channel") .setAutocomplete(true) .setRequired(true); }) .addStringOption((option) => { - return option - .setName('role') - .setDescription('Guild\'s authorised role') - .setAutocomplete(true) - .setRequired(true); + return option.setName('role').setDescription("Guild's authorised role").setAutocomplete(true).setRequired(true); }); }) .addSubcommand((subcommand) => { @@ -50,11 +42,7 @@ export const data = new SlashCommandBuilder() .setName('remove') .setDescription('Remove guild') .addStringOption((option) => { - return option - .setName('server') - .setDescription('Guild ID to remove') - .setAutocomplete(true) - .setRequired(true); + return option.setName('server').setDescription('Guild ID to remove').setAutocomplete(true).setRequired(true); }); }) .addSubcommand((subcommand) => { @@ -62,25 +50,23 @@ export const data = new SlashCommandBuilder() .setName('block') .setDescription('Block guild') .addStringOption((option) => { - return option - .setName('server') - .setDescription('Guild ID to block') - .setAutocomplete(true) - .setRequired(true); + return option.setName('server').setDescription('Guild ID to block').setAutocomplete(true).setRequired(true); }); }); -export async function run(client: CustomClient, interaction: CommandInteraction, options: CommandInteractionOptionResolver): Promise { - await interaction.deferReply({ ephemeral: true }); - const user = await client.models?.User.findOne({ where: { userId: interaction.user.id } }); +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const user = await client.models.user.findOne({ where: { userId: interaction.user.id } }); if (!user) { interaction.editReply({ content: 'You are not authorized to use this command.' }); - return Promise.resolve(); + return; } - const flags = new StaffFlagsBitField(BigInt(user.flags)); - if (!flags.has(StaffFlags.Maintainer)) { + if (!user.flags.has(StaffFlags.Maintainer)) { interaction.editReply({ content: 'You are not authorized to use this command.' }); - return Promise.resolve(); + return; } - await client.functions?.get(`guildmgr_${options.getSubcommand(true)}`)?.run(client, interaction, options); - return Promise.resolve(); -} \ No newline at end of file + await client.commands.get(`guildmgr_${options.getSubcommand(true)}`).run(client, interaction, options); + return; +} diff --git a/src/commands/guildmgr/add.ts b/src/commands/guildmgr/add.ts index 53214ab..e2bff0e 100644 --- a/src/commands/guildmgr/add.ts +++ b/src/commands/guildmgr/add.ts @@ -1,11 +1,11 @@ -import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; export const name = 'add'; export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { const rawChannel = options.getString('channel', true); const rawGuild = options.getString('server', true); @@ -25,15 +25,15 @@ export async function run( await interaction.editReply('Invalid argument: Role not found'); return; } - if(!client.models) return; // Suppress ESLint unsafe optional chaining - const [_dbGuild, created] = await client.models.Guild.findOrCreate({ + if (!client.models) return; // Suppress ESLint unsafe optional chaining + const [, created] = await client.models.guild.findOrCreate({ where: { guildId: guild.id }, defaults: { guildId: guild.id, - banned: 0, - enabled: 1, + banned: false, + enabled: true, settings: { channel: channel.id, role: role.id @@ -41,5 +41,5 @@ export async function run( } }); interaction.editReply(`Guild ${guild.name} has been ${created ? 'added' : 'updated'} with the settings provided`); - return Promise.resolve(); + return; } diff --git a/src/commands/guildmgr/block.ts b/src/commands/guildmgr/block.ts index 64c8bc7..fad9b8d 100644 --- a/src/commands/guildmgr/block.ts +++ b/src/commands/guildmgr/block.ts @@ -1,26 +1,26 @@ -import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; export const name = 'block'; export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { const guildId = options.getString('server', true); const guild = client.guilds.cache.get(guildId); if (!guild) { interaction.editReply({ content: 'Specified guild ID does not exist' }); - return Promise.resolve(); + return; } - const dbGuild = await client.models?.Guild.findOne({ where: { guildId } }); + const dbGuild = await client.models.guild.findOne({ where: { guildId } }); if (!dbGuild) { interaction.editReply({ content: 'Specified guild ID is not in the database' }); - return Promise.resolve(); + return; } - dbGuild.banned = 1; - dbGuild.enabled = 0; + dbGuild.banned = true; + dbGuild.enabled = false; await dbGuild.save(); interaction.editReply({ content: `Guild ${guild.name} has been blocked from using the bot` }); - return Promise.resolve(); + return; } diff --git a/src/commands/guildmgr/info.ts b/src/commands/guildmgr/info.ts index ab1380b..4ab1254 100644 --- a/src/commands/guildmgr/info.ts +++ b/src/commands/guildmgr/info.ts @@ -1,25 +1,25 @@ -import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction, EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; export const name = 'info'; export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { const guildId = options.getString('server', true); - const guild = await client.models?.Guild.findOne({ + const guild = await client.models.guild.findOne({ where: { guildId } }); - const owner = await interaction.guild?.fetchOwner(); + const owner = await interaction.guild.fetchOwner(); if (!owner) { interaction.editReply({ content: 'An error occurred while fetching guild data. Please try again later' }); - return Promise.resolve(); + return; } const embed = new EmbedBuilder() - .setTitle(`Statistics for ${interaction.guild?.name}`) + .setTitle(`Statistics for ${interaction.guild.name}`) .setAuthor({ name: owner.user.tag, iconURL: owner.displayAvatarURL({ size: 1024 }) @@ -27,7 +27,7 @@ export async function run( .addFields([ { name: 'Server Info', - value: `${interaction.guild?.name} (\`${interaction.guildId}\`)`, + value: `${interaction.guild.name} (\`${interaction.guildId}\`)`, inline: true } ]) @@ -53,5 +53,5 @@ export async function run( ]); } interaction.editReply({ embeds: [embed] }); - return Promise.resolve(); + return; } diff --git a/src/commands/guildmgr/remove.ts b/src/commands/guildmgr/remove.ts index 50b1931..bd0f977 100644 --- a/src/commands/guildmgr/remove.ts +++ b/src/commands/guildmgr/remove.ts @@ -1,20 +1,20 @@ -import { CommandInteraction, CommandInteractionOptionResolver } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.ts'; +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; export const name = 'block'; export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { const guildId = options.getString('server', true); - const dbGuild = await client.models?.Guild.findOne({ where: { guildId } }); + const dbGuild = await client.models.guild.findOne({ where: { guildId } }); if (!dbGuild) { interaction.editReply({ content: 'Specified guild ID is not in the database' }); - return Promise.resolve(); + return; } - dbGuild.enabled = 0; + dbGuild.enabled = false; await dbGuild.save(); interaction.editReply({ content: `Guild \`${guildId}\` has been disabled from using the bot` }); - return Promise.resolve(); + return; } diff --git a/src/commands/help.ts b/src/commands/help.ts index db627fb..5714d8f 100644 --- a/src/commands/help.ts +++ b/src/commands/help.ts @@ -1,14 +1,13 @@ -import { CommandInteraction, SlashCommandBuilder, EmbedBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; +import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; export const name = 'help'; export const data = new SlashCommandBuilder().setName(name).setDescription('Displays help menu'); -export async function run(_client: CustomClient, interaction: CommandInteraction): Promise { - await interaction.deferReply({ ephemeral: true }); +export async function run(_client: CustomClient, interaction: ChatInputCommandInteraction): Promise { const embed = new EmbedBuilder().setTitle('Help Panel').setDescription( `Our wiki is found here and details every command: https://github.com/FlippedCode/agent-black/wiki You can also join our server found here: https://discord.gg/TqBwHtzzhD` ); interaction.editReply({ embeds: [embed] }); - return Promise.resolve(); + return; } diff --git a/src/commands/lookup.ts b/src/commands/lookup.ts index 2e15a26..84845a5 100644 --- a/src/commands/lookup.ts +++ b/src/commands/lookup.ts @@ -1,29 +1,115 @@ -import { CommandInteraction, CommandInteractionOptionResolver, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.ts'; +import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CustomClient, FlagEmoji } from '../typings/Extensions.js'; +// Load functions from other files +import { run as aliasOverview } from './lookup/aliasOverview.js'; +import { run as userBans } from './lookup/userBans.js'; +import { run as userWarns } from './lookup/userWarns.js'; export const name = 'lookup'; export const data = new SlashCommandBuilder() .setName(name) .setDescription('Fetches data from the Discord API and Agent Black database') .addUserOption((option) => { - return option.setName('user').setDescription('The user to lookup').setRequired(true); + return option.setName('user').setDescription('The user to search').setRequired(true); }); export async function run( client: CustomClient, - interaction: CommandInteraction, - options: CommandInteractionOptionResolver + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] ): Promise { - const bans = {}; - const warns = {}; - const aliases = await client.models?.Alias.findAll({ where: { user: options.getUser('user', true).id } }); - const discordUser = await options.getUser('user', true); - const flags = await discordUser.fetchFlags(); - const embed = new EmbedBuilder() - .setTitle(`${discordUser.username} (${discordUser.displayName})`) - .setDescription(`**ID:** ${discordUser.id}\n**Created At**`) - .addFields( - { - name: - } - ) + // Definitions + const user = options.getUser('user', true), + aliases = (await client.models.alias.findAll({ where: { user: user.id } })) || []; + // Get their user information + const discordUser = options.getUser('user', true); + const dFlags = await discordUser.fetchFlags(); + const flags: string[] = dFlags + .toArray() + // Map to emojis + .map((flag) => FlagEmoji[String(flag) as keyof typeof FlagEmoji]) + .filter((v) => v !== undefined); + + // Unverified Bot + if (discordUser.bot && !flags.includes(FlagEmoji.VerifiedBot)) flags.push('**Unverified Bot**'); + + /** @desc List of categories that can be switched through */ + const categories: { [key: string]: EmbedBuilder[] } = { + overview: [], + aliases: [], + warns: [], + bans: [] + }; + //#region Overview + categories.overview.push( + new EmbedBuilder() + .setTitle(`User Information`) + .setDescription('Contains basic information about this user') + .addFields( + { + name: 'Username', + value: discordUser.username, + inline: true + }, + { + name: 'Display Name', + value: String(discordUser.globalName || 'N/A'), + inline: true + }, + { + name: 'ID', + value: String(discordUser.id), + inline: true + }, + { + name: 'Created At', + value: ``, + inline: true + }, + { + name: 'Flags', + value: flags.join(' ') || 'None', + inline: true + } + ) + .setTimestamp() + ); + //#endregion + //#region Warns & Bans + categories['warns'] = await userWarns(client, user.id); + categories['bans'] = await userBans(client, user.id); + categories['aliases'] = await aliasOverview(client, user.id); + // Use an array to store promises + const aliasBans: Promise[] = []; + const aliasWarns: Promise[] = []; + for (const alias of aliases) { + aliasBans.push(userBans(client, String(alias.alternative))); + aliasWarns.push(userWarns(client, String(alias.alternative))); + } + // Wait for all promises to resolve + // Flatten to return a single array + categories['bans'].push(...(await Promise.all(aliasBans)).flat()); + categories['warns'].push(...(await Promise.all(aliasWarns)).flat()); + //#endregion + await client.functions.get('utils_pagination').execute(client, interaction, categories, [ + { + label: 'Overview', + value: 'overview', + description: `View general information on ${user.username}` + }, + { + label: 'Alias', + value: 'aliases', + description: `View aliases for ${user.username}` + }, + { + label: 'Bans', + value: 'bans', + description: `${user.username}'s bans across all servers` + }, + { + label: 'Warns', + value: 'warns', + description: `${user.username}'s warnings across all servers` + } + ]); } diff --git a/src/commands/lookup/aliasOverview.ts b/src/commands/lookup/aliasOverview.ts new file mode 100644 index 0000000..e6f517c --- /dev/null +++ b/src/commands/lookup/aliasOverview.ts @@ -0,0 +1,34 @@ +import { EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; + +export const name = 'aliasOverview'; +export async function run(client: CustomClient, target: string): Promise { + // Variables + const aliases = await client.models.alias.findAll({ where: { user: target } }); + // No aliases + if (!aliases || aliases.length === 0) { + return [ + new EmbedBuilder() + .setTitle('Aliases') + .setDescription(`No aliases exist for the selected user <@${target}> (${target})`) + ]; + } + // Add aliases, 6 per embed + const embeds: EmbedBuilder[] = []; + let embed = new EmbedBuilder().setTitle('Aliases').setDescription(`Aliases for <@${target}> (${target})`); + for (let i = 0; i < aliases.length; i++) { + // Add field + embed.addFields({ + name: `Alias ${aliases[i].aliasId}`, + value: `<@${aliases[i].alternative}> (${aliases[i].alternative})`, + inline: true + }); + // Add embed to array if 6 fields have been added + if ((i % 6 === 0 && i !== 0) || i === aliases.length - 1) { + embed.setFooter({ text: `Page ${embeds.length + 1}` }); + embeds.push(embed); + embed = new EmbedBuilder().setTitle('Aliases').setDescription(`Aliases for <@${target}> (${target})`); + } + } + return embeds; +} diff --git a/src/commands/lookup/userBans.ts b/src/commands/lookup/userBans.ts new file mode 100644 index 0000000..fc601e6 --- /dev/null +++ b/src/commands/lookup/userBans.ts @@ -0,0 +1,49 @@ +import { EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; + +function escape(str: string): string { + return str.replace(/`/g, '\\`'); +} + +export const name = 'userBans'; +export async function run(client: CustomClient, user: string): Promise { + const bans = await client.models.ban.findAll({ where: { targetId: user } }); + const u = await client.users.fetch(user); + const e: EmbedBuilder[] = []; + if (!bans || bans.length === 0) + return [new EmbedBuilder().setTitle('No Bans Found').setDescription(`No bans were found for <@${user}> (${user})`)]; + for (const ban of bans) { + const g = await client.guilds.fetch(ban.guildId); + e.push( + new EmbedBuilder() + .setTitle(`${u.username}'s Bans`) + .setDescription( + `This ban is: **${!ban.isSoftDeleted() ? 'Active' : 'Removed'}**\`\`\`\n${escape(ban.reason)}\`\`\`` + ) + .setFields( + { + name: 'Target', + value: `<@${ban.targetId}>`, + inline: true + }, + { + name: 'Server', + value: `${g.name} (${g.id})`, + inline: true + }, + { + name: 'Timings', + value: `Created: \nUpdated: `, + inline: true + } + ) + .setFooter({ + text: `${bans.indexOf(ban) + 1}/${bans.length}` + }) + .setTimestamp() + ); + } + return e; +} diff --git a/src/commands/lookup/userWarns.ts b/src/commands/lookup/userWarns.ts new file mode 100644 index 0000000..0c88d83 --- /dev/null +++ b/src/commands/lookup/userWarns.ts @@ -0,0 +1,52 @@ +import { EmbedBuilder } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; + +function escape(str: string): string { + return str.replace(/`/g, '\\`'); +} + +export const name = 'userWarns'; +export async function run(client: CustomClient, user: string): Promise { + const warns = await client.models.warn.findAll({ where: { targetId: user } }); + const u = await client.users.fetch(user); + if (!u) return []; + const e: EmbedBuilder[] = []; + if (!warns || warns.length === 0) + return [ + new EmbedBuilder().setTitle('No Warns Found').setDescription(`No warns were found for <@${user}> (${user})`) + ]; + for (const warn of warns) { + const g = await client.guilds.fetch(warn.guildId); + e.push( + new EmbedBuilder() + .setTitle(`${u.username}'s Warnings`) + .setDescription( + `This warn is: **${!warn.isSoftDeleted() ? 'Active' : 'Removed'}**\`\`\`\n${escape(warn.reason)}\`\`\`` + ) + .setFields( + { + name: 'Target', + value: `<@${warn.targetId}>`, + inline: true + }, + { + name: 'Server', + value: `${g.name} (${g.id})`, + inline: true + }, + { + name: 'Timings', + value: `Created: \nUpdated: `, + inline: true + } + ) + .setFooter({ + text: `${warns.indexOf(warn) + 1}/${warns.length}` + }) + .setTimestamp() + ); + } + return e; +} diff --git a/src/commands/maintainer.ts b/src/commands/maintainer.ts index 60cd225..5d06e7a 100644 --- a/src/commands/maintainer.ts +++ b/src/commands/maintainer.ts @@ -1,25 +1,47 @@ -const Maintainer = require('../database/models/Maintainer'); +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; -module.exports.run = async (interaction) => { - // check maintainer permissions - if (!await client.functions?.get('CHECK_DB_perms').run(interaction.user.id)) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); +export const name = 'maintainer'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Manages the maintainers [STAFF ONLY]') + .addUserOption((option) => option.setName('user').setDescription('Target user').setRequired(true)) + .addStringOption((option) => + option + .setName('action') + .setDescription('What do you want to do with this user?') + .addChoices( + { + name: 'Add maintainer', + value: 'add' + }, + { + name: 'Remove maintainer', + value: 'remove' + }, + { + name: 'Display info about user', + value: 'info' + } + ) + .setRequired(true) + ); +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const u = await client.models.user.findOne({ where: { userId: interaction.user.id } }); + if (!u || !u.flags.has('Moderator')) { + interaction.editReply({ content: 'You are not authorised to use this command' }); return; } - const subName = interaction.options.getString('action', true); - client.commands?.get(`${module.exports.data.name}_${subName}`).run(interaction, Maintainer); -}; - -module.exports.data = new CmdBuilder() - .setName(name) - .setDescription('Manages the maintainers. [MAINTAINER ONLY]') - .addUserOption((option) => option.setName('user').setDescription('Provide a user you want to edit.').setRequired(true)) - .addStringOption((option) => option - .setName('action') - .setDescription('What do you want to do with this user?') - .addChoices([ - ['Add user', 'add'], - ['Remove user', 'remove'], - ['Display info about user', 'info'], - ]) - .setRequired(true)); + // -- // + const act = options.getString('action', true); + if (act !== 'info' && !u.flags.has('Owner')) { + interaction.editReply({ content: 'You are not authorised to use perform that action' }); + return; + } + // -- // + client.commands.get(`${name}_${act}`).run(client, interaction, options); +} diff --git a/src/commands/maintainer/add.ts b/src/commands/maintainer/add.ts index d4bdc3f..f27ebe3 100644 --- a/src/commands/maintainer/add.ts +++ b/src/commands/maintainer/add.ts @@ -1,28 +1,22 @@ -// adds a user to the Maintainer table -async function addUser(Maintainer, userID) { - const added = await Maintainer.findOrCreate( - { - where: { userID }, - }, - ).catch(ERR); - const created = await added[1]; - return created; -} +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; -// adds user entry -module.exports.run = async (interaction, Maintainer) => { - const userID = await interaction.options.getUser('user').id; - if (userID === interaction.user.id) return messageFail(interaction, 'You cant edit yourself.'); - // add server - const userAdded = await addUser(Maintainer, userID); - // post outcome - if (userAdded) { - messageSuccess(interaction, - `<@${userID}> with the ID \`${userID}\` got added to the maintainers list.`); - } else { - messageFail(interaction, - `The entry for the user <@${userID}> with the ID \`${userID}\` already exists!`); +export const name = 'add'; +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const m = await options.getUser('user'); + const [u] = await client.models.user.findOrCreate({ + where: { userId: m.id } + }); + if (!u) { + interaction.editReply({ content: 'Sequelize failed to find or create the staff member' }); + return; } -}; - -module.exports.data = { subcommand: true }; + // -- // + u.flags.add('Maintainer'); + u.save(); + interaction.editReply({ content: 'Added maintainer' }); +} diff --git a/src/commands/maintainer/info.ts b/src/commands/maintainer/info.ts index af287e5..b9298b4 100644 --- a/src/commands/maintainer/info.ts +++ b/src/commands/maintainer/info.ts @@ -1,25 +1,44 @@ -// finds a user in the Maintainers table -async function findUser(Maintainer, userID) { - const found = await Maintainer.findOne({ where: { userID } }) - .catch(ERR); - return found; -} +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; -// adds user entry -module.exports.run = async (interaction, Maintainer) => { - const user = interaction.options.getUser('user'); - const userID = user.id; - const userFound = await findUser(Maintainer, userID); - if (userFound) { - const userID = userFound.userID; - messageSuccess(interaction, - `User tag: <@${userID}> (\`${user.tag}\`) - User ID: \`${userID}\` - Maintainer since \`${userFound.createdAt}\``); - } else { - messageFail(interaction, - `The user with the ID \`${userID}\` couldn't be found in the list.`); +export const name = 'info'; +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const m = await options.getUser('user'); + const u = await client.models.user.findOne({ where: { userId: m.id } }); + if (!u) { + interaction.editReply({ content: 'User is not a member of staff' }); + return; } -}; - -module.exports.data = { subcommand: true }; + // -- // + interaction.editReply({ + embeds: [ + { + title: `Staff Information | ` + m.globalName, + author: { + name: m.username, + icon_url: m.displayAvatarURL() + }, + fields: [ + { + name: 'Role', + value: u.flags.has('Owner', false) ? 'Owner' : u.flags.has('Maintainer') ? 'Maintainer' : 'Moderator' + }, + { + name: 'Flags', + value: u.flags.toArray().join(', ') + }, + { + name: 'Staff Since', + value: ` ()` + } + ] + } + ] + }); +} diff --git a/src/commands/maintainer/remove.ts b/src/commands/maintainer/remove.ts index 43139c7..21da969 100644 --- a/src/commands/maintainer/remove.ts +++ b/src/commands/maintainer/remove.ts @@ -1,21 +1,23 @@ -// removes a user from the Maintainer table -async function removeUser(Maintainer, userID) { - const destroyed = await Maintainer.destroy({ limit: 1, where: { userID } }); - return destroyed; -} +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; -// adds user entry -module.exports.run = async (interaction, Maintainer) => { - const userID = await interaction.options.getUser('user').id; - if (userID === interaction.user.id) return messageFail(interaction, 'You cant edit yourself.'); - const userRemoved = await removeUser(Maintainer, userID); - if (userRemoved >= 1) { - messageSuccess(interaction, - `The user with the ID \`${userID}\` got removed from the maintainers list.`); - } else { - messageFail(interaction, - `The user with the ID \`${userID}\` couldn't be found of the list.`); +export const name = 'remove'; +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const u = await client.models.user.findOne({ where: { userId: options.getUser('user').id } }); + if (!u) { + interaction.editReply({ content: 'User is not a member of staff' }); + return; } -}; - -module.exports.data = { subcommand: true }; + if (u.flags.has('Owner') || u.userId === interaction.user.id) { + interaction.editReply({ content: 'You cannot remove this user' }); + return; + } + // -- // + u.flags.remove('Maintainer'); + u.save(); + interaction.editReply({ content: 'Removed maintainer' }); +} diff --git a/src/commands/ping.ts b/src/commands/ping.ts index 8a8af74..db51e10 100644 --- a/src/commands/ping.ts +++ b/src/commands/ping.ts @@ -1,33 +1,27 @@ -const { MessageEmbed, MessageActionRow, MessageButton } = require('discord.js'); +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; -// Ping kickoff for bot latency -async function kickoff(interaction) { - const sendMessage = await new MessageEmbed() - .setDescription('📤 Pong...') - .setColor(); - const sentMessage = await reply(interaction, { embeds: [sendMessage], fetchReply: true }); - return sentMessage; +export const name = 'ping'; +export const data = new SlashCommandBuilder().setName(name).setDescription('Shows Discord API and bot latency'); +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + _options: ChatInputCommandInteraction['options'] +): Promise { + const t0 = Date.now(); + await interaction.editReply({ content: 'Pinging services, please wait (0/1)' }); + // -- // + await interaction.editReply({ content: 'Pinging services, please wait (1/1)' }); + const t1 = Date.now(); + const latency = t1 - t0; + // -- // + interaction.editReply({ + content: 'Pinged services!', + embeds: [ + { + title: 'Latency Results', + description: `Discord API: ${latency}ms\nWebsocket: ${client.ws.ping}ms` + } + ] + }); } - -// message for data return -function editedMessage(sentMessage, interaction) { - const api_latency = Math.round(sentMessage.client.ws.ping); - const body = `📥 Pong! - Bot latency is \`${sentMessage.createdTimestamp - interaction.createdTimestamp}\`ms. - API latency is \`${api_latency}\`ms`; - return new MessageEmbed() - .setDescription(body) - .setColor(); -} - -// posts ping message and edits it afterwards -async function checkPing(interaction) { - const sentReply = await kickoff(interaction); - reply(interaction, { embeds: [editedMessage(sentReply, interaction)] }); -} - -module.exports.run = async (interaction) => checkPing(interaction); - -module.exports.data = new CmdBuilder() - .setName(name) - .setDescription('Shows API and bot latencies.'); diff --git a/src/commands/syncallbans.ts b/src/commands/syncallbans.ts index 204b846..be4c6cc 100644 --- a/src/commands/syncallbans.ts +++ b/src/commands/syncallbans.ts @@ -1,35 +1,40 @@ -const Ban = require('../database/models/Ban'); +import { ChatInputCommandInteraction, SlashCommandBuilder, Team } from 'discord.js'; +import { BanManager } from '../classes/banManager.js'; +import { CustomClient } from '../typings/Extensions.js'; -module.exports.run = async (interaction) => { - // check owner permissions - if (interaction.user.id !== '172031697355800577') return messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); +function authorised(client: CustomClient, user: string): boolean { + return ( + (client.application.owner instanceof Team && client.application.owner.members.has(user)) || + client.application.owner.id === user + ); +} - if (!DEBUG) await interaction.deferReply(); - await client.guilds.cache.forEach(async (guild) => { - const bans = await guild.bans.fetch({ cache: false }); - await bans.forEach(async ({ user, reason }) => { - const userTag = user.tag; - const userBanned = true; - const userID = user.id; - const serverID = guild.id; - let fixedReason = reason; - if (reason !== null) fixedReason = reason.replace(new RegExp('\'', 'g'), '`'); - const [banEntry] = await Ban.findOrCreate({ - where: { userID, serverID }, - defaults: { reason: fixedReason, userTag, userBanned }, - }).catch(ERR); - if (!banEntry.isNewRecord) { - Ban.update({ reason: fixedReason, userBanned }, - { where: { userID, serverID } }) - .catch(ERR); - } - }); - }); - await setTimeout(() => { - messageSuccess(interaction, 'Done!'); - }, client.guilds.cache.size * 300); -}; - -module.exports.data = new CmdBuilder() +export const name = 'syncallbans'; +export const data = new SlashCommandBuilder() .setName(name) - .setDescription('Adds all bans from all participating servers. [OWNER ONLY].'); + .setDescription('Adds all bans from all participating servers [OWNER ONLY]'); +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + _options: ChatInputCommandInteraction['options'] +): Promise { + // Check owner + if (!authorised(client, interaction.user.id)) { + interaction.editReply({ content: 'You are not authorised to use this command' }); + return; + } + // Fetch guilds + const guilds = await client.guilds.fetch(); + const manager = new BanManager({ bans: [], sequelize: client.sequelize }); + // Loop through guilds, adding promises + const p = []; + for (const g of guilds.values()) { + // Add guild, using ID from OAuthGuild + p.push(manager.addGuild(client.guilds.cache.get(g.id), true)); + } + await Promise.all(p); + // Sync bans + await manager.sync(); + // Reply + interaction.editReply({ content: `Synced ${manager.bans.length} bans` }); +} diff --git a/src/commands/syncbans.ts b/src/commands/syncbans.ts index c71517f..cc549cb 100644 --- a/src/commands/syncbans.ts +++ b/src/commands/syncbans.ts @@ -1,49 +1,40 @@ -const { MessageEmbed } = require('discord.js'); - -const Ban = require('../database/models/Ban'); - -module.exports.run = async (interaction) => { - // check maintainer permissions - if (!await client.functions?.get('CHECK_DB_perms').run(interaction.user.id)) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { BanManager } from '../classes/banManager.js'; +import { CustomClient } from '../typings/Extensions.js'; + +function authorised(client: CustomClient, user: string): Promise { + return client.models.user + .findOne({ where: { userId: user } }) + .then((u) => u.flags.has('Maintainer')) + .catch(() => false); +} + +export const name = 'syncbans'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Adds bans from the current guild [MAINTAINER ONLY]'); +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + _options: ChatInputCommandInteraction['options'] +): Promise { + // Check owner + if (!authorised(client, interaction.user.id)) { + interaction.editReply({ content: 'You are not authorised to use this command' }); return; } - - const serverID = interaction.options.getString('server'); - - const server = await interaction.client.guilds.cache.find((guild) => guild.id === serverID); - - if (!server) return messageFail(interaction, 'Sorry, but I am unable to find that server.'); - - if (!DEBUG) await interaction.deferReply({ ephemeral: false }); - - const bans = await server.bans.fetch({ cache: false }).catch(ERR); - await bans.forEach(async ({ user, reason: reasonRaw }) => { - const reason = reasonRaw === null ? reasonRaw : reasonRaw.replace(new RegExp('\'', 'g'), '`'); - const userID = user.id; - const userBanned = true; - const userTag = user.tag; - - const [banEntry] = await Ban.findOrCreate({ - where: { userID, serverID }, - defaults: { reason, userTag, userBanned }, - }).catch(ERR); - if (!banEntry.isNewRecord) { - Ban.update({ reason, userBanned }, - { where: { userID, serverID } }) - .catch(ERR); - } - }); - - await reply(interaction, { embeds: [new MessageEmbed().setAuthor({ name: `Done importing bans from ${server.name}!` })] }); -}; - -module.exports.data = new CmdBuilder() - .setName(name) - .setDescription('Adds all bans from the current server its beeing used in. [MAINTAINER ONLY]') - .addStringOption((option) => option - .setName('server') - .setDescription('Provide a guild ID you want to edit.') - .setAutocomplete(true) - // Needs to be required, otherwise servername is passed and not the serverID from Autocomplete - .setRequired(true)); + // Fetch guild + const g = await client.models.guild.findOne({ where: { guildId: interaction.guildId } }); + if (!g) { + interaction.editReply({ content: 'This server is not participating! Run `/guild setup` to add the server' }); + return; + } + const manager = new BanManager({ bans: [], sequelize: client.sequelize }); + // Loop through guild + await manager.addGuild(interaction.guild, true); + // Sync bans + const bans = await manager.sync(); + const success = bans.filter((b) => b.status !== 'rejected'); + // Reply + interaction.editReply({ content: `Synced ${success.length}/${bans.length} bans` }); +} diff --git a/src/commands/unban.ts b/src/commands/unban.ts index 92871b7..aa7e25e 100644 --- a/src/commands/unban.ts +++ b/src/commands/unban.ts @@ -1,33 +1,29 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; -const { CommandInteraction } = require('discord.js'); - -/** - * @param { CommandInteraction } interaction - */ - -module.exports.run = async (interaction) => { - // check MANAGE_GUILD permissions - if (!interaction.memberPermissions.has('BAN_MEMBERS')) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); +export const name = 'unban'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Unbans a user') + .addUserOption((option) => option.setName('user').setDescription('Banned user').setRequired(true)); +export async function run( + _client: CustomClient, + interaction: ChatInputCommandInteraction, + interaction2: LockInfo, + options: ChatInputCommandInteraction['options'] +): Promise { + if (!interaction.memberPermissions.has('BanMembers')) { + interaction.editReply({ content: 'You are not authorised to use this command' }); return; } - const guild = interaction.guild; - // TODO: Filter the reason - update event-guildBanRemove - // const reason = options.getString('reason'); - - const user = interaction.options.getUser('user'); - - // Existing ban? - // FIXME: Bad implementation of catch() - const existingBan = await guild.bans.fetch(user).catch((e) => e); - if (existingBan.code) return messageFail(interaction, 'That user is not banned.'); - // unban user - await guild.bans.remove(user); - messageSuccess(interaction, `\`${user.tag}\` has been unbanned!`); -}; - -module.exports.data = new SlashCommandBuilder() - .setName(name) - .setDescription('Unbans a user.') - .addUserOption((option) => option.setName('user').setDescription('Provide a user.').setRequired(true)); + // Find ban + const b = await interaction.guild.bans.fetch(options.getUser('user')); + if (!b) { + interaction.editReply({ content: 'The supplied user is not banned' }); + return; + } + // Unban + await interaction.guild.bans.remove(b.user); + // Reply + interaction.editReply({ content: `Unbanned ${b.user.toString()}` }); +} diff --git a/src/commands/warn.ts b/src/commands/warn.ts index 7feede0..caeb7e2 100644 --- a/src/commands/warn.ts +++ b/src/commands/warn.ts @@ -1,94 +1,40 @@ -const { MessageEmbed } = require('discord.js'); +import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { CustomClient } from '../typings/Extensions.js'; -const Warn = require('../database/models/Warn'); - -// TODO: recreate richmessage embed sender to it can be sent to other servers - -// checks if server is partisipating server -function getServerEntry(serverID) { - return client.functions?.get('GET_DB_server').run(serverID, true); -} - -// warns other servers -async function messageWarnedUserInGuild(channelID, userTag, userID, warnMessage, serverName) { - const embed = new MessageEmbed(); - embed.setColor(16755456); - embed.setFooter({ text: `For more information about this user, use '/lookup ${userID}'` }); - embed.setTitle(`A user on your server has been warned on '${serverName}'!`); - embed.setDescription(`Tag: \`${userTag}\` - ID: \`${userID}\` - Reason: \`\`\`${warnMessage || 'none'}\`\`\``); - const channel = await client.channels.cache.get(channelID); - channel.send({ embeds: [embed] }); -} - -// warns other servers for aliases -async function messageWarnedAliasUserInGuild(channelID, userTag, userID, warnMessage, serverName, orgUserTag) { - const embed = new MessageEmbed(); - embed.setColor(16755456); - embed.setFooter({ text: `For more information about this user, use '/lookup ${orgUserTag}'` }); - embed.setTitle(`An alias of a user on your server has been warned on '${serverName}'!`); - embed.setDescription(`**The user \`${userTag}\` is an alias of a user that has been warned!** - - Tag: \`${orgUserTag}\` - ID: \`${userID}\` - Reason: \`\`\`${warnMessage || 'none'}\`\`\``); - const channel = await client.channels.cache.get(channelID); - channel.send({ embeds: [embed] }); -} - -async function checkforInfectedGuilds(guild, orgUserID, warnMessage) { - let aliases = await client.functions?.get('GET_DB_alias').run(orgUserID); - if (!aliases) aliases = [orgUserID]; - const orgUser = await client.users.fetch(orgUserID, false); - // look for each of the conencted users (alias) if they are a member in the corresponding guild - aliases.forEach((userID) => { - client.guilds.cache.forEach(async (toTestGuild) => { - // dont post in own guild - // TODO: warn own server that there are aliases: let through, if user is not the same as who a warn was issued for - if (guild.id === toTestGuild.id) return; - const serverMember = toTestGuild.members.cache.get(userID); - if (!serverMember) return; - const serverID = toTestGuild.id; - const infectedGuild = await getServerEntry(serverID); - if (infectedGuild && infectedGuild.active && infectedGuild.logChannelID) { - if (orgUserID === userID) messageWarnedUserInGuild(infectedGuild.logChannelID, orgUser.tag, orgUserID, warnMessage, guild.name); - else messageWarnedAliasUserInGuild(infectedGuild.logChannelID, serverMember.user.tag, orgUserID, warnMessage, guild.name, orgUser.tag); - } - }); +export const name = 'warn'; +export const data = new SlashCommandBuilder() + .setName(name) + .setDescription('Warns other servers about a specific user') + .addSubcommand((cmd) => { + return cmd + .setName('add') + .setDescription('Add warning to a user') + .addUserOption((option) => + option.setName('target').setDescription('User to issue a warning to').setRequired(true) + ) + .addStringOption((option) => + option.setName('message').setDescription('Statement regarding the user').setRequired(true) + ); + }) + .addSubcommand((cmd) => { + return cmd + .setName('edit') + .setDescription('Edit a existing warning.') + .addNumberOption((option) => option.setName('id').setDescription('Unique warning ID').setRequired(true)) + .addStringOption((option) => + option.setName('message').setDescription('Statement regarding the user').setRequired(true) + ); }); -} - -module.exports.run = async (interaction) => { - // check maintainer permissions - if (!await client.functions?.get('CHECK_DB_perms').run(interaction.user.id, 'staff', interaction.guild.id, interaction.member)) { - messageFail(interaction, `You are not authorized to use \`/${module.exports.data.name}\``); +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const dbUser = await client.models.user.findOne({ where: { userId: interaction.user.id } }); + if ((!dbUser || dbUser.flags.has('Staff')) && interaction.memberPermissions.has('ModerateMembers')) { + interaction.editReply({ content: 'You are not authorised to perform that action' }); return; } - const subName = interaction.options.getSubcommand(true); - const warnMessage = interaction.options.getString('message', true); - client.commands?.get(`${module.exports.data.name}_${subName}`).run(interaction, warnMessage, Warn, checkforInfectedGuilds); -}; - -module.exports.data = new CmdBuilder() - .setName(name) - .setDescription('Warns other servers about a specific user.') - .addSubcommand((SC) => SC - .setName('add') - .setDescription('Add warning.') - .addUserOption((option) => option.setName('user').setDescription('Provide a user.').setRequired(true)) - .addStringOption((option) => option - .setName('message') - .setDescription('Message this warning should be.') - .setRequired(true))) - .addSubcommand((SC) => SC - .setName('edit') - .setDescription('Edit a existing warning.') - .addNumberOption((option) => option - .setName('warnid') - .setDescription('Provide the warn ID of the one you want to edit.') - .setRequired(true)) - .addStringOption((option) => option - .setName('message') - .setDescription('Message this warning should be.') - .setRequired(true))); + const act = options.getSubcommand(true); + client.commands.get(`${name}_${act}`).run(client, interaction, options); +} diff --git a/src/commands/warn/add.ts b/src/commands/warn/add.ts index 1e6fbce..ed7b223 100644 --- a/src/commands/warn/add.ts +++ b/src/commands/warn/add.ts @@ -1,15 +1,31 @@ -// adds a Warn to the warning table -async function addWarn(Warn, serverID, userID, reason) { - await Warn.create({ userID, serverID, reason }).catch(ERR); -} +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; -module.exports.run = async (interaction, warnMessage, Warn, checkforInfectedGuilds) => { - // get information - const userID = interaction.options.getUser('user', true).id; - // add warn - await addWarn(Warn, interaction.guild.id, userID, warnMessage); - messageSuccess(interaction, `The user with the ID \`${userID}\` got a new warning added.\n Warning other servers.`); - checkforInfectedGuilds(interaction.guild, userID, warnMessage); -}; +// Safely escapes backticks and backslashes +function escape(str: string): string { + return str.replace('\\', '\\\\').replace('`', '\\`'); +} -module.exports.data = { subcommand: true }; +export const name = 'add'; +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const t = options.getUser('target'); + const w = await client.models.warn.create({ + guildId: interaction.guild.id, + targetId: t.id, + reason: options.getString('message') + }); + interaction.editReply({ content: `Successfully created warning ${w.warnId}. Scanning for affected servers` }); + // Warn servers + client.functions + .get('utils_masterMessage') + .execute( + client, + `New warning issued for ${t.username} (${t.id}) who is in your server. Reason: \n\`\`\`\n${escape( + w.reason + )}\`\`\`` + ); +} diff --git a/src/commands/warn/edit.ts b/src/commands/warn/edit.ts index 7d7adcc..37bd7f7 100644 --- a/src/commands/warn/edit.ts +++ b/src/commands/warn/edit.ts @@ -1,33 +1,40 @@ -// edits a Warn to the warning table -async function editWarn(Warn, warnID, reason) { - Warn.update({ reason }, { where: { warnID } }).catch(ERR); -} +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; -async function getWarning(Warn, warnID) { - const found = await Warn.findOne({ where: { warnID } }).catch(ERR); - return found; +// Safely escapes backticks and backslashes +function escape(str: string): string { + return str.replace('\\', '\\\\').replace('`', '\\`'); } -module.exports.run = async (interaction, warnMessage, Warn, checkforInfectedGuilds) => { - // check if user exists - // if (isNaN(userIDOrWarnID)) { - // messageFail(interaction, 'This is not a warn-ID!'); - // return; - // } - const warnID = interaction.options.getNumber('warnid', true); - const serverID = interaction.guild.id; - const warning = await getWarning(Warn, warnID); - // check if warn is existent - if (!warning) return messageFail(interaction, 'A Warning with this ID doesn\'t exist!'); - // check if warn is from the same server - if (warning.serverID !== serverID) { - messageFail(interaction, 'You can only edit warnings form the server where they have been issued from.'); +export const name = 'edit'; +export async function run( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] +): Promise { + const entry = await client.models.warn.findOne({ + where: { + warnId: options.getNumber('id', true), + guildId: interaction.guildId + } + }); + if (!entry) { + interaction.editReply({ content: 'That warning does not exist' }); return; } - // add warn - await editWarn(Warn, warnID, warnMessage); - messageSuccess(interaction, `The warning with the the ID ${warnID} has been edited. Warning other servers.`); - checkforInfectedGuilds(interaction.guild, warning.userID, warnMessage); -}; - -module.exports.data = { subcommand: true }; + // Get the target + // Update the entry + entry.reason = options.getString('message', true); + await entry.save(); + interaction.editReply({ content: 'Warning updated. Servers will be updated shortly' }); + // Warn other servers + const t = await client.users.fetch(entry.targetId)!; + client.functions + .get('utils_masterMessage') + .execute( + client, + `Warning updated for ${t.username} (${t.id}) who is in your server. Reason: \n\`\`\`\n${escape( + entry.reason + )}\`\`\`` + ); +} diff --git a/src/configs/config.json b/src/configs/config.json index fb52a78..f2b4009 100644 --- a/src/configs/config.json +++ b/src/configs/config.json @@ -10,8 +10,8 @@ "lowerQuerryLimit": 5, "botBadge": "<:system_bot_notifier:813101401646432298>" }, - "about": "./about.txt", - "changelog": "./changelog.txt" + "about": "./ABOUT.md", + "changelog": "./CHANGELOG.md" }, "functions": { "userTagRecord": { diff --git a/src/configs/example_config.json b/src/configs/example_config.json index dd75f26..718aa6e 100644 --- a/src/configs/example_config.json +++ b/src/configs/example_config.json @@ -1,11 +1,11 @@ { - "README": "THIS FILE OF FOR DEBUGGING PURPOSES ONLY! USE ENVIRONMENT VARIABLES IN PRODUCTION.", - "token": "**************************", - "development": { - "username": "***", - "password": "*****************", - "database": "**********************", - "host": "*****************", - "dialect": "mysql" - } -} \ No newline at end of file + "README": "THIS FILE OF FOR DEBUGGING PURPOSES ONLY! USE ENVIRONMENT VARIABLES IN PRODUCTION.", + "token": "**************************", + "development": { + "username": "***", + "password": "*****************", + "database": "**********************", + "host": "*****************", + "dialect": "mysql" + } +} diff --git a/src/database/models/alias.ts b/src/database/models/alias.ts index 59a5b49..d25eb07 100644 --- a/src/database/models/alias.ts +++ b/src/database/models/alias.ts @@ -1,6 +1,6 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; -import type { user, userId } from './user.ts'; +import type { user, userId } from './user.js'; export interface aliasAttributes { aliasId: number; @@ -13,28 +13,22 @@ export interface aliasAttributes { export type aliasPk = 'aliasId'; export type aliasId = alias[aliasPk]; -export type aliasOptionalAttributes = 'aliasId' | 'createdAt' | 'updatedAt'; -export type aliasCreationAttributes = Optional< - aliasAttributes, - aliasOptionalAttributes ->; +export type aliasOptionalAttributes = aliasPk | 'createdAt' | 'updatedAt'; +export type aliasCreationAttributes = Optional; -export class alias - extends Model - implements aliasAttributes -{ - aliasId!: number; - user!: string; - alternative!: string; - moderator!: string; - createdAt!: Date; - updatedAt!: Date; +export class alias extends Model implements aliasAttributes { + declare aliasId: number; + declare user: string; + declare alternative: string; + declare moderator: string; + declare createdAt: Date; + declare updatedAt: Date; // alias belongsTo user via moderator - moderator_user!: user; - getModerator_user!: Sequelize.BelongsToGetAssociationMixin; - setModerator_user!: Sequelize.BelongsToSetAssociationMixin; - createModerator_user!: Sequelize.BelongsToCreateAssociationMixin; + declare moderator_user: user; + declare getModerator_user: Sequelize.BelongsToGetAssociationMixin; + declare setModerator_user: Sequelize.BelongsToSetAssociationMixin; + declare createModerator_user: Sequelize.BelongsToCreateAssociationMixin; static initModel(sequelize: Sequelize.Sequelize): typeof alias { return alias.init( diff --git a/src/database/models/ban.ts b/src/database/models/ban.ts index db3071b..16e069f 100644 --- a/src/database/models/ban.ts +++ b/src/database/models/ban.ts @@ -1,36 +1,35 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; -import type { guild, guildId } from './guild.ts'; +import type { guild, guildId } from './guild.js'; export interface banAttributes { banId: number; guildId: string; targetId: string; reason: string; - active: number; - createdAt: Date; - updatedAt: Date; + active: boolean; } export type banPk = 'banId'; export type banId = ban[banPk]; -export type banOptionalAttributes = 'active' | 'createdAt' | 'updatedAt'; +export type banOptionalAttributes = banPk | 'active'; export type banCreationAttributes = Optional; export class ban extends Model implements banAttributes { - banId!: number; - guildId!: string; - targetId!: string; - reason!: string; - active!: number; - createdAt!: Date; - updatedAt!: Date; + declare banId: number; + declare guildId: string; + declare targetId: string; + declare reason: string; + declare active: boolean; + declare createdAt: Date; + declare updatedAt: Date; + declare deletedAt: Date | null; // ban belongsTo guild via guildId - guild!: guild; - getGuild!: Sequelize.BelongsToGetAssociationMixin; - setGuild!: Sequelize.BelongsToSetAssociationMixin; - createGuild!: Sequelize.BelongsToCreateAssociationMixin; + declare guild: guild; + declare getGuild: Sequelize.BelongsToGetAssociationMixin; + declare setGuild: Sequelize.BelongsToSetAssociationMixin; + declare createGuild: Sequelize.BelongsToCreateAssociationMixin; static initModel(sequelize: Sequelize.Sequelize): typeof ban { return ban.init( @@ -58,25 +57,17 @@ export class ban extends Model implements allowNull: false }, active: { - type: DataTypes.BOOLEAN, - allowNull: false, - defaultValue: 1 - }, - createdAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') - }, - updatedAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + type: DataTypes.VIRTUAL, + get() { + return this.isSoftDeleted(); + } } }, { sequelize, tableName: 'ban', - timestamps: false, + timestamps: true, + paranoid: true, indexes: [ { name: 'PRIMARY', diff --git a/src/database/models/guild.ts b/src/database/models/guild.ts index a23cda5..aedcad1 100644 --- a/src/database/models/guild.ts +++ b/src/database/models/guild.ts @@ -1,12 +1,12 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; -import type { ban, banId } from './ban.ts'; -import type { warn, warnId } from './warn.ts'; +import type { ban, banId } from './ban.js'; +import type { warn, warnId } from './warn.js'; export interface guildAttributes { guildId: string; - enabled: number; - banned: number; + enabled: boolean; + banned: boolean; settings: guildSettings; createdAt: Date; updatedAt: Date; @@ -22,37 +22,37 @@ export type guildSettings = { }; export class guild extends Model implements guildAttributes { - guildId!: string; - enabled!: number; - banned!: number; - settings!: guildSettings; - createdAt!: Date; - updatedAt!: Date; + declare guildId: string; + declare enabled: boolean; + declare banned: boolean; + declare settings: guildSettings; + declare createdAt: Date; + declare updatedAt: Date; // guild hasMany ban via guildId - bans!: ban[]; - getBans!: Sequelize.HasManyGetAssociationsMixin; - setBans!: Sequelize.HasManySetAssociationsMixin; - addBan!: Sequelize.HasManyAddAssociationMixin; - addBans!: Sequelize.HasManyAddAssociationsMixin; - createBan!: Sequelize.HasManyCreateAssociationMixin; - removeBan!: Sequelize.HasManyRemoveAssociationMixin; - removeBans!: Sequelize.HasManyRemoveAssociationsMixin; - hasBan!: Sequelize.HasManyHasAssociationMixin; - hasBans!: Sequelize.HasManyHasAssociationsMixin; - countBans!: Sequelize.HasManyCountAssociationsMixin; + declare bans: ban[]; + declare getBans: Sequelize.HasManyGetAssociationsMixin; + declare setBans: Sequelize.HasManySetAssociationsMixin; + declare addBan: Sequelize.HasManyAddAssociationMixin; + declare addBans: Sequelize.HasManyAddAssociationsMixin; + declare createBan: Sequelize.HasManyCreateAssociationMixin; + declare removeBan: Sequelize.HasManyRemoveAssociationMixin; + declare removeBans: Sequelize.HasManyRemoveAssociationsMixin; + declare hasBan: Sequelize.HasManyHasAssociationMixin; + declare hasBans: Sequelize.HasManyHasAssociationsMixin; + declare countBans: Sequelize.HasManyCountAssociationsMixin; // guild hasMany warn via guildId - warns!: warn[]; - getWarns!: Sequelize.HasManyGetAssociationsMixin; - setWarns!: Sequelize.HasManySetAssociationsMixin; - addWarn!: Sequelize.HasManyAddAssociationMixin; - addWarns!: Sequelize.HasManyAddAssociationsMixin; - createWarn!: Sequelize.HasManyCreateAssociationMixin; - removeWarn!: Sequelize.HasManyRemoveAssociationMixin; - removeWarns!: Sequelize.HasManyRemoveAssociationsMixin; - hasWarn!: Sequelize.HasManyHasAssociationMixin; - hasWarns!: Sequelize.HasManyHasAssociationsMixin; - countWarns!: Sequelize.HasManyCountAssociationsMixin; + declare warns: warn[]; + declare getWarns: Sequelize.HasManyGetAssociationsMixin; + declare setWarns: Sequelize.HasManySetAssociationsMixin; + declare addWarn: Sequelize.HasManyAddAssociationMixin; + declare addWarns: Sequelize.HasManyAddAssociationsMixin; + declare createWarn: Sequelize.HasManyCreateAssociationMixin; + declare removeWarn: Sequelize.HasManyRemoveAssociationMixin; + declare removeWarns: Sequelize.HasManyRemoveAssociationsMixin; + declare hasWarn: Sequelize.HasManyHasAssociationMixin; + declare hasWarns: Sequelize.HasManyHasAssociationsMixin; + declare countWarns: Sequelize.HasManyCountAssociationsMixin; static initModel(sequelize: Sequelize.Sequelize): typeof guild { return guild.init( @@ -63,14 +63,14 @@ export class guild extends Model imple primaryKey: true }, enabled: { - type: DataTypes.TINYINT, + type: DataTypes.BOOLEAN, allowNull: false, - defaultValue: 0 + defaultValue: false }, banned: { - type: DataTypes.TINYINT, + type: DataTypes.BOOLEAN, allowNull: false, - defaultValue: 0 + defaultValue: false }, settings: { type: DataTypes.JSON, diff --git a/src/database/models/user.ts b/src/database/models/user.ts index 431a192..7f3bf8b 100644 --- a/src/database/models/user.ts +++ b/src/database/models/user.ts @@ -1,23 +1,22 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; +import { StaffFlagsBitField } from '../../typings/Bitfield.js'; export interface userAttributes { userId: string; - flags: number; - createdAt: Date; - updatedAt: Date; + flags: StaffFlagsBitField; } export type userPk = 'userId'; export type userId = user[userPk]; -export type userOptionalAttributes = 'flags' | 'createdAt' | 'updatedAt'; +export type userOptionalAttributes = 'flags'; export type userCreationAttributes = Optional; export class user extends Model implements userAttributes { - userId!: string; - flags!: number; - createdAt!: Date; - updatedAt!: Date; + declare userId: string; + declare flags: StaffFlagsBitField; + declare createdAt: Date; + declare updatedAt: Date; static initModel(sequelize: Sequelize.Sequelize): typeof user { return user.init( @@ -30,23 +29,21 @@ export class user extends Model implemen flags: { type: DataTypes.INTEGER, allowNull: false, - defaultValue: 0 - }, - createdAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') - }, - updatedAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + defaultValue: 0, + get() { + const f = BigInt(this.getDataValue('flags') as unknown as number); + return new StaffFlagsBitField(f); + }, + set(val: StaffFlagsBitField) { + // @ts-expect-error Intentional assignment + this.setDataValue('flags', val.bitfield); + } } }, { sequelize, tableName: 'user', - timestamps: false, + timestamps: true, indexes: [ { name: 'PRIMARY', diff --git a/src/database/models/warn.ts b/src/database/models/warn.ts index b1bc5e2..d474207 100644 --- a/src/database/models/warn.ts +++ b/src/database/models/warn.ts @@ -1,41 +1,40 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; -import type { guild, guildId } from './guild.ts'; +import type { guild, guildId } from './guild.js'; export interface warnAttributes { - banId: number; + warnId: number; guildId: string; targetId: string; reason: string; - active: number; - createdAt: Date; - updatedAt: Date; + active: boolean; } -export type warnPk = 'banId'; +export type warnPk = 'warnId'; export type warnId = warn[warnPk]; -export type warnOptionalAttributes = 'active' | 'createdAt' | 'updatedAt'; +export type warnOptionalAttributes = warnPk; export type warnCreationAttributes = Optional; export class warn extends Model implements warnAttributes { - banId!: number; - guildId!: string; - targetId!: string; - reason!: string; - active!: number; - createdAt!: Date; - updatedAt!: Date; + declare warnId: number; + declare guildId: string; + declare targetId: string; + declare reason: string; + declare active: boolean; + declare createdAt: Date; + declare updatedAt: Date; + declare deletedAt: Date; // warn belongsTo guild via guildId - guild!: guild; - getGuild!: Sequelize.BelongsToGetAssociationMixin; - setGuild!: Sequelize.BelongsToSetAssociationMixin; - createGuild!: Sequelize.BelongsToCreateAssociationMixin; + declare guild: guild; + declare getGuild: Sequelize.BelongsToGetAssociationMixin; + declare setGuild: Sequelize.BelongsToSetAssociationMixin; + declare createGuild: Sequelize.BelongsToCreateAssociationMixin; static initModel(sequelize: Sequelize.Sequelize): typeof warn { return warn.init( { - banId: { + warnId: { type: DataTypes.INTEGER, allowNull: false, primaryKey: true, @@ -58,31 +57,23 @@ export class warn extends Model implemen allowNull: false }, active: { - type: DataTypes.BOOLEAN, - allowNull: false, - defaultValue: 1 - }, - createdAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') - }, - updatedAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + type: DataTypes.VIRTUAL, + get() { + return this.isSoftDeleted(); + } } }, { sequelize, tableName: 'warn', - timestamps: false, + timestamps: true, + paranoid: true, indexes: [ { name: 'PRIMARY', unique: true, using: 'BTREE', - fields: [{ name: 'banId' }] + fields: [{ name: 'warnId' }] }, { name: 'warns_ibfk_1', diff --git a/src/functions/READY/commandInit.ts b/src/functions/READY/commandInit.ts deleted file mode 100644 index 11cdd35..0000000 --- a/src/functions/READY/commandInit.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { readdirSync, statSync } from 'node:fs'; -import { CustomClient, SlashCommandFile } from '../../typings/Extensions.ts'; -import { RESTPostAPIChatInputApplicationCommandsJSONBody } from 'discord.js'; -const files: string[] = []; - -function recursiveLookup(dir: string): string[] { - readdirSync(dir).forEach((file: string) => { - const absolute = `${dir}/${file}`; - if (statSync(absolute).isDirectory()) return recursiveLookup(absolute); - files.push(absolute); - }); - return files; -} - -export const fileName = 'commandInit'; - -export default async function (client: CustomClient): Promise { - const slashCommands: RESTPostAPIChatInputApplicationCommandsJSONBody[] = []; - // List of files - const commandFiles: string[] = recursiveLookup('./commands').filter((f: string) => f.endsWith('.js')); - const commandLength: number = commandFiles.length; - if (commandLength <= 0) return client.stdrr?.info(`[${fileName}] No command(s) to load!`); - if (Deno.env.get('NODE_ENV')) - client.stdrr?.debug(`[${fileName}] Loading ${commandLength} command${commandLength !== 1 ? 's' : ''}...`); - - for (const [i, file] of commandFiles.entries()) { - const fileData: SlashCommandFile = await import(file); - const cleanName: string = file.replace(/\\|\//g, '_').replace('commands_', '').replace('.js', ''); - // "continue" skips the rest of the loop and goes to the next iteration - if (cleanName.search('archive_') !== -1) continue; - if (Deno.env.get('NODE_ENV') === 'development') - client.stdrr?.debug(`[${fileName}] ${i + 1}) Loaded: ${cleanName}!`); - client.commands.set(cleanName, fileData); - // If the file has a data property, it's a slash command - if (fileData.data) slashCommands.push(fileData.data.toJSON()); - } - client.stdrr?.info(`[${fileName}] Loaded ${commandLength} command${commandLength !== 1 ? 's' : ''}!`); - - const slashCommandsLength = slashCommands.length; - client.stdrr?.info(`[${fileName}] Registering ${slashCommandsLength} command${slashCommandsLength !== 1 ? 's' : ''}...`); - - // submit commands to discord api| Dev: one guild only, prod: globally - if (Deno.env.get('NODE_ENV') === 'development') { - const changedCommands = slashCommands.map((command) => { - const newCommand = command; - newCommand.name = `${command.name}_dev`; - return newCommand; - }); - await client.application?.commands.set(changedCommands, (Deno.env.get('devGuild') as string)); - } else await client.application?.commands.set(slashCommands); - console.log(`[${fileName}] ${slashCommandsLength} command${slashCommandsLength !== 1 ? 's' : ''} registered!`); -} diff --git a/src/functions/STARTUP/dbInit.ts b/src/functions/STARTUP/dbInit.ts index dfc0041..4ce2dbe 100644 --- a/src/functions/STARTUP/dbInit.ts +++ b/src/functions/STARTUP/dbInit.ts @@ -1,29 +1,27 @@ import { Sequelize } from 'sequelize'; -import { CustomClient } from '../../typings/Extensions.ts'; -import { initModels } from '../../typings/Models.ts'; +import { CustomClient } from '../../typings/Extensions.js'; -export default async function (client: CustomClient): Promise { - const env = Deno.env.toObject(); - const { DBname, DBuser, DBpassword, NODE_ENV } = env; - if (!DBname || !DBuser || !DBpassword) - throw new SyntaxError('Missing database credentials'); - const sequelize = new Sequelize(DBname, DBuser, DBpassword, { +export const name = 'database'; +export async function execute(client: CustomClient): Promise { + const { DBdatabase, DBusername, DBpassword, NODE_ENV } = process.env; + // Intentional delay to allow other startup functions to finish + await new Promise((resolve) => setTimeout(resolve, 500)); + // Login to Sequelize + const sequelize = new Sequelize(DBdatabase, DBusername, DBpassword, { dialect: 'mysql', - logging: NODE_ENV === "development" ? client.stdrr?.debug : false + logging: NODE_ENV === 'development' ? (sql, timings) => client.logs.debug({ msg: sql, timings }) : false, + benchmark: true }); - // Import models + // Load models + const loader = await import('../../typings/Models.js'); + client.models = loader.initModels(sequelize); + await sequelize + .authenticate() + .then(() => sequelize.sync()) + .then(() => client.logs.info(`F | ✓ Database connection established`)) + .catch((err) => client.logs.warn({ msg: `F | ✘ Failed to create database connection`, err })); + // Add Sequelize + client.models = sequelize.models as unknown as ReturnType; client.sequelize = sequelize; - client.models? = initModels(sequelize); - - // Test database connection & sync models - try { - await sequelize.authenticate(); - client.stdrr?.info('Connected to database'); - await sequelize.sync(); - client.stdrr?.info('Synced models with database'); - } catch (e) { - client.stdrr?.error('Failed to connect or sync database', { error: e }); - return Promise.reject(e); - } - return Promise.resolve(); + return; } diff --git a/src/functions/STARTUP/functionInit.ts b/src/functions/STARTUP/functionInit.ts deleted file mode 100644 index ebca354..0000000 --- a/src/functions/STARTUP/functionInit.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { readdirSync, statSync } from 'node:fs'; -import { CustomClient, FunctionFile } from '../../typings/Extensions.ts'; -const files: string[] = []; - -function recursiveLookup(dir: string): string[] { - readdirSync(dir).forEach((file: string) => { - const absolute = `${dir}/${file}`; - if (statSync(absolute).isDirectory()) return recursiveLookup(absolute); - files.push(absolute); - }); - return files; -} - -export const fileName = 'functionInit'; - -export default async function (client: CustomClient): Promise { - // List of files - const functionFiles: string[] = recursiveLookup('./functions').filter((f: string) => f.endsWith('.js')); - const functionLength: number = functionFiles.length; - if (functionLength <= 0) return client.stdrr?.info(`[${fileName}] No function(s) to load!`); - if (Deno.env.get('NODE_ENV')) - client.stdrr?.debug(`[${fileName}] Loading ${functionLength} function${functionLength !== 1 ? 's' : ''}...`); - - for (const [i, file] of functionFiles.entries()) { - const fileData: FunctionFile = await import(file); - const cleanName: string = file.replace(/\\|\//g, '_').replace('functions_', '').replace('.js', ''); - // "continue" skips the rest of the loop and goes to the next iteration - if (cleanName.search('archive_') !== -1) continue; - if (Deno.env.get('NODE_ENV') === 'development') - client.stdrr?.debug(`[${fileName}] ${i + 1}) Loaded: ${cleanName}!`); - client.functions?.set(cleanName, fileData); - } - client.stdrr?.info(`[${fileName}] Loaded ${functionLength} function${functionLength !== 1 ? 's' : ''}!`); -} diff --git a/src/functions/STARTUP/logs.ts b/src/functions/STARTUP/logs.ts new file mode 100644 index 0000000..cbcce68 --- /dev/null +++ b/src/functions/STARTUP/logs.ts @@ -0,0 +1,27 @@ +import { CustomClient } from '../../typings/Extensions.js'; +import { existsSync, mkdirSync, createWriteStream } from 'node:fs'; +import { stdSerializers, pino } from 'pino'; + +export const name = 'pino'; +export async function execute(client: CustomClient, _ready: boolean): Promise { + // Create logs directory at TLD if it doesn't exist + if (!existsSync('../logs')) mkdirSync('../logs'); + // Overwrite console logger with pino + client.logs = pino( + { + name: 'main', + // Warn if production, trace if development + level: process.env.NODE_ENV === 'development' ? 'trace' : 'warn', + serializers: { + // Default error serializer + err: stdSerializers.err + } + }, + // Create log file + createWriteStream(`../logs/pino-${new Date().getTime()}.log`, { + flags: 'wx' + }) + ); + // Inform user we have switched to pino + console.debug('F | ✦ Pino logger created, using that for logging'); +} diff --git a/src/functions/events/guildRemove/removeBans.ts b/src/functions/events/guildRemove/removeBans.ts new file mode 100644 index 0000000..357d9c5 --- /dev/null +++ b/src/functions/events/guildRemove/removeBans.ts @@ -0,0 +1,19 @@ +import { CustomClient } from '../../../typings/Extensions.js'; + +export const name = 'removeBans'; +export async function execute(client: CustomClient, guildId: string) { + // GDPR, remove all bans from the database + await client.models.ban.destroy({ + where: { + guildId + }, + force: true + }); + // Disable the guild + await client.models.guild.update( + { + enabled: false + }, + { where: { guildId } } + ); +} diff --git a/src/functions/events/interactionCreate/autocomplete.ts b/src/functions/events/interactionCreate/autocomplete.ts new file mode 100644 index 0000000..0edce81 --- /dev/null +++ b/src/functions/events/interactionCreate/autocomplete.ts @@ -0,0 +1,36 @@ +import { ApplicationCommandOptionChoiceData, AutocompleteInteraction } from 'discord.js'; +import { CustomClient } from '../../../typings/Extensions.js'; + +export const name = 'autocomplete'; +export async function execute(client: CustomClient, interaction: AutocompleteInteraction) { + const focus = interaction.options.getFocused(true); + const lowerVal = focus.value.toLowerCase(); + const returnValue: ApplicationCommandOptionChoiceData[] = []; + switch (focus.name) { + case 'server': { + client.guilds.cache + .filter((g) => g.name.toLowerCase().includes(lowerVal)) + .forEach((g) => returnValue.push({ name: g.name, value: g.id })); + break; + } + case 'role': { + const g = interaction.options.getString('server'); + client.guilds.cache + .get(g) + .roles.cache.filter((r) => r.name.toLowerCase().includes(lowerVal)) + .forEach((r) => returnValue.push({ name: r.name, value: r.id })); + break; + } + case 'channel': { + const g = interaction.options.getString('server'); + client.guilds.cache + .get(g) + .channels.cache.filter((c) => c.name.toLowerCase().includes(lowerVal)) + .forEach((c) => returnValue.push({ name: c.name, value: c.id })); + break; + } + } + // Trim to 25 + if (returnValue.length > 25) returnValue.length = 25; + await interaction.respond(returnValue); +} diff --git a/src/functions/events/interactionCreate/command.ts b/src/functions/events/interactionCreate/command.ts new file mode 100644 index 0000000..a4c2eca --- /dev/null +++ b/src/functions/events/interactionCreate/command.ts @@ -0,0 +1,35 @@ +import { ChatInputCommandInteraction } from 'discord.js'; +import { CustomClient } from '../../../typings/Extensions.js'; + +export const name = 'command'; +export async function execute(client: CustomClient, interaction: ChatInputCommandInteraction) { + if (!interaction.isChatInputCommand()) return; + // Use subcommand if it exists + const sc = interaction.options.getSubcommand(false); + const name = `${interaction.commandName.replace('d_', '')}${sc === null ? '' : `_${sc}`}`; + // Get command + const cmd = client.commands.get(name); + if (!cmd) return; + await interaction.deferReply({ ephemeral: cmd.ephemeral || false }); + // Check for ban + const allowedCommands = ['about', 'ping']; + const g = await client.models.guild.findOne({ where: { guildId: interaction.guildId } }); + if (!allowedCommands.includes(name) && g && g.banned === true) { + interaction.editReply({ + embeds: [ + { + color: 0xff0000, + description: 'This server has been banned from using the bot' + } + ] + }); + return; + } + // Run command + try { + cmd.run(client, interaction, interaction.options); + } catch (err) { + interaction.editReply({ content: 'Something went wrong while replying! This error has been logged' }); + client.logs.error({ msg: `E | ✘ ${name}`, err }); + } +} diff --git a/src/functions/events/interactionCreate/component.ts b/src/functions/events/interactionCreate/component.ts new file mode 100644 index 0000000..ef9f44c --- /dev/null +++ b/src/functions/events/interactionCreate/component.ts @@ -0,0 +1,19 @@ +import { Message, MessageComponentInteraction } from 'discord.js'; +import { CustomClient } from '../../../typings/Extensions.js'; + +function messageEqual(m1: Message, m2: Message) { + return m1.content === m2.content && m1.embeds === m2.embeds && m1.components === m2.components; +} + +export const name = 'component'; +export async function execute(_client: CustomClient, interaction: MessageComponentInteraction) { + // Store the state of message and compare it 1s later + const m = Object.assign({}, interaction.message); + await new Promise((resolve) => setTimeout(resolve, 2000)); + if (!messageEqual(m, interaction.message)) return; + // Remove components and mark expired + interaction.message.edit({ + components: [], + content: `This embed has timed out. Please run the command again` + }); +} diff --git a/src/functions/events/ready/commands.ts b/src/functions/events/ready/commands.ts new file mode 100644 index 0000000..4d19cb5 --- /dev/null +++ b/src/functions/events/ready/commands.ts @@ -0,0 +1,47 @@ +import { SlashCommandBuilder } from 'discord.js'; +import { readdirSync } from 'node:fs'; +import { CommandFile, CustomClient } from '../../../typings/Extensions.js'; + +export const name = 'commands'; +export async function execute(client: CustomClient): Promise { + const { NODE_ENV, devGuild } = process.env; + // Get all files in the commands directory + const files = readdirSync('./commands', { recursive: true }) + // Map Buffers to string + .map((f) => String(f)) + // Trim directory + .map((f) => f.replace('./commands/', '')) + // Remove Windows backslashes + .map((f) => f.replace('\\', '/')) + // Filter out non-JS files + .filter((f) => f.endsWith('.js')); + // For each file, load the command + const cmds: ReturnType[] = []; + client.logs.debug(`F | ✦ Expecting ${files.length} command files`); + for (const file of files) { + try { + const command: CommandFile = await import(`../../../commands/${file}`); + // Rewrite cmd name if development and push if found + if (command.data && NODE_ENV === 'development') command.data.setName(`d_${command.data.name}`); + if (command.data) cmds.push(command.data.toJSON()); + const n = file.replace(/\.js$/, '').replace(/\//g, '_'); + client.commands.set(n, command); + client.logs.info(`F | ✓ ${n}`); + } catch (err) { + client.logs.error({ msg: `F | ✘ ${file}`, err }); + } + } + // Register the commands + if (NODE_ENV === 'development') { + // Testing server if development + client.guilds + .fetch(devGuild) + .then((g) => g.commands.set(cmds)) + .catch(() => null); + } else { + // Global if production + await client.application.commands.set(cmds); + } + client.logs.debug(`F | ✦ Registered ${cmds.length} commands`); + return; +} diff --git a/src/functions/load.ts b/src/functions/load.ts new file mode 100644 index 0000000..068b26d --- /dev/null +++ b/src/functions/load.ts @@ -0,0 +1,53 @@ +import { existsSync, readdirSync } from 'node:fs'; +import { CustomClient, FunctionFile } from '../typings/Extensions.js'; + +// This loads all functions +export async function run(client: CustomClient): Promise { + // Check for functions folder + if (!existsSync('./functions')) { + console.warn('F | ! No functions were found! Make sure you are running index.js from the dist directory'); + return; + } + client.logs.debug('F | ✦ Loading all functions'); + // Initialise variable + const functionFiles: { [key: string]: string[] } = {}; + // Read the directory + const types: string[] = readdirSync('./functions').filter((f: string) => !f.endsWith('.js')); + // For each type, load the files + for (const type of types) { + functionFiles[type] = readdirSync(`./functions/${type}`, { recursive: true }) + // Map Buffers to string + .map((f: unknown) => String(f)) + // Trim directory + .map((f: string) => f.replace(`./functions/${type}/`, '')) + // Remove Windows backslashes + .map((f: string) => f.replace('\\', '/')) + // Filter out non-JS files + .filter((f: string) => f.endsWith('.js')); + } + // Load the functions + const functions = new Map(); + for (const [type, files] of Object.entries(functionFiles)) { + client.logs.debug(`F | ✦ Found ${files.length} ${type} function`); + // Set the file + for (const file of files) { + try { + const f: FunctionFile = await import(`../functions/${type}/${file}`); + const n = file.replace(/\.js$/, '').replace(/\//g, '_'); + // Skip if it's an archive + if (n.includes('archive_')) continue; + functions.set(type + '_' + n, f); + client.logs.debug(`F | ✓ ${n}`); + } catch (err) { + client.logs.error({ msg: `F | ✗ ${file}`, err }); + } + } + } + // Attach the functions + client.functions = functions; + client.ready = true; + // Return void + return; +} + +// if name has archive_, drop it diff --git a/src/functions/utils/masterMessage.ts b/src/functions/utils/masterMessage.ts new file mode 100644 index 0000000..8aba010 --- /dev/null +++ b/src/functions/utils/masterMessage.ts @@ -0,0 +1,54 @@ +import { EmbedBuilder, Guild } from 'discord.js'; +import { CustomClient, MessageType } from '../../typings/Extensions.js'; + +export const name = 'masterMessage'; +export async function execute( + client: CustomClient, + type: MessageType, + msg: string, + targetUser?: string +): Promise { + const embed = new EmbedBuilder().setDescription(msg).setColor(type); + switch (type) { + case MessageType.Broadcast: + embed.setTitle('Maintainer Broadcast'); + break; + case MessageType.UserBanned: + embed.setTitle('User in This Server Banned'); + break; + case MessageType.UserWarned: + embed.setTitle('User in This Server Warned'); + break; + case MessageType.Maintenance: + embed.setTitle('Maintenance Notice'); + break; + case MessageType.SecurityAlert: + embed.setTitle('** Security Alert **'); + break; + case MessageType.Other: + embed.setTitle('General Notice'); + break; + } + const servers: Guild[] = []; + if (type === MessageType.UserBanned || type === MessageType.UserWarned) { + // Find affected guilds + client.guilds.cache.each((g) => + g.members + .fetch(targetUser) + .then(() => servers.push(g)) + .catch(() => undefined) + ); + } else { + // Send to all servers + client.guilds.cache.each((g) => servers.push(g)); + } + // Check guilds for active status and send to participating ones + servers.forEach(async (g) => { + const s = await client.models.guild.findOne({ where: { guildId: g.id } }); + if (!s || !s.enabled) return; // The server's not participating or inactive + // Send message + const c = await g.channels.fetch(s.settings.channel); + if (!c || !c.isTextBased()) return; // Channel not found + c.send({ embeds: [embed] }); + }); +} diff --git a/src/functions/utils/pagination.ts b/src/functions/utils/pagination.ts new file mode 100644 index 0000000..bb68f52 --- /dev/null +++ b/src/functions/utils/pagination.ts @@ -0,0 +1,127 @@ +import { + ActionRowBuilder, + ButtonBuilder, + ButtonInteraction, + ButtonStyle, + ChatInputCommandInteraction, + EmbedBuilder, + SelectMenuComponentOptionData, + StringSelectMenuBuilder, + StringSelectMenuInteraction +} from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; + +export const name = 'pagination'; +export async function execute( + _client: CustomClient, + interaction: ChatInputCommandInteraction, + categories: { [key: string]: EmbedBuilder[] }, + options: SelectMenuComponentOptionData[] +): Promise { + /** @desc Current category's embeds */ + let embeds: EmbedBuilder[] = []; + /** @desc Current page index */ + let page = 0; + options.push({ + label: 'Cancel', + value: 'cancel', + description: 'Cancel the command', + emoji: '❌' + }); + const selectorRow: ActionRowBuilder = new ActionRowBuilder({ + components: [ + new StringSelectMenuBuilder({ + customId: 'profile-category', + placeholder: 'Select a category to review', + options, + min_values: 1, + max_values: 1 + }) + ] + }); + const paginationRow: ActionRowBuilder = new ActionRowBuilder({ + components: [ + new ButtonBuilder({ customId: 'previous', label: '◀️', style: ButtonStyle.Primary }), + new ButtonBuilder({ customId: 'cancel', label: '🟥', style: ButtonStyle.Danger }), + new ButtonBuilder({ customId: 'next', label: '▶️', style: ButtonStyle.Primary }) + ] + }); + + //#region Pagination + const coll = await interaction + .editReply({ embeds: [categories.overview[0]], components: [selectorRow] }) + .then((m) => m.createMessageComponentCollector({ filter: (i) => i.user.id === interaction.user.id, time: 180_000 })) + .catch(() => null); + + if (!coll) { + interaction.editReply({ content: 'Something went wrong. Please try again later.', components: [] }); + return; + } + coll.on('collect', (i: ButtonInteraction | StringSelectMenuInteraction) => { + const selectors: ActionRowBuilder[] = [selectorRow]; + // If they select the menu, switch category + if (i.isStringSelectMenu()) { + // If they cancel, stop the collector + if (i.values[0] === 'cancel') return coll.stop(); + // Get the category + embeds = categories[i.values[0]]; + // New category, so page #0 + page = 0; + // If the length is greater than 2, add pagination row + if (embeds.length > 1) selectors.unshift(paginationRow); + // Update the message + i.update({ embeds: [embeds[page]], components: selectors }); + return; + } + // Pagination row + switch (i.customId) { + // Cancel + case 'cancel': { + coll.stop(); + break; + } + // Previous + case 'previous': { + page = page - 1; + // If the page is less than 0, set it to the last page + if (page < 0) page = embeds.length - 1; + // If the length is greater than the length, add pagination row + if (embeds.length > 1) selectors.unshift(paginationRow); + // Update the message + i.update({ embeds: [embeds[page]], components: selectors }); + break; + } + // Next + case 'next': { + page = page + 1; + // If the page is greater than the length, set it to the first page + if (page > embeds.length - 1) page = 0; + // If the length is greater than 2, add pagination row + if (embeds.length > 1) selectors.unshift(paginationRow); + // Update the message + i.update({ embeds: [embeds[page]], components: selectors }); + break; + } + // Theoretically impossible to reach + default: { + i.update({ + content: "You shouldn't be seeing this! Report this to an Engineer\n\n**CUSTOMID**: " + i.customId, + embeds: [], + components: [] + }); + } + } + }); + coll.on('end', () => { + interaction + .fetchReply() + .then((m) => + m.edit({ + content: `This embed has timed out. Please run the command again: `, + components: [] + }) + ) + .catch(() => null); + }); + //#endregion +} diff --git a/src/index.ts b/src/index.ts index 84f505e..589f7f0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,18 +1,12 @@ //#region Packages -import { Client, IntentsBitField, Collection } from 'discord.js'; -import { CustomClient } from './typings/Extensions.ts'; -import { default as bunyan, createLogger } from 'bunyan'; -import { readdirSync } from 'node:fs'; -const stdrr: bunyan = createLogger({ - name: 'main', - stream: Deno.stdout -}); +import { Client, Collection, IntentsBitField, InteractionType } from 'discord.js'; +import { CustomClient } from './typings/Extensions.js'; // Log developer mode -if (Deno.env.get('NODE_ENV') === 'development') stdrr.debug('Starting in development mode'); +if (process.env.NODE_ENV === 'development') console.debug('Starting in development mode'); //#endregion //#region Discord init -const client: CustomClient = new Client({ +const client: CustomClient = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMembers, @@ -22,21 +16,43 @@ const client: CustomClient = new Client({ IntentsBitField.Flags.DirectMessages ] }); -client.stdrr = stdrr; +client.logs = console; +await import('./functions/load.js').then((f) => f.run(client)).catch((e) => client.logs.error(e)); +Array.from(client.functions.keys()) + .filter((f) => f.startsWith('startup_')) + .forEach((f) => client.functions.get(f).execute(client)); //#endregion //#region Variables client.commands = new Collection(); - //#endregion //#region Discord events client.on('ready', () => { - stdrr.info(`Logged in as ${client.user?.tag}!`); - // Functions - readdirSync('./functions/READY').forEach(async (file: string) => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - (await import(`./functions/READY/${file}`))(client); - }); + client.logs.info(`Logged in as ${client.user.tag}!`); + // Run all ready functions + Array.from(client.functions.keys()) + .filter((f) => f.startsWith('events_ready')) + .forEach((f) => client.functions.get(f).execute(client)); }); -client.login(Deno.env.get('DCtoken')); + +client.on('interactionCreate', async (interaction) => { + let func: string; + switch (interaction.type) { + case InteractionType.ApplicationCommand: { + func = 'command'; + break; + } + case InteractionType.MessageComponent: { + func = 'component'; + break; + } + case InteractionType.ApplicationCommandAutocomplete: { + func = 'autocomplete'; + break; + } + } + // Run all interaction functions + client.functions.get(`events_interactionCreate_${func}`).execute(client, interaction); +}); + +client.login(process.env.DCtoken); //#endregion -//#region Error handling diff --git a/src/typings/Bitfield.d.ts b/src/typings/Bitfield.d.ts new file mode 100644 index 0000000..aa78746 --- /dev/null +++ b/src/typings/Bitfield.d.ts @@ -0,0 +1,36 @@ +import { BitFieldResolvable } from 'discord.js'; +import { StaffFlags } from './StaffFlags'; + +export class BitField { + public constructor(bits?: BitFieldResolvable); + public bitfield: N; + public add(...bits: BitFieldResolvable[]): BitField; + public any(bit: BitFieldResolvable): boolean; + public equals(bit: BitFieldResolvable): boolean; + public freeze(): Readonly>; + public has(bit: BitFieldResolvable): boolean; + public missing(bits: BitFieldResolvable, ...hasParams: readonly unknown[]): S[]; + public remove(...bits: BitFieldResolvable[]): BitField; + public serialize(...hasParams: readonly unknown[]): Record; + public toArray(...hasParams: readonly unknown[]): S[]; + public toJSON(): N extends number ? number : string; + public valueOf(): N; + public [Symbol.iterator](): IterableIterator; + public static Flags: EnumLike; + public static resolve(bit?: BitFieldResolvable): number | bigint; +} +export type StaffFlagsString = keyof typeof StaffFlags; +export type StaffFlagResolvable = BitFieldResolvable; +export class StaffFlagsBitField extends BitField { + public any(StaffFlag: StaffFlagResolvable, checkAdmin?: boolean): boolean; + public has(StaffFlag: StaffFlagResolvable, checkAdmin?: boolean): boolean; + public missing(bits: BitFieldResolvable, checkAdmin?: boolean): StaffFlagsString[]; + public serialize(checkAdmin?: boolean): Record; + public toArray(): StaffFlagsString[]; + + public static All: bigint; + public static Default: bigint; + public static StageModerator: bigint; + public static Flags: typeof StaffFlagBits; + public static resolve(StaffFlag?: StaffFlagResolvable): bigint; +} diff --git a/src/typings/Bitfield.js b/src/typings/Bitfield.js new file mode 100644 index 0000000..9372448 --- /dev/null +++ b/src/typings/Bitfield.js @@ -0,0 +1,250 @@ +import { DiscordjsErrorCodes, DiscordjsRangeError } from 'discord.js'; +import { StaffFlags } from './StaffFlags.js'; + +/** + * Data structure that makes it easy to interact with a bitfield. + */ +class BitField { + /** + * Numeric bitfield flags. + * Defined in extension classes + * @type {Object} + * @memberof BitField + * @abstract + */ + static Flags = {}; + + /** + * @type {number|bigint} + * @memberof BitField + * @private + */ + static DefaultBit = 0; + + /** + * @param {BitFieldResolvable} [bits=this.constructor.DefaultBit] Bit(s) to read from + */ + constructor(bits = this.constructor.DefaultBit) { + /** + * Bitfield of the packed bits + * @type {number|bigint} + */ + this.bitfield = this.constructor.resolve(bits); + } + + /** + * Checks whether the bitfield has a bit, or any of multiple bits. + * @param {BitFieldResolvable} bit Bit(s) to check for + * @returns {boolean} + */ + any(bit) { + return (this.bitfield & this.constructor.resolve(bit)) !== this.constructor.DefaultBit; + } + + /** + * Checks if this bitfield equals another + * @param {BitFieldResolvable} bit Bit(s) to check for + * @returns {boolean} + */ + equals(bit) { + return this.bitfield === this.constructor.resolve(bit); + } + + /** + * Checks whether the bitfield has a bit, or multiple bits. + * @param {BitFieldResolvable} bit Bit(s) to check for + * @returns {boolean} + */ + has(bit) { + bit = this.constructor.resolve(bit); + return (this.bitfield & bit) === bit; + } + + /** + * Gets all given bits that are missing from the bitfield. + * @param {BitFieldResolvable} bits Bit(s) to check for + * @param {...*} hasParams Additional parameters for the has method, if any + * @returns {string[]} + */ + missing(bits, ...hasParams) { + return new this.constructor(bits).remove(this).toArray(...hasParams); + } + + /** + * Freezes these bits, making them immutable. + * @returns {Readonly} + */ + freeze() { + return Object.freeze(this); + } + + /** + * Adds bits to these ones. + * @param {...BitFieldResolvable} [bits] Bits to add + * @returns {BitField} These bits or new BitField if the instance is frozen. + */ + add(...bits) { + let total = this.constructor.DefaultBit; + for (const bit of bits) { + total |= this.constructor.resolve(bit); + } + if (Object.isFrozen(this)) return new this.constructor(this.bitfield | total); + this.bitfield |= total; + return this; + } + + /** + * Removes bits from these. + * @param {...BitFieldResolvable} [bits] Bits to remove + * @returns {BitField} These bits or new BitField if the instance is frozen. + */ + remove(...bits) { + let total = this.constructor.DefaultBit; + for (const bit of bits) { + total |= this.constructor.resolve(bit); + } + if (Object.isFrozen(this)) return new this.constructor(this.bitfield & ~total); + this.bitfield &= ~total; + return this; + } + + /** + * Gets an object mapping field names to a {@link boolean} indicating whether the + * bit is available. + * @param {...*} hasParams Additional parameters for the has method, if any + * @returns {Object} + */ + serialize(...hasParams) { + const serialized = {}; + for (const [flag, bit] of Object.entries(this.constructor.Flags)) { + if (isNaN(flag)) serialized[flag] = this.has(bit, ...hasParams); + } + return serialized; + } + + /** + * Gets an {@link Array} of bitfield names based on the bits available. + * @param {...*} hasParams Additional parameters for the has method, if any + * @returns {string[]} + */ + toArray(...hasParams) { + return [...this[Symbol.iterator](...hasParams)]; + } + + toJSON() { + return typeof this.bitfield === 'number' ? this.bitfield : this.bitfield.toString(); + } + + valueOf() { + return this.bitfield; + } + + *[Symbol.iterator](...hasParams) { + for (const bitName of Object.keys(this.constructor.Flags)) { + if (isNaN(bitName) && this.has(bitName, ...hasParams)) yield bitName; + } + } + + /** + * Data that can be resolved to give a bitfield. This can be: + * * A bit number (this can be a number literal or a value taken from {@link BitField.Flags}) + * * A string bit number + * * An instance of BitField + * * An Array of BitFieldResolvable + * @typedef {number|string|bigint|BitField|BitFieldResolvable[]} BitFieldResolvable + */ + + /** + * Resolves bitfields to their numeric form. + * @param {BitFieldResolvable} [bit] bit(s) to resolve + * @returns {number|bigint} + */ + static resolve(bit) { + const { DefaultBit } = this; + if (typeof DefaultBit === typeof bit && bit >= DefaultBit) return bit; + if (bit instanceof BitField) return bit.bitfield; + if (Array.isArray(bit)) return bit.map((p) => this.resolve(p)).reduce((prev, p) => prev | p, DefaultBit); + if (typeof bit === 'string') { + if (!isNaN(bit)) return typeof DefaultBit === 'bigint' ? BigInt(bit) : Number(bit); + if (this.Flags[bit] !== undefined) return this.Flags[bit]; + } + throw new DiscordjsRangeError(DiscordjsErrorCodes.BitFieldInvalid, bit); + } +} + +/** + * Data structure that makes it easy to interact with a user flag bitfield. + * @extends {BitField} + */ +export class StaffFlagsBitField extends BitField { + /** + * Numeric user flags. + * @memberof StaffFlagsBitField + */ + static Flags = StaffFlags; + + /** + * Bitfield representing every flag combined + * @type {bigint} + * @memberof StaffFlagsBitField + */ + static All = Object.values(this.Flags).reduce((all, p) => all | p, 0n); + + /** + * Bitfield representing the default user flags for staff members + * @type {bigint} + * @memberof StaffFlagsBitField + */ + static Default = BigInt(0); + + /** + * @type {bigint} + * @memberof StaffFlagsBitField + * @private + */ + static DefaultBit = BigInt(0); + + /** + * Bitfield of the packed bits + * @type {bigint} + * @name StaffFlagsBitField#bitfield + */ + + /** + * Gets all given bits that are missing from the bitfield. + * @param {BitFieldResolvable[]} bits Bit(s) to check for + * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override + * @returns {string[]} + */ + missing(bits, checkAdmin = true) { + return checkAdmin && super.has(StaffFlags.Maintainer) ? [] : super.missing(bits, null); + } + + /** + * Checks whether the bitfield has a flag, or any of multiple flags. + * @param {BitFieldResolvable} flag Flag(s) to check for + * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override + * @returns {boolean} + */ + any(flag, checkAdmin = true) { + return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.any(flag); + } + + /** + * Checks whether the bitfield has a flag, or multiple flags. + * @param {BitFieldResolvable} flag Flag(s) to check for + * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override + * @returns {boolean} + */ + has(flag, checkAdmin = true) { + return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.has(flag); + } + + /** + * Gets an {@link Array} of bitfield names based on the flags available. + * @returns {string[]} + */ + toArray() { + return super.toArray(false); + } +} diff --git a/src/typings/Bitfield.ts b/src/typings/Bitfield.ts deleted file mode 100644 index 6504d69..0000000 --- a/src/typings/Bitfield.ts +++ /dev/null @@ -1,205 +0,0 @@ -/** - * Data that can be resolved to give a bitfield. This can be: - * * A bit number (this can be a number literal or a value taken from {@link BitField.Flags}) - * * A string bit number - * * An instance of BitField - * * An Array of BitFieldResolvable - */ -export type BitFieldResolvable = - | bigint - | string - | BitField - | BitFieldResolvable[]; - -/** - * Data structure that makes it easy to interact with a bitfield. - * @class - - */ -class BitField { - /** - * Numeric bitfield of the packed bits - * @type {bigint} - */ - bitfield: bigint; - - /** - * Numeric bitfield flags. - * Defined in extension classes - * @type {Object} - * @memberof BitField - * @abstract - */ - static Flags = {}; - - /** - * @type {bigint} - * @memberof BitField - * @private - */ - static DefaultBit = BigInt(0); - - /** - * @param {BitFieldResolvable} [bits] Bit(s) to read from - */ - constructor(bits: BitFieldResolvable) { - /** - * Bitfield of the packed bits - * @type {number|bigint} - */ - if (!bits) bits = (this.constructor as typeof BitField).DefaultBit; - this.bitfield = (this.constructor as typeof BitField).resolve(bits); - } - - /** - * Checks whether the bitfield has a bit, or any of multiple bits. - * @param {BitFieldResolvable} bit Bit(s) to check for - * @returns {boolean} - */ - any(bit: BitFieldResolvable) { - return ( - (this.bitfield & (this.constructor as typeof BitField).resolve(bit)) !== - (this.constructor as typeof BitField).DefaultBit - ); - } - - /** - * Checks if this bitfield equals another - * @param {BitFieldResolvable} bit Bit(s) to check for - * @returns {boolean} - */ - equals(bit: BitFieldResolvable) { - return this.bitfield === (this.constructor as typeof BitField).resolve(bit); - } - - /** - * Checks whether the bitfield has a bit, or multiple bits. - * @param {BitFieldResolvable} bit Bit(s) to check for - * @returns {boolean} - */ - has(bit: BitFieldResolvable) { - bit = (this.constructor as typeof BitField).resolve(bit); - return (this.bitfield & bit) === bit; - } - - /** - * Gets all given bits that are missing from the bitfield. - * @param {BitFieldResolvable} bits Bit(s) to check for - * @param {...*} hasParams Additional parameters for the has method, if any - * @returns {string[]} - */ - missing(bits: BitFieldResolvable, ...hasParams: [unknown]) { - return new (this.constructor as typeof BitField)(bits) - .remove(this) - .toArray(...hasParams); - } - - /** - * Freezes these bits, making them immutable. - * @returns {Readonly} - */ - freeze() { - return Object.freeze(this); - } - - /** - * Adds bits to these ones. - * @param {...BitFieldResolvable[]} [bits] Bits to add - * @returns {BitField} These bits or new BitField if the instance is frozen. - */ - add(...bits: BitFieldResolvable[]) { - let total = (this.constructor as typeof BitField).DefaultBit; - for (const bit of bits) { - total |= (this.constructor as typeof BitField).resolve(bit); - } - if (Object.isFrozen(this)) - return new (this.constructor as typeof BitField)(this.bitfield | total); - this.bitfield |= total; - return this; - } - - /** - * Removes bits from these. - * @param {...BitFieldResolvable} [bits] Bits to remove - * @returns {BitField} These bits or new BitField if the instance is frozen. - */ - remove(...bits: BitFieldResolvable[]) { - let total = (this.constructor as typeof BitField).DefaultBit; - for (const bit of bits) { - total |= (this.constructor as typeof BitField).resolve(bit); - } - if (Object.isFrozen(this)) - return new (this.constructor as typeof BitField)(this.bitfield & ~total); - this.bitfield &= ~total; - return this; - } - - /** - * Gets an object mapping field names to a {@link boolean} indicating whether the - * bit is available. - * @returns {Object} - */ - serialize() { - const serialized = {}; - for (const [flag, bit] of Object.entries( - (this.constructor as typeof BitField).Flags - )) - serialized[flag] = this.has(bit); - return serialized; - } - - /** - * Gets an {@link Array} of bitfield names based on the bits available. - * @param {...*} hasParams Additional parameters for the has method, if any - * @returns {string[]} - */ - toArray(...hasParams: [unknown]) { - return [...this[Symbol.iterator](...hasParams)]; - } - - toJSON() { - return typeof this.bitfield === "number" - ? this.bitfield - : this.bitfield.toString(); - } - - valueOf() { - return this.bitfield; - } - - *[Symbol.iterator](...hasParams: [unknown]) { - for (const bitName of Object.keys( - (this.constructor as typeof BitField).Flags - )) { - // @ts-expect-error Implemented for classes extending BitField - if (this.has(bitName, ...hasParams)) yield bitName; - } - } - - /** - * Resolves bitfields to their numeric form. - * @param {BitFieldResolvable} [bit] bit(s) to resolve - * @returns {bigint} - */ - static resolve(bit: BitFieldResolvable): bigint { - const { DefaultBit } = this; - if (typeof bit === "undefined") return DefaultBit; - if (typeof bit === "number") bit = BigInt(bit); - if (typeof DefaultBit === typeof bit && (bit as bigint) >= DefaultBit) - return bit as bigint; - if (bit instanceof BitField) return bit.bitfield; - if (Array.isArray(bit)) - return bit - .map((p) => this.resolve(p)) - .reduce((prev, p) => prev | p, DefaultBit); - if (typeof bit === "string") { - if (typeof this.Flags[bit] !== "undefined") return this.Flags[bit]; - const resolved = BigInt(bit); - if (typeof DefaultBit === typeof resolved && resolved >= DefaultBit) - return resolved; - } - throw new RangeError("Invalid BitField " + bit); - } -} - -export { BitField }; diff --git a/src/typings/Extensions.ts b/src/typings/Extensions.ts index 48bef3b..0ac8ebc 100644 --- a/src/typings/Extensions.ts +++ b/src/typings/Extensions.ts @@ -1,30 +1,70 @@ -import { Client, Collection, CommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { Alias, Ban, Guild, User, Warn } from './Models.ts'; +import { ChatInputCommandInteraction, Client, SlashCommandBuilder } from 'discord.js'; +import { Logger } from 'pino'; import { Sequelize } from 'sequelize'; -import Logger from 'bunyan'; +import { initModels } from './Models.js'; -export interface CustomClient extends Client { - env?: { [key: string]: string }; - commands?: Collection; - functions?: Collection; +export interface CustomClient extends Client { + /** @desc Commands for the bot to handle */ + commands?: Map; + /** @desc Functions dynamically imported */ + functions?: Map; + /** @desc Sequelize instance */ sequelize?: Sequelize; - models?: { - Alias: typeof Alias; - Ban: typeof Ban; - Guild: typeof Guild; - User: typeof User; - Warn: typeof Warn; - }; - stdrr?: Logger; + /** @desc Sequelize models for the database */ + models?: ReturnType; + /** @desc Whether the bot is ready to accept commands */ + ready?: boolean; + /** @desc Logging ({@link Ready} determines type: true is {@link Logger}, false is {@link Console}) */ + logs?: Ready extends true ? Logger : Console; } - -export interface SlashCommandFile { +// Various types of file that will be imported +export interface CommandFile { name: string; - data: SlashCommandBuilder; - run: (client: Client, interaction: CommandInteraction, options: CommandInteraction['options']) => Promise; + ephemeral?: boolean; + data?: SlashCommandBuilder; + run: ( + client: CustomClient, + interaction: ChatInputCommandInteraction, + options: ChatInputCommandInteraction['options'] + ) => Promise; } - export interface FunctionFile { name: string; - run: (...args: unknown[]) => Promise; + execute: (client: CustomClient, ...args: unknown[]) => Promise; +} + +export enum FlagEmoji { + ActiveDeveloper = '<:DB_ActiveDeveloper:1118377588063227964>', + BugHunterLevel1 = '<:DB_BugHunterL1:1118377590521081908>', + BugHunterLevel2 = '<:DB_BugHunterL2:1118377591754194988>', + CertifiedModerator = '<:DB_ModeratorProgramAlumni:1118377602671972424>', + Hypesquad = '<:DB_HypesquadEvents:1118377600876822590>', + HypeSquadOnlineHouse1 = '<:DB_HypesquadBravery:1118377597823365191>', + HypeSquadOnlineHouse2 = '<:DB_HypesquadBrilliance:1118377599702401126>', + HypeSquadOnlineHouse3 = '<:DB_HypesquadBalance:1118377596640567366>', + Nitro = '<:DB_Nitro:1118377784310509578>', + Quarantined = '<:DB_Quarantine:1118377861984813177>', + Spammer = '<:DB_Spammer:1118377609030533160>', + Staff = '<:DB_Staff:1118377789716955176>', + Partner = '<:DB_Partner:1118377786478960711>', + Pomelo = '<:DB_Pomelo:1118377605935140934>', + PremiumEarlySupporter = '<:DB_EarlySupporter:1118377593176076378>', + VerifiedBot = '<:DB_VerifiedBot:1118377792652980224>', + VerifiedDeveloper = '<:DB_VerifiedDeveloper:1118377595277418576>' +} + +/** @desc Messages to be sent to the masterMessage function */ +export enum MessageType { + /** @desc Broadcast from Maintainer+ */ + Broadcast = 0x6699ff, + /** @desc User banned alert */ + UserBanned = 0xff0000, + /** @desc User warned alert */ + UserWarned = 0xff9933, + /** @desc Maintenance warning */ + Maintenance = 0x77b300, + /** @desc Security alert */ + SecurityAlert = 0xff00ff, + /** @desc Other - All servers */ + Other = 0xffffff } diff --git a/src/typings/Models.ts b/src/typings/Models.ts index bf8f2d2..f39fb1b 100644 --- a/src/typings/Models.ts +++ b/src/typings/Models.ts @@ -1,37 +1,16 @@ -import type { Sequelize } from "sequelize"; -import { alias as _alias } from "../database/models/alias.ts"; -import type { - aliasAttributes, - aliasCreationAttributes -} from "../database/models/alias.ts"; -import { ban as _ban } from "../database/models/ban.ts"; -import type { - banAttributes, - banCreationAttributes -} from "../database/models/ban.ts"; -import { guild as _guild } from "../database/models/guild.ts"; -import type { - guildAttributes, - guildCreationAttributes -} from "../database/models/guild.ts"; -import { user as _user } from "../database/models/user.ts"; -import type { - userAttributes, - userCreationAttributes -} from "../database/models/user.ts"; -import { warn as _warn } from "../database/models/warn.ts"; -import type { - warnAttributes, - warnCreationAttributes -} from "../database/models/warn.ts"; +import type { Sequelize } from 'sequelize'; +import type { aliasAttributes, aliasCreationAttributes } from '../database/models/alias.js'; +import { alias as _alias } from '../database/models/alias.js'; +import type { banAttributes, banCreationAttributes } from '../database/models/ban.js'; +import { ban as _ban } from '../database/models/ban.js'; +import type { guildAttributes, guildCreationAttributes } from '../database/models/guild.js'; +import { guild as _guild } from '../database/models/guild.js'; +import type { userAttributes, userCreationAttributes } from '../database/models/user.js'; +import { user as _user } from '../database/models/user.js'; +import type { warnAttributes, warnCreationAttributes } from '../database/models/warn.js'; +import { warn as _warn } from '../database/models/warn.js'; -export { - _alias as Alias, - _ban as Ban, - _guild as Guild, - _user as User, - _warn as Warn -}; +export { _alias as Alias, _ban as Ban, _guild as Guild, _user as User, _warn as Warn }; export type { aliasAttributes as AliasAttributes, @@ -53,18 +32,18 @@ export function initModels(sequelize: Sequelize) { const user = _user.initModel(sequelize); const warn = _warn.initModel(sequelize); - ban.belongsTo(guild, { as: "guild", foreignKey: "guildId" }); - guild.hasMany(ban, { as: "bans", foreignKey: "guildId" }); - warn.belongsTo(guild, { as: "guild", foreignKey: "guildId" }); - guild.hasMany(warn, { as: "warns", foreignKey: "guildId" }); - alias.belongsTo(user, { as: "moderator_user", foreignKey: "moderator" }); - user.hasMany(alias, { as: "aliases", foreignKey: "moderator" }); + ban.belongsTo(guild, { as: 'guild', foreignKey: 'guildId' }); + guild.hasMany(ban, { as: 'bans', foreignKey: 'guildId' }); + warn.belongsTo(guild, { as: 'guild', foreignKey: 'guildId' }); + guild.hasMany(warn, { as: 'warns', foreignKey: 'guildId' }); + alias.belongsTo(user, { as: 'moderator_user', foreignKey: 'moderator' }); + user.hasMany(alias, { as: 'aliases', foreignKey: 'moderator' }); return { - Alias: alias, - Ban: ban, - Guild: guild, - User: user, - Warn: warn + alias, + ban, + guild, + user, + warn }; } diff --git a/src/typings/StaffFlagsBitField.ts b/src/typings/StaffFlagsBitField.ts deleted file mode 100644 index 2303ee6..0000000 --- a/src/typings/StaffFlagsBitField.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { StaffFlags } from './StaffFlags.ts'; -import { BitField, BitFieldResolvable } from './Bitfield.ts'; - -/** - * Data structure that makes it easy to interact with a user flag bitfield. - * @extends {BitField} - */ -class StaffFlagsBitField extends BitField { - /** - * Numeric user flags. - * @type {StaffFlags} - * @memberof StaffFlagsBitField - */ - static Flags = StaffFlags; - - /** - * Bitfield representing every flag combined - * @type {bigint} - * @memberof StaffFlagsBitField - */ - static All = Object.values(this.Flags) - .filter((v) => typeof v !== 'string') - .reduce((all, p) => BigInt(all) | BigInt(p), BigInt(0)); - - /** - * Bitfield representing the default user flags for staff members - * @type {bigint} - * @memberof StaffFlagsBitField - */ - static Default = BigInt(0); - - /** - * @type {bigint} - * @memberof StaffFlagsBitField - * @private - */ - static DefaultBit = BigInt(0); - - /** - * Bitfield of the packed bits - * @type {bigint} - * @name StaffFlagsBitField#bitfield - */ - - /** - * @param {BitFieldResolvable} [bits] Bit(s) to read from - */ - constructor(bits: BitFieldResolvable) { - super(bits) - } - - /** - * Gets all given bits that are missing from the bitfield. - * @param {BitFieldResolvable[]} bits Bit(s) to check for - * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override - * @returns {string[]} - */ - missing(bits: BitFieldResolvable[], checkAdmin = true): string[] { - return checkAdmin && super.has(StaffFlags.Maintainer) ? [] : super.missing(bits, null); - } - - /** - * Checks whether the bitfield has a flag, or any of multiple flags. - * @param {BitFieldResolvable} flag Flag(s) to check for - * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override - * @returns {boolean} - */ - any(flag: BitFieldResolvable, checkAdmin = true): boolean { - return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.any(flag); - } - - /** - * Checks whether the bitfield has a flag, or multiple flags. - * @param {BitFieldResolvable} flag Flag(s) to check for - * @param {boolean} [checkAdmin=true] Whether to allow the maintainer flag to override - * @returns {boolean} - */ - has(flag: BitFieldResolvable, checkAdmin = true): boolean { - return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.has(flag); - } - - /** - * Gets an {@link Array} of bitfield names based on the flags available. - * @returns {string[]} - */ - toArray(): string[] { - return super.toArray(false); - } -} - -export default StaffFlagsBitField; diff --git a/testdata.json b/testdata.json deleted file mode 100644 index 6408af9..0000000 --- a/testdata.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "user": { - "id": "887318735197720596", - "username": "Arosaybleye", - "global_name": "Aro Arosay", - "avatar": "bc07e09e3b38b0f719ac5ba9698802b4", - "discriminator": "0001", - "public_flags": 0, - "flags": 0, - "banner": "a_2646a1d05697dc3e4eb4a1ec8cd97286", - "banner_color": "#7e0909", - "accent_color": 8259849, - "bio": "\ud83d\udc99 Filled with *INTEGRITY* a <:aroace_flag:1108526292447543318> who just wants to hang around with friends talking hobbies\n\ud83d\udfe2Up to chat and stuff\n\ud83c\udf19PREFER to be left alone\n\u26d4Go away\n\u26abOffline", - "avatar_decoration": "v3_a_9cd7e573f48859a995266a0a8345f336" - }, - "connected_accounts": [{ "type": "xbox", "id": "3067249045609961", "name": "Doomsday7826", "verified": true }], - "premium_since": "2023-05-17T22:17:05.125413+00:00", - "premium_type": 2, - "premium_guild_since": "2023-05-17T22:24:32.408000+00:00", - "profile_themes_experiment_bucket": 4, - "mutual_guilds": [ - { "id": "1114040703211810816", "nick": null }, - { "id": "773830685659496449", "nick": "Aisling" }, - { "id": "1094449303965147177", "nick": null }, - { "id": "949389505658494986", "nick": null }, - { "id": "631009009578672142", "nick": "Aro Arosay[VC!/TVD]" }, - { "id": "1103628895070208110", "nick": null }, - { "id": "713845644237733970", "nick": null }, - { "id": "842867018172334100", "nick": null }, - { "id": "486365781207154719", "nick": null } - ], - "user_profile": { - "bio": "\ud83d\udc99 Filled with *INTEGRITY* a <:aroace_flag:1108526292447543318> who just wants to hang around with friends talking hobbies\n\ud83d\udfe2Up to chat and stuff\n\ud83c\udf19PREFER to be left alone\n\u26d4Go away\n\u26abOffline", - "accent_color": 8259849, - "banner": "a_2646a1d05697dc3e4eb4a1ec8cd97286", - "theme_colors": [9504776, 4013659], - "popout_animation_particle_type": null, - "emoji": null - }, - "badges": [ - { - "id": "premium", - "description": "Subscriber since 17 May 2023", - "icon": "2ba85e8026a8614b640c2837bcdfe21b", - "link": "https://discord.com/settings/premium" - }, - { - "id": "guild_booster_lvl1", - "description": "Server Boosting since 17 May 2023", - "icon": "51040c70d4f20a921ad6674ff86fc95c", - "link": "https://discord.com/settings/premium" - } - ], - "guild_badges": [], - "legacy_username": null -} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9e733ce --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + // Module resolution + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "resolveJsonModule": true, + "newLine": "LF", + // Setup project files + "rootDir": "src", + "outDir": "dist", + "allowJs": true, + // Skip checking of library files + "skipLibCheck": true + }, + // Ignores + "exclude": ["node_modules", "dist", "assets"], + "watchOptions": { + "excludeDirectories": ["**/node_modules", "dist", "assets"] + } +} From 3c3e3524ce2f5142f9a7ac4e4ada665246500115 Mon Sep 17 00:00:00 2001 From: Tavi <66774833+totallytavi@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:07:01 -0600 Subject: [PATCH 4/8] minor: remove discord badges --- assets/badges/DB_ActiveDeveloper.png | Bin 2985 -> 0 bytes assets/badges/DB_BugHunterL1.png | Bin 1859 -> 0 bytes assets/badges/DB_BugHunterL2.png | Bin 1783 -> 0 bytes assets/badges/DB_EarlySupporter.png | Bin 2208 -> 0 bytes assets/badges/DB_HypesquadBalance.png | Bin 1266 -> 0 bytes assets/badges/DB_HypesquadBravery.png | Bin 1131 -> 0 bytes assets/badges/DB_HypesquadBrilliance.png | Bin 1527 -> 0 bytes assets/badges/DB_HypesquadEvents.png | Bin 1435 -> 0 bytes assets/badges/DB_ModeratorProgrammesAlumni.png | Bin 1265 -> 0 bytes assets/badges/DB_Nitro.png | Bin 1836 -> 0 bytes assets/badges/DB_Partner.png | Bin 1147 -> 0 bytes assets/badges/DB_Pomelo.png | Bin 1414 -> 0 bytes assets/badges/DB_Quarantine.png | Bin 968 -> 0 bytes assets/badges/DB_Spammer.png | Bin 842 -> 0 bytes assets/badges/DB_Staff.png | Bin 1478 -> 0 bytes assets/badges/DB_VerifiedBot.png | Bin 4637 -> 0 bytes assets/badges/DB_VerifiedDeveloper.png | Bin 1480 -> 0 bytes 17 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/badges/DB_ActiveDeveloper.png delete mode 100644 assets/badges/DB_BugHunterL1.png delete mode 100644 assets/badges/DB_BugHunterL2.png delete mode 100644 assets/badges/DB_EarlySupporter.png delete mode 100644 assets/badges/DB_HypesquadBalance.png delete mode 100644 assets/badges/DB_HypesquadBravery.png delete mode 100644 assets/badges/DB_HypesquadBrilliance.png delete mode 100644 assets/badges/DB_HypesquadEvents.png delete mode 100644 assets/badges/DB_ModeratorProgrammesAlumni.png delete mode 100644 assets/badges/DB_Nitro.png delete mode 100644 assets/badges/DB_Partner.png delete mode 100644 assets/badges/DB_Pomelo.png delete mode 100644 assets/badges/DB_Quarantine.png delete mode 100644 assets/badges/DB_Spammer.png delete mode 100644 assets/badges/DB_Staff.png delete mode 100644 assets/badges/DB_VerifiedBot.png delete mode 100644 assets/badges/DB_VerifiedDeveloper.png diff --git a/assets/badges/DB_ActiveDeveloper.png b/assets/badges/DB_ActiveDeveloper.png deleted file mode 100644 index e72d3d831c3b56d9d6188171ccc12f7771a06ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2985 zcmZ`*c{J1w7ye;r7;p9wL&wbu9)Ksbac0syMhA;&iuPiG+y6SOG+M2G`GY&-xQo>H-E01zw>0N>pJK;tn0 z@Z$3tEwxS;Ozu~Wk-*76L24<44n4bEo8)+bC1RGpis*I+#$7 zrR`q;!15S{L|BK-P@j6^uiIt!#H_Zulo!c=BrDfwg>dHCfN=EP%yjfjPf=(t z^H+Rekp9m5_A{j&V}!?ik~&o&&SD|a_>8IK&K#BsZjh2K8kKi%Im{9>9r&gzr`crI zv2pLPCGub!iT4Y~H;kp2?p0nXDlORz+M=}u4ZhpTlaNHeGTGAp#zmd#wAF_5@XlN4vVxj#VXP3p$fM zZa&`y-+vWNzw1vri!XK%y0FF+4m>DX6l+%Z9k>#p7JQF-a&W)-{z_ZY(VsYJCl{QZ zlM3d|v&0!E#uf%I(e3?U!pJbIl? zMiQ z?log_u=OwLsZs7HD14s%*(~me#ZfT}&MD8Kl55EHBvAg1DB)<^O(X^?zs^cbV>xu< z8ZLlY^6K&I)F@ua-UB%uZyAwT^?4_@)^)6P#^zniS+i<34)?v(7S%NZN$GGk%J2~W z2y(SYQt)}Hj##krN1d?{DNM1)q9=cM6)CR$VnYWjM(#pY_DQ2d__oXVE#(yJi=tt; z>l|+4IS$>m9W>XGl!}tzSFMx9wIRSKge8-D=)FcS5c->FpB$@pFhzZO?7l8GO4mch4P>H08y&5$sUqY!VAAUSk# zH0EnQsJ%M-@x~jqd>O_Sg&k-raXn0c@n|$!NRxXu#lxv~VK^V@Iu;qW=2I7SK@ira*ZI6t z`J6Z1O(rSL5}W4&_Wt)=c;7y#c(zV?Js*;_WvHunjaE%gArq(ED4ngjW;PCq+b%=5 z*bTOYbSN)ot-+U>HbDC%0pr~a_!)w+CfwaXB6L@GQ?+gELu=2kpssY)D;|?h%dHA! z)_a~Aqil(|La;n+8LChm^zps3!NLeE!EuZBTxGT<)+Sw`@BGnmVj~lLJwM1Mo%Dm% z#ABO#@Rl1-Cc!q3g{auRWk`P1I*yQ7+V_r83Bp(vQhhY9IPZo;Qq?KWf(tc>Iop+4n9eppNYDIq?9?zDW_e0 zUb-F|6E?|+?qWDw%;tGw-gmWs;SuijQEv>~mAT{n!+Ao&JG(iz?yp{a6`|@c3g~sf zq60D9C{m-Xp^^_F6g!$*zl{o5JBXW{o{!o$-u_uh-)*!xlhul`IV|6vN(%NdkfsZ$ zS%1pHhHmeM#)r`gS|e>U1orfW;_n5ls&5Boyd`CmbA$vk;BK;|of9T8#Uth-w;WR% z{$`^!glNTAge}&-zboaYVK&06Y_))(f82jDU2MK>QXu-B%#{0*D&DBq0NJ7dqjoiz z$K?PGoMX5F)lUbclGvL`;WPGW3Fhkg31;bA3BArw$q#M3cOs46Siy21KGpRmBEfVJ zoD7TW=8;F7scP}z#*Z(G0scO9BNN@#OP#wLVO9SWV|7 zK1Z6b)~%$3HDZFqktTdm?4O5OQEeMOeV9lvElkD$wSk>~#A)*ka{bf%0EREaxgF}E zewpy$841`A#y`+0x+}84Jv$^}uuYZDgbW>g5GOoBPKe{9rk=%b>m%mRG8ad%- zP5uNfi>nq>(Rn209mOl0s{S77!0cyHSgAB-;I)g)ufa~rG=xQ32S zroJPl&I%+S>}>3x9I8GPN&QW%9SIvA^5fA-t~zf|XU*fTefQeW8*U0!OofyCzx{t( zNJ`Gy6J%79AKPa5i&s!2hi+yFzIcg@lcp@3D@hPxwsr(f#LDnrC==p76yQeu&Alrg z{Mh+sDX{%n%I^S~o6(B+hVbAbs4|SC;?Al`e63>z@k~fJRvK9QB7#RdCW;q{bBxti$jII4$D@IOqSZ;BSOL^TXc7t9Di~C-g{Oz zaU$iO;mBN%=V9~@H8&ofi|q$NkxUzN_U2v5e{RCEh~^@b4Nl2xC>s=gZ8*-(gT0d( zrr4)F|A08cQQC;+tVG$mQT3PKC{hij+4We9&IkH@hq9)RUlP!1p)QGV`By8@>FRV! zM-Ap`bA&Zftr*aQzisH{_=%kDj;Z|(70tDQ=bHHx6KhlVgLr;dZPg4Ji2DfSoM*F6cA6_ccHMpn5L1G%8Za=~3Gnh{7gMOHHh*NHlo8!9&R5Xs zlJQx`&#dvm9C8+Ysr99JWk!J=iuCh6j*=H7>+8Q+mDp68@ZzF2Yc9{L)ykqVO7xNq zbNx6hMe9zW3LDmA*3Nl+nHF*N&cGMdW$fjX+>iUKuU#65jg43RCbU%+vCC?Ri-%~^ zJxT!Bp2SPO!SQ?i9w)W&W%V>nOChddv++_uVONaje{A1>{h!JoRwY%Nr#*1l?r_>@`_5b@|R`hm96C!G!#`eloX}q6#Jj8sr diff --git a/assets/badges/DB_BugHunterL1.png b/assets/badges/DB_BugHunterL1.png deleted file mode 100644 index fbbf12b391c650cb79e10619a7423be267ff7964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 zcmV-J2fX-+P)GxN@z^9@Z-P7ayMmi-ePb$8;?%nJ{0ezNtq z6YH9^=f>CyeE-?&=N}pbO7zE*zh_}#zdW~dWX_MPCtdW#*p_jCf!8ny1b*7Fc#BSb zbJKO<+XRRZAq)cM!XkZr;fKAk7QRV%eL!XqFkF0}aPOzKey+u@Yt{I72cEo|m|+kk&i0YDa{!>y+DrR)-TwFf#|A+H9rGAgJ=j+4uWum0E*Fl6bk?*bF>2B z0>P$hKWz-1N3d-`I0P|DN0AWZ90}tHL1>~Vawt?g06q|eB#M>{GSvK$^$&a?@XZfI z0r2zPYYR$<0)1vtUw)t(f|w_Qq}s-VX!M`!^HoAnN)+g7Ai3z?^T!{lgP??pVCt-4 zh+MV>F}^@40Qgo0O*()7#;0l^;Bs1sb7jz0Eev8JiGV=6JJ>a27^*=`BufYdjFyF} z&pWWKfccPV4DGvhcA01hG>wg=-UM1G6?=hP5>%ZRf0iK*fvmC^&AFk9wnX{%DoLV z8AmozlrRsV7#N8$jB34u!t#KoyuhZ4l)8d0?PZ%M5Iiju%P(MmEuB>Y^vR)}JSrG~ zYV6EzClfv&5UOpzpIj^Arcz4+X=N8xM)UzB0>B;uDL0hC3FKx3senMrWD!b0PFAoQ z2#^PGw~P_~xw?QVAmD!V4CSBnPd{r2I9tUyC6sd{tOy9WdIA^-)wuZVAmI4u8iak# zi_Z!IPLHlZxd+Ej)1EH^f}H&UEIP_OWcnp7JSzyO62Z#6!I^)A^tvP)JL({y8YW$S zZs!SGTmcYJJ+q*?%@gx;w!q9=$rOnoUbA|A%+6t8!WNn-1QeY?L={ArrqUC~v2DQ_ zO%_oZLdY-L{wAUVh_^*=KBlh15JJm&kiUbqa$ZFhj_127$}ySTF>obOtq9$xV;J^@c#gs5n>UY&H8N+GYqv7K|D0)j%%< z))@>NL(A1jLiBOn23jGIJStwQW$cp&v_e2(2ubb?N^uFhI)qLTXd4wTrF&REL=pr6 z)u?z0iC|8PI0gX!K|nPst{ngf_N-(8-a$YyAfmA|$f+ER3BWrDC~V;p62Tm~0IC3r z|Lst&OQZ|}_pV@Q6_5l1?VZ6~5TL>e@d1)SpuIDgqg#mZAAA2NgP?@YVAsSI)odW; zr~f?&VhoIw&>8IN7sTuu!g}tT4vr2%=*&O~hR`4&gxJOi`}lpT#IF~E5Vx>|&Y)|K zfW;idK*G=9XE~J9-UB41bOu9)O%c|S*rAHR31)l^rP}MA8%Qo4#1bn3&6;+`u&BWK~#7F?VC++ z8$}q$pIN`eO{(HjC6pHl_rQU+Ky%>2gc6Od!?@Ofa?+`nlvAy}{KmU1Vb{8NgCnqN- zCno_o=Q{skdXfM0eN#N&;pgn|-@b10rw{6UbG8ZzqQNBt|6u<2xAQ`T1L*8E#SzXx z;i@j0YMyR2F#pw|pe;kWvx!1MLR>0=`1WVBP&RjfcN^l@DxB^+4W*Yac0SqdJz+Hz zivRq@GT&*&?xrGK0)%U7P%@W+fo{K0dBbVwxB}hie}mNq=(hV`>m1af^pnp2Xd3KQ zqXjXMxr6xjgL_c6nrGr5g)7cuXHSUr`o%Zl>wdJK)qr)HLZlkRM5Y3XAvFa|+Z4}g zeGMZ$2c7(WE|wQ}=w0~0ju7b=G33}L-)-K57|2W@M;x}|+vtjdL&+7(i_Aet`x*YM zLYXz=5GfOZ>|rGn$2+7ji2WSYkvPcyaN#2B7@x%=QtATPfy@f4(hgohFo-KY4#J@q zgn8&bb3_^}o7f>Z=@f*Gbrom~gn0^PXSuF4<#GXmm9W1*HL={Sh$ z9`BGkl{iS1KZUB?K?vqi1!jRrIs!5FA*r9Y2Ewc<`z=xxQ+$zNjslyZPW_1sB=&Q3 z<;>-xjXIC+V$`n&QVp@nn?Rr{L?Q)t@(yC~3AwN9Ah!n6d}^SRfFY)h3D=DSkvhdi zX$-OV$UWUqc3tAm^zEna1ebhAao{GI59l7+@bbKeO{r$IG#o@P z@x3*WUqD+iy2qgkSD+r$;d1RsyF=_$QUl2x6vaJf?`0ncHp69MaEkXEVzO5;U>UKABg(sHAsM(tRdMU zRyJ2j3svtnhu^85ws6nMep2EDl9+>>{b%Ab!&~#))A%1H?)^z!=vZi=Ldc=H42<1aDvl(o1@enUl5&yYc z!1)4XNkFw9n?QCbbHeT+@6NHeziN43Vy_qt;ig-Votu&sh(Dc1VH$+43+(QfD}D`` zy6G6!Wlcke^m*rHF%}TrlfE zBvm(QuoB!n3?tS&P%32%<$>IxU}qCcc&4-D!wZQlkQ2&WeTI_rxhUeeuyJGEE(aK_ zLHw+!F8GX;LCzIocx|DoBRmqhLq5%`{J7^$;V9Y(KN4c*R0$N?LCPz{TrhV!#RkNP zJ>=rbB@Ac6<-*~I7-fZy;`E9^h#4oBf^&leCzU1P1R}4{O*T~S5RPP67h(3SQ#z6} z$X=l{_K?tZf!$eZK*I39)(N|C5(wGjLUNFkJA`l)Gff)e428uP!rZE$+z$%1LTA<- zq=2Zj>ky4CAxtXiavE#Sj-2>f!V7=)DI2Vrj|;2U7_$zjAnf-)$$3QoKj?1x=9Fh?G#JBs7(icFj^ z^f>N3lncb+3CLMs?=B^=x(-DA(X+j^SgXIm4&e>q>Nz+PMc_>%woH^(()MQ9h_xvW zs5bD9C+zl89WutA(TaHYGqmEoM|BY8QiE@QUKc;>;=hA|w7g|FbO10ygZLIJS{(#%_(%3pFh^kt|v-QX@4pYQw5cg`HZ#KgqJ#KgqJ#KgqJWVPW?Mr2ubu#Jlqo|S#dc6Nf54}lx+ z@R+{}EY7N%jI&k(T3rIZ@bDD)`xECd&T*WGHNbFzm?$o`ImF7NthDEBaOVmuOsI)} z12g04b&l-=`wmSBbml(3XuRvtmzVv2*T>5b!Yq0%i&z`n!4 z*B;~1ur+yZgq0Ias1cNrk_1W!^9(C}tT@2B8WTC}B0fMcisu2XZ?-YdU;P z!1i|6it|7>6H0&q6eJK6hi99YkWcV68VcfMP3ef}IeG>=J0H<$F~CF`M2X}rP(qyl zqns|4i%cRNJ~pmnNd)<3Pbt=vmp~OEPLd0M2VVJO`nj5oB6?4Xus85JEd-R{aybQB zYjJ|1C_G+27FY=cBg(#FN$F_-mKs~dXmh&~w4IH0sI94n(-Gfpy?3KfXSWq4Qa%D* zz$(QY6653R^Z4YtTM^>s++ti1V-RI>IZ1v`lBBU%3}ZtBJvo!jtO7A{sJ9wG86h#K zB!yW`m|$a&VkaUIjARlkqd*DQx`r}9mU8y(PjLR?4I?e26v(js!K1(G8O|h-Vb&9l zNcivTR~3=mOEz&aSYzCntpL0WHwME#w@^r%U??_X)t*d@v3MB7oO>C~Tb;_jf4WKJ zB9=7~sA1ENu_qto#!w(uopZg(9eV5M-@lH_S7uo-4WQOujjsK>(9yO7`9RjQuo#Tr zD{LJLMl3F@GxP*f#x*3!pHH4k>t#G%;DvvVWAyAKo_hQsOUP=G4YHmj!u*Ccv7Ay# z6DZ+cj-)t&MGv~FE@7MH4g#pbYtasPY|d( zDvJz@1tn8!lXw(?_P=w{pV6})DXDy4&EMeUys66l*307ap&!64H9ANn%4NRU)v9~r z1#b}HXiV9k_1X)z9uj89<|rELV=##0Z%+nT&nyoeXszqdw~_YUw9|Npy5pxb;t;h6 zI-an-n94ZMXX&=*+$q--=9g*K&@dGQrx|J#rM2HSUkC9U3Ol~E~Z1#$#J5!eyT+K2^e za+%cBf*N(#?)BS*P_&9y*T3+WUnl}48Gqvxe*WAjTH6kx5?Rqd(EQ1Sv?pT&>cyD# z@U*{eOT&tKb=N-QsTb6B{$(*uoFxA^`8!l9T7ksfJDVWe>hW5vL$|?yB3(jq|I2%} zt*BRb?f$UUrLGJ3^j$ZwoZY3@60Jajk}V(DjhDmSI2}Ehs_@Hp;jiI`gbT4R@^nl| zVn^Hdw8rYL{gznEYaiCMr3Fp*wrEeY7_=|#I3}TD(8eJ8tlR!T*Is36V)Xh!yvmZp zT7<~8_~bXDJoC1h>ylTVDIXr+@t-{`Bm3;l4ek9JjW81K)e{_i5L} zBu*)m3uS`p1L2ip?G1KG_ZszimJ3ZGPtu-{_~zwF9#g`2nhh(|kPANcaJz1B{@_}C zMsU_!H$J^kpEYxyym$t6^^O(RlVr!{NY<`?a=J!Wpk%vngu@3nYEtL7IHTC=jHe{B zBp>U%uP(3edTAC!3j&x(^eu^|T0xeypAAfB=HfBp^DXx<>#5egkvcfD#4u;(oU7OJ zELD}13z7Ax2}kc9$7F5@d6H>9sGx~@%9>{r0@0}b(u~su188oFU~{9sNMs?tV0s9x zVu$MN+q+zqif4`WQru-_Y4E__`T^ugCV|KTNadUvr&^p?j1wnrIvp(cff3L@^to+e zmUX3|&Y8bzbTN#1jE zrUrMsrQcJDI|YhEShLo$4|K6>@AA`aKNVs-J00v5c$vw{p>ULsNq67sQm`7rosH0D z%|>z4U5$CK756ko6>G|OC_?VF$lPp!#j{YPxOGI2^x6$&}v%K%>m*Cyf=?Jji zzRI!zZrdIf2dd!l+n7K$lp6}NB-Cn?Q=lXp7A`A=xK-DVb32b=9U&GoA59oASGO)G zdYN8P0@X+71unj7Vm%;4WE8zls3?INLeo>M2ku@MB1!0f`oZGY2NmsNN7zH3_!hTI zW^bn=h2q%vcJ>l~@=$53U`vicEcgvr0{AK?;|TjfXXuAvEs-%rFRjXtUBw1wHF@`9 z**MapEb1Ok6dZp^b_DGPE(^{Rdk|vcw-|;Y0%=M7$hEa3gZQj;^F@=oeB}EgYAV(5aQWQZNawO3t1s7x>M-oL+ zP(c=QB*7&G6XZaSB&ehyf*i_`1e4@lkOw)EAdeeTW9;DLW;Pw&OEV69KS(uU42m_{%2JBm?ZVrNqqQX|^&p*| z!xudJ{2&|C_RI6UKc8d5jJ*aQP}Ou`Kw_48e$D&cTkKrnOy!pj=6n6=XVFU9TdEvuawa8p+Q0JY~r;R~>3AsZ@~F zRL)^M+DfycUC)2y1NskH3gS@JT;jTBy_c6V>F1Llr?uy)IXhG@V^y@JIC(unsN(hBz+y=zh8fnygmQG#gdtry++> zeiqXhZj|WBs{FN}Dw<*M0Zn$!@;4L{9Lo`>XrfU`#1O0Lok=w*vx(he?iw%7Chu3z zUH#gFE#!#PEzqna;uMG6uIZ4YM!eBwhq%H{l}@mfLl{+%#9*DYjm2)yU78*|9JzdIFchSj4W%Q~dN+A9Xy*5tsIag(N*Z z$`P0Mh<8bz<%kfT@g^yN91$h}&LstsBSHnjnWTVnM7V%hOA0JUgba+aqzH0E*a&D# ziX=ybj)bzLh;l^uh}24oEJvgenNmp&kR#G)0RKs9h#ZkhL%5Q(;J;=ac+~_sEiElA cEiE^jKhCN#VYlling9R*07*qoM6N<$f_Od_^kDN&54$7;2jeRDDED3 zy`;xGpn(X*GQ4v{2wHW}66k-#3Z%daq`(TKzzU?m3Z%daq`(TKzzU?m3Z%daq`(TK zfKQ+(`UP);z7TK+Ot1+QfvDn-GH2mZ6ynq!z-kn|L4i=1qwPcQr}GF!h{99I6BGnR zS;z0M4&1>S?kNEioEcO)Zv>@H-|KH5eyCD`b8!>7W(dWdL$6DlLKKdGkpeJ6F2c7i z{XQ=6DvIWh_wz!o0oaU%Aud|?6>OLiFv5Km8@Xt52Ufs$U07vx(<|3Jyj9Y{w^i9^DcsaUXY9`w z#+-WyGb3pMD`#KtEAtLX;wG$geY@rr=ZW)#8TSyzrW%e=7nNZHy01SA!%^1w zs=r~GHFmoV zV4&j%%NNby7=(L;o5ml<$!AR(yBxl*E?PmRF$)E8xP)1QIR`nRB~auPv@&Aq{0RKC z0d6vg=b`lo9>KH#){h{p@6qZwWGj&fDLqdCKpcL|Y(&mNOg&It;CO z`8a_3Cx0}anSz2CvxdaUmNj$MkyNA-h@h6m3FUQWktBtuAPx&~#FRBXY=rWxMo^Jj zpqO^!;RJ-U2N}U`>*LJ6{xl+nE0(NzT4eKe$5$`P1q`q)%+viWG3rj4FW+hMMh1&O z1Z&G@Aw%BCU=xU7%cb;W${QK10>yCUk`@ekBg2S5gs~fj61eh4hB1K%SB^_Pmi{T%Z`%Tr!k5GIA4$;K(JDc_SlNfr!+(gn1J>xFoCbzg`^V{){435GT5H zCqk#9y~iP}=PeGAyMrc4luMX5^yC;Uh=mG7oHv6i7DBq{o_F5JShzsMR4y$jZ)Cg) xfr#eHy1D#;4QtU$5?ofU+v zKuU?J8l}&i1KboUNO#}92vzrc5wP#Q&ClPbPoHjpgoK2IgoK2IgoFVgJOY>NuW~wo zr4$5ZqTywpG|2$%&22&jpK z$E4dI#wAv)0-YC&*(WnsZ!|*DRg|Hy!!+ov=hgQ$h>_R?YHh3)383sm$BX9wv)gX8T|jA`)4k2^A+KvPh9)kPNE{7Dvc`Ev=Oy z0?rPSfXtWgz%-!gZRXFzU2wojAeqW#wu(K+@dh=o+vsrLX=`JF2zB1DX`LIda{kbOF(J<)#AU8del%&XD0m5m7z?BV z_}Q>&?pi}#rE!^M{Qxn;qU_D2pT4-c;qok+^^q%+D`1F`K%L=5=6Mh2N#&=N{YGZ{ zFdvtjLf6bz4~kgXZ3d_-7FQb&Gb4d8&`V$gug@ggmY138e(gX0g$ZE~JQ2EP_K*F# zyq9Mwg~r3C)5W$j`c5g6MnsrH%SDN}i2rm}(sTR^^Pl47X5m;79dRjk9vl$YXvEdo z?XEB(UH8~^5EU+(v@>%M!jE7}pNm4|7w@_Wt&3TAT@&Ksp3eP%{5ePyEht+HF}?NA za{p&NH&wn>3N?LAC!^dn%rzk{?&)9{Q;i(N;`{_|&~;KA&hzkEezqkI40*)N=-hFxnnbGZ?_K=6QzLV6CVhwq8#lgxe(T@%SY z7K}q64q`ZRfp}}EsnO0zDe}6#GYq5Xc2Qbu*v6sjHZIs!@LC(MPuM*;TRqI#T-V#I z{A_cLY&2%72MeQ`nFi@|u*7K-FRkCEo~XRdC4HNfR`4|c#iX6lG|#vDm(6CEO-o5u z!47W=E%KJ|mWi7(mG@_0h!noKw!>)zuDI7oGRIMOZg!XCx4zau-P8oP($Plc;-C0>`Nx41$xWwJ8d;(RVU-XKQoq+-5~T z6vtB-oj|PUAMUZ`P#@TdCRZBfOj?>x^M=K!kvN>f_#TM8h$CIVW7D>VLAo={YDnZM zF*6I`(F5^dG`5Wkc~;N$Hq82w!cZv zjtGG2v_F9R3dDopJk+YxV&$OoN->+hx%%wgMIpVTzYx<2HCy)xRu1aaawza}a%&)6 z$K)U;Y~3R`#Xeax!DF05jDU-K1gF(}kj7O`MU7JRiGcgs-G;KqNg$~P#yZq|L$KB9 zvjficpv?APyDr7|aYIO3oHaY0E)yc>Ul$u|H3jik_FT}sv-?~&FC*Y3L7haAe261> zDY;5VCTY0Iu<{{};B$$?)BkTp-qS6|mPn35W>yZ!QDV-$TY_hJLvY??L(n&}6C&kW z*V$?q-USM2l?r)8D#tEV46eC#dx)9XgkoU`)Ltg_!|p?yi;*7#W8!kNkVDdWkV8(c zF{0dg&a@5_jF*chf{)xG3L5AgL3bNnLzgq9i0FBqSsx dBqSt^!xSHa}pek5ed_N+@VkJu8^AXtgS#qS6%f zhN=m|z-e0cA!9J!ZNaAjSVPYFGk$n2%O@E#&}tg-5d(I}8FPSh2c%gUiwEJb`S*X% zV1Nb~Br*;_8;t{MMAtikWgGKNMyD95C}8jq8A;`OR8PR+$mDc0?t@f~REBYgQk=A` zk;*a-QQ9iD8~Y?vW@KGj9JCBAg;mTvr5VU-@V01M8=wOvk!YZ$cYL$Bch8|9f{-5y zH|7#;CBcBTGrxBSN#Ca^h&dGDEu(i!}Sg}4aFGy z3pC>2ee3yue0hO&*1!tG%cQoctJuxl6oRDhJFk>{#`@KlHG&o7uq#Fq5C$@OlddOAF}Qt6iFwk zD5h#^N>j~y8~n{p*Xu(DVu50UiegAj4aT2lcgLk?0kc#S6J+!$MtColrJ@ZUaqrYO zttJuGytfrp4kgU43;dzy_>1`%O}S$r8&r!BKJu=j0evF%;H}$`oAm&GA_HdGQ=Hn5Sw&hx3eq>C zsZWVi1g(~1;91W;XQv{*Np7=B=SK{R+odyp6}iO%YZN&yEPM0$K(xG1I+FI$A7KYZ z#g4FkXt~D~t)G^l{|u$A22DAtE6lUqFbO5+_hz%6N>OO8>W;--_kvlxQib1JUzz!lK#|<#FJ>IL3gV794Q=&7ORtNg#J@uYkafgqXf2?kGcpTTxzf}`QGLiyWgT(q zEkQF;p4eg|ncTIO=b|H~gFxN+Z|w$(DLiJ1(cp+vZx01hv;&U{DJ<)>`R%T-qH-fe zoJBZrosKvSBL*V0IdGg(EC~7yft|Pxj2VbfIq2KEz92`OhEW5>s5o$(QkO+J;xtMz z5FzToO*rB-N~@EmlM#Er^%dVG=Cvb7{5JbqmT`#E6tu~X12^o5)2M`j2%2&WfGbA- p4`$dA*VNS1)YR0})YR1I<`-!Qwe!UGU~K>Z002ovPDHLkV1kdYm4g5P diff --git a/assets/badges/DB_ModeratorProgrammesAlumni.png b/assets/badges/DB_ModeratorProgrammesAlumni.png deleted file mode 100644 index a378cf182f0d346bfd516e71e70e85b930b12b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1265 zcmVja1sNUlWoBjN;6RV;@$i4$N>kmUyE z1q!WpIx{K^6lJtCqnX_`HNPjjs@FUEd%CB4x&`3zcsw4D$K&zb0D@)KlTHeVKSOCy z8XjHz0*+u{5gK)y<%%Q0ghs6^-r~t;;AK(aUF^EQY zle`i92Ngj%wxdVqOR$W!9mE@K0TqG)f94_pUUA1S$oSJpOS6mf6|G^3!`G z0yu`cKrjva^Fy$Nu|OYV&NK023u*_Y*$3X<8@xziN3;ZzKE4ir*vBAzEPhiyvBXO* zbAZ>|YyyB^#ZKG@n-EQj^XJi{7fUciNuc%Vy#)d_i7*jQXa_>h`5=Dy?|7R{Ht7rz z@d-FWtp8HP$*b^a-qv|8RJ3c6)Y8x)^Pn+fe7ejhEe-A?;eR-3?h0{SfvwQiE#XuBQ8a-okqR+66yxQ6=EuR3wsyV z5;PZxGbRO1)Le{VWksk>IM7?rL`@)qH}HL+?P5v-aSoS7HpJ;Cs6U0D<7<=zVhq#b zKUDTrt3JrdjX(jei+2z}0yQTK8*T)`o~VlDQNPs)n(xoJtKm2@>!$XUDu1C#~A!R$)JndNpP zXl8%jZ$Zrv?)B2NCe$ldIXy2j!GN4ydYK~JYYK*F3AAyuO;Ng)*85S7PBT%UMyq$m z7j{|#NjD?lCq;Hq%<8j?7|d|6)GjeTKdwo*ipPaUhzE6vMY~?uX$!Oo)&PaEhy~nw z6Hglp*S$tJiUCH$A{%*0zWVF;N*jtcu6vCHLh)Y_Eug|!#26b@=4zIj1;%&M;VK*| zoM@Y&f(lMGYs~^yE+%^3#h&3Xo4aR!R~%UK8~%oa9{g8i#@) zi;j6CQ=ao7#Nqn1vmbnTcen;)(iKLEF0PN&-n=~enOLk|2NSz_08B z{#67CoplpV*}`$BBQ0Y%!ihi<$0DU=O^!GdNFu+xA!5?P=Io&i$ZRia3O;eG@UHYva{2N=K(i27~GDulyZt5 z#Qm9e+t>!B?4WDphZJc*8x^N4uE+SQ5=T<%4*C)imxdxPeKV7;BHr9YWdcdolg@$I z#3MlZJe)2naxPNNxc|=-YCxp|NxsUL(z;E?RxXf4=1c2%bsXM_$7SU=9*@W4@pwEQ b&rbXgJRGav#ihUQ00000NkvXXu0mjf=l&|E diff --git a/assets/badges/DB_Nitro.png b/assets/badges/DB_Nitro.png deleted file mode 100644 index 38d2850a1135b902ac8467df4d68f3efb1b55a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1836 zcmV+{2h;e8P)0K~#7F?VC?* z(^eeEf6sP1pg`L}s}_}!N}JYdXa#m)mr3bPJ-|qJ>QI3oq=_4_+a|U+tkSeo*{%~J z6o$IX8ej+5VFYc5au@^zS|%nn9h!>TsZ04=AhGxRd6fBIlIPe?g5;0XCVsJ9=j-45 zz3=-y7a$-YARr(hARr(hARr(h;KhQ0heU?tkRmAu8Dl%38mN%N-#Hc3YpSBAMMX>{ z$K@<|h^GSW*cF??mk`vJtg5PKguHOn3$Z*CX#37jqk>- z%*puPay$7V5D$@InMAq>H3aQ|eD>6lc&UB7%Rx?&APp7Jv|<^wul1$}V|SAWcgOdX z+y`m|uW#ypr31EZ>4A;CA?V)Fp$W9agNKVSHGKzu`Z*0ZGFh1YyP`27hhAxOF|TA1 zC=!ud@+ z27$JHa5y4LBHh*J7cMX%Ix!YILGL5O@tDdK8GL5n&H>my@HSKeMb-HCDLD7zq@&{s zYN7v!QzI#JyCDamIHO>?tBR_Szkx_pZt+_j>OP~N@2^;#rE}~X9)O`p*vVml9?8}p znUi!){maP5Q7zAS!O;6*ry_;XXQ;8*%*-voeC}b{<2%|{!zj>(g&b;4@?_l~r0|57~WgmzYT$yGY>S?)^nr zxc>;6S1vcSZ+)vrbK7NMV7Ozh1fp5HDrytXqV@m_>LnAM`OZ@G%+22iH~cX@XGz%H z^EcJ_U0iiB6lVfldM9&kxOr;^+(OYeGrM4DYj3OUGTr8&5O@gXkOKaA!Tdsb@5F;! zfs)`7y+5HY(b?7vUeMXL+W2=KaQPq$t^`6;HOPSNMR$F|{KI>W**W9PyR*GnGktD& zxp@V&uUTbiBS*~zGgd-fk7CJ_aspox=5}0aq1Dy09iK)P{YXYp^y-E-SGlOWYptb? zS0KE()B0^ceGpg0&~BbYL-gvEe8$d9S4WF&1m5^93tX5Ct#1P1ow&xcA6>YeKcOfx z&#THo!mMkz1}zoRc#CKXC@KB6Zvx@Wm^*<}70}GG#sF~a_+*U7LnZI0O`XH;q|7i?LPCY zST^PGFs%$i%RWw`iE<4I!#$)gQ6zc@Un7Xfq*J-xH~aAhLDEz>5o zjSbe6Nm264`aB%__IyQ)hsC1jzt5_~j@_}VI83-&aHP@*iM0exQz~3deGV;3 zoEylMSr z-(%ga%J5Vnedm91vgLNI`r|Lj({h@LY%^UX)B*?M5H)!|Nb7ERkziWI^czaZ_;)w+ zibK@w`Jg2tyJ81%xx3_}Fs`AfQP?4zA3Cmp`tF0uk-2_pvUf}WcR0ee;=Ik34X}XK zK|JS|7&Uv7V=`BL%6f`Af?PKiWTH5$-s8p&(5zelmIRR{%8gRxs4Ic=Xiv(DYFGg^ zf>F?CUavBuPOB=U1jf={h@z)%1u{bqaKR#qBt45PddwJqy#DW=fPjF2fPjF2fPjF2 aD)2ALA(MjrN|Po400001($D diff --git a/assets/badges/DB_Partner.png b/assets/badges/DB_Partner.png deleted file mode 100644 index b452900dd8321000097ced7cf2f42ad99967b2c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1147 zcmV->1cdvEP)jpp&1VIo4K@bE%5ClOG1R*I1bE3S}Sp`t{ z2(g4fB_vqk&nx|lBI*)gn~*+ZpxdC~W3y54VGd*}kP(GYtt*1ZLot#sF>8va*sy!mCf_2D;OTFgWP0j@By9U*39-;`& zAU^>8;Qdjd4UTXkP|OOPq#_b&C_R-@1b z%P6qK##X0_IrS-faST|zmh(P<19C7U#x;=hUXzsyH4{#ziwvBPk z_Zz`xYd`!ZqaP&sTI=0+uL`Z0agyOS^f5$V_zC+kxTrf^z9&9_#I7-O%3xZLEZAD6-H zu-7eCpp9o2FI~8XFTRcH=Y!^9c)%+^XBPxsgWXj$!LxakZ$$m(u%f1&8;NN5^mut< zZx<<$D{*)|<3+Q+Tmy@wam_yvuMiyP*Crhb%|YcSor(i-&J_gJw{?5Hla(A6@!jyC z=y{L95@xQ^L@&Z@JS~4+1I{XHs6c#EB?2p)lNVG@5A8LR*3&z|dDx*`_;+S|Dp$%i z2#v5q;jh>rm)wG>#!FU?(=c3>wBGX}_|1BFbqp6sv8u#5B;{bBar5N(=Etbh25Zya zjw1B=+})^iT?W)))QCDKw9Hrd!g`C|r_rDmIT+Bvj~luc7yZX?)-1+r(3|6{f`c|e z?eGOwowPLxqef&7dbHi)iP}4hoR5CHrkTJs(P^9)<9Vy6pRRcuh<84Uj{3cG;G)q? zSTtgjbU)2%?`+&jQEkE~&U?6oOj|S(H>>5XZ>tEp)OV9czn2eMag%U13-^gg<(g5P ztioM&*NigrlItXv7F3PJ*@5|DC7?PHh_gx;EXDA&3?_NljqChV{GJ+&V(^@~5 z1Q!9->DKec_QgJzZuhTR!l*F~*7n6FadNa=HGvEqVghRKI`6DH5XX?szdI%@pU#X! z*No!SK|}fzrV7@$0e%BBVkTkZN|&w~8!ub>$^56PA>#d1ODbk{fg9+!CM diff --git a/assets/badges/DB_Pomelo.png b/assets/badges/DB_Pomelo.png deleted file mode 100644 index a3d3e37914475e0d6cf244840ed8ea71584d0d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1414 zcmV;11$p|3P)SuQC#*dJgRG=}u~=&OD= z@Z-3POQ{a!5+=Ui_|RyDU=a^2LSEy=@%0MCAp-i}8y80hU=eE`w0U{_Bknbauns77 zc>C@5ZLok9fi^EYT|B0nutwm-PHuKywjd|D1zJaO#@G-k*B_MYr{0-a#wAMeo-`z7BtC2u-l+%d;#m6|dh%f|rY7zn%Ein|Q5BEnLqDrwD7$6p? z_U^cezXHflh&fdQqu{5w2HFMKPe8GmNsJ_3Vw=6rZ(u>7e{iCIK6^D7U)L^=uW_%~ zwq-wu=%epHi5jhldxOY>EP4-QC!3;mWYc~Q)knjj$csb*X;0@mGCw^?4etC+sj4;m zMJTl|F=q=z^&GI|Jpjq?*{cA{B8!)c)P5n=(Og)t1&YCHKsezM!{Kn*WTo~CNw9Fo zwXJXsl~Uh<8IhWrAYNbHdH#&QaqSJN2UOK$r68R^DUQ~+fmJoZu0Esh;aAbi*t zU;qmH0^Pp}1wtxc3f)X%o zgV76;<1D;L8sq|1D#HLuV58Sr>IJj#nR8;-q%j))3uJ4ZI>XxFd1;OmV?6U=>eHsl zd2>!Bjy-z8*M_}E(e2L5FFA(ndJt~X=fZucic#=uoIrYku6hm`x26;6?>PQh>)D&X z)LzIL*N`0t`5I0jA1kdQW}y~7wk_9iv>A#@3R%`D2MZ+|yDXB%0vH&wE;$&r>q+cI z0zIr$-hiPO`SFA4`?hS_GYO@!nMj}z-$*Kh*S>^$nEd}fs@BIE@)D1b+Ox(W^q%w{ zFre1!^bH3bVy+MYKcAA?FMJjr?N2}m`nM^9 zaR@6V*BcthIxRO^Ru;q|tbSLcc5!roDFXEnm0CB>5b2zI&NNm9B1RpsRN)JtM5xL+yH_jn+a07*qoM6N<$f-=&4a{vGU diff --git a/assets/badges/DB_Quarantine.png b/assets/badges/DB_Quarantine.png deleted file mode 100644 index 1f7df1cec1d763310d68750e6e5c7a1d58aab301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UH$0z*rLC6XFWwe(vV^GL`%LWd0xh z{2wOqf9&J?)X)2ABJZa@-p>m0SObJV}i)%ZGB^XojVuk*COEwlZ$-0s_Q`|oRgzOVEBzRvIa`hf521HW$w`o1Cf z`^MlOTVsA~js3AT?&toJp9ji*9;*C#sQTxTx}V1ye;#Z4b*ksr>AqiQCj2@JM3a7B zTk`w*vftNN{JypB_w9{;?ri#VZ~LG7JO13?`RB>eKTnVUeSYfiyPJRC-TwRj&foWU z|9yP$@8iRNpC14F{N&%~r~iJu|M%m=zn`D}{rd9%_t*cwzy1I7{r}(J|Ns5@|Nr0r z|Nk8#cKZOs-LxdgFPK40LQzRs#oET!&fXy+DmFeLDY?9+uD-Ej{(^;zHf-FqdCS)A zr%sSvZt~$*S5flu}$=r1F`TXy;b${pG=j&g7o%{GRd8vL? zqnSURZdA0tWi7hTE8Of(ci7$F9HX19YJWAid9YqcXvyt8^w{SAL!FqvCPl?1wr4JL z9JpB9ddn*{e_G$oyQhM)R{BK*UzvB^HSXd@t)O~0U8ct-Tc_^okh!;bqP@t(U&2}H z3td;-u@lJcKE{4g%Th~GKnx}bh^Gy^b&DsI>m2jH@W}&Y1U8O68Bg7Fna{A?D{xM zr+dl?^Q4fKXBa$!Bcsiqo!sQnIVaxy+6th+2FHalQAy3242J*QMGi>pl?#};I9%X> zfvw!hbH|SLiM%jmI52u2GH-|{X_{piSf`D>8O>Jndv*H0(z-hbrdZ@d042WBjJ zym!a87aRv)d0m_#-k&OUlFx$4q-eHj;T5ybSJr(!SlSo1Z%6F9u|k3?#4J%UH$0z{nKf6XFWw{s*Ck|DmD#9USf} zI6Strd}i$XLeK50w!;l|>zl?7w+%h-=(*k0ce<_Ta7V}OuC~j41CIxKZnt%u?r6K; z)px$9=XhV&?VhgNeO=c(`p!VbclBKF>bl(1alWVTdSBn=j-E4E+!-Q%R~N*+tLJ=A z*Y%#R%Uxa9yLv#<`L4dpU47SkKsJc$dI!V+ngbSx2tr7(8n7%-8CWq`9HtRy9YPRf zl%5Mz3Pb$=|NonGbDsc1A*3Y8FBljo%q$$7T--doBBEl_GO}_CipnZ#>Kb zLc5ZJ5_92#j+{UL??0MUy0}MAKI8Kz6W_^O8Ro>U+WT^SqR#TYUQ8`z5mI>;)!J;| zXZ}fgys`3JbIW{lrq>=e#YQ(da&?N&%;}6beHzlGV$AD4V|U1mqmuV>t}i{V6V}1$ zXJ=~H+>kZlM%weD;2R4SwkjEVe|>oF-9n9NeP6Xc9>2MC)snl>#;ZPWP&?!8oSE>o z``>O>#i_1Gdz!tTZfJ3LGp*=)71}m$cZ|sDPA74@!hi$qK^Nv95NbF6uyEbQzip;` zes8~j>RR+Y-P!$tvujSrw%tXKtIPIm*gkvLU%|j~i>nVr+toiTd}UGH$i>IKuc0Px zSL~UV&Sa^UjX_tYNo0SpP*`&Be3R$jhV!MeQgV#uV6A1e2)Gj_DUw{Eiik?S=opCvtV1ut_| z-kZASoom|5zwBB+3=Fon+|-xpkl$Ug(>ik9b^EC8GLOI3pXs=?Dew2XN?>#`c)I$z JtaD0e0sy=Vd^-RD diff --git a/assets/badges/DB_Staff.png b/assets/badges/DB_Staff.png deleted file mode 100644 index f743bcd572d37550b9b051b581cc22ddcebe5bfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 zcmV;%1v&bOP)|vZPUWPqie!H-7_98jYks)iqt!Er5c8f`WpAf`WpAF$h=?e%xuTX)Uj{ z5LeJi4jOT#2@8OP1>vg>G(n`-D}qvRSKVo!RioA_%$bFWAfmeaPzNpchaS|r4qf$j zUJ#Q%88k?uQ-}q7Ef_UH!Qg!5mnq2qMNt(E#0qL>)AKuf#AT7EVwUwN^f2 z4$=TClaE4CTGbk-mG|HoXF(hIMarRkg(uj#ZQl`CMPy4$`34Xe|R!$`YVkgS*Rf2HMy7O)}`b;~sjt&{ZD zc54qraQ##cYHsQh+yW;mshJ#xS9nE2aIF$p!-T#sK)iw=IHPF-Fklrym_YY2f!4=7 z6*o?njJ}Z7`|Y&xLcmLKM1#Kl*iq|OapfKyF^-_`e`#$@kV8b(?T3BfMkfc51B|A% zXE;Tmd-BSl}mw1!XJxS1ckCblyfG28h%N6qv(;y zHHwS`2_e1%QCQKa=-m=i{Vl+d59qK0=;1amd z$+}IE%Tmqzl9UcDoap6=oRN?4SiAjoQZXux*xDW3l6=S+d;|+gY#l|;oJ0+LUvkoq zfCX*{p;0l*+Hy6Plo7eqN>LEpSjo})z-kIW-G`vNX>urgPkO2({4zMi>XV)pLR!^L zG+gL>#`7eU0}>Op;k?L8(|)3)DRL<9WVc#Jh%Zi-D)i4Em`|okvXn!3Th$nmWFW^T z?+C45Loi&(W=e99(|eg`(z~0YqLWV!Qo{yaJn6}Fl@_~^t>f>mpX*GI((5WiP-O*oT;3 zIU^@%LPxFp9CBEyWLBmCRpCe(~3OpQ5&3^VZ+qt1rjwu>(m13GCS{qXWHZM+>a}95Y2r|eg zp4%3w^bAQPhZYe3JYLHE(+Ib_SjH`vat>a#nN-_!X9E>n5B;Vi$0Ff4+$M@x0tlS7 zj(LVX=VZ~3q`^`%vz*>3bAXW);hzXk@?2^7TT6&J!rGQzIT9Xz_@=vgb;MU@6ciK` g6ciK`6ckM4f8=VniFxDjE&u=k07*qoM6N<$f;@_)>i_@% diff --git a/assets/badges/DB_VerifiedBot.png b/assets/badges/DB_VerifiedBot.png deleted file mode 100644 index 0537e93011cf699eec5120af2184c220c875965e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4637 zcmcIohdUeI_l{j^lvZtu+G?*TTC4VoRhqUo6-ted)QC+{qeRSV)oQ8K3bj&dl{ASN zdlWHhhFZ10>HqNiJ@+~H-1FY~-1|K5x#uKVnj0`Na5De^045_tJrG&@|C1}UEmj)j4q6uz13kdyzw*AlB8!aB`x`n00szci|AeB?@1q+4z-nov zr)>kB+IssagRkdhU*xQ&;wlWcot%BmP$$amwsSW&A!9*JrPCc~OHo)S(TCjA1+x~L z+78HP+bj>DRg$pNx@L3?mO+ zR`?yb4i8r-?>0gBN91})X z`QI=+xM&!mmE#s-a{l;f^iRk@{SXKG@@F-~5tk2`X}Xk))jz5_DGXI0O7b3^)B6Is zZZUMSC}&r~T)aikrW{c}Y^lN*Fv52e=w@B>8nU7`-UBlZ9&{huKu@D94*8#K0qt$) zSu|Dlc6$YP9%^kYi0rBxQx;u4`P@YYA_YQymhpCBICfM=#3_rSP0%~s>ZouYT<4S2 zW94(P>f&vPr0qFAOYv8il=3G{s((i+NVJwED&X3a`oV8kOubS3Z~6I-nyRT?@CWz) zE#O`lc0H>(6q`2+?wwR8BahaBEd<^4)bPd(>vXm4Z1lkqf|r8hXKcy;g~o-5;0%gNTWsDw zdQEhT@TUKM=Sxwd$S%Qz&G2P%bj(P${Zu2(_H<-!wS7evp$V4{iLbybs~^Vu_E80L z9RTs{RWTJzoKytLoKQQxvn(V_3 zU)<9uI4NR)`G~VGF$Vk~g8q2=ztcvVT=RZ|F-dQw;RVT*r5?D<*u)*D>QpHVXSe`d z_=Vkq9M)Y$8qsi7QsfP&I4C;)2xltQ5r85P4tkw+=w&?;OzA2Z^C-=%1_`s zS3mnJ;nARlmbZRE&he+ky^dc!)OyUuS0@5p5m+8;_#QJ-7?6w9BfmjgaCv7z#YUU* zl#{o5ckqq57;1fCxy>2GuR~256}W~_wF9;z6_jkrQ*@awKTz*s<&Xnv@(7x|nQK&) zIAfb@;d|@K9RYON556#lS%Hc>bTB0x%M)}|EdoBR^+Im^H#ho$5vJ=@g;d*`h?xBb z4-qHw{r4P0>3`UU4~c{pbs0!4*E5W#>`ZuJR#N%D1w)eHt^e_Nq+dWXlLDyJ3#}=U zQa?(^VmtP?4qHp%%S%=Hw9c;AiOnA>y5MZ#e=kzc);$~LEQ3h8vxM+?3eJ+rVBLg! zmy5xe?<0SQv8z*N66oU&5B@g4+)$@0;jv@gqT`O>vFU@5OgP&RQKBs4BUEOn&U>8h zNz?Bt)PGj<_Z*nj{>;1M%#OdB&xnlj3sxSjGZ8bl=X%*b(0r8w=5$3!cgmU(!JClGf48Y(vQ{|- z9@CkL5rc)j`la2|^i<8FR3y#jb=#a%(4Mq|Ju7zd^0@Je5T+3Vnh7>}L*6>dJzR3( zDf8p^+dRBun?VI2(0lm8CiE@;d2%D~6vYh6I|^Iy)>?Cv7YM|VMwmcIN{S+?K8rC4 zBKsp%&*Rv1W~-llx3=4weZxjomREGCAw zxNsIQ0##Z4$1?iPj~FRyU-F2*)U#r8z1cdi9^>O!d)mvW>eG+&i#%VJrh{qpPnQJW z&oI0DYNflfx#m4++!U_+z2lY$`I6{GmZmOdr%g0MykbJVNW8nl$z?ZZyst5UkUfuf z!4h;}_NU|efOTH2&v9KXy{j>Hyrnj0fj3Guew4DqyiUd-BPnST9_&S}YSejU8il)vey`suuPxcU)A+Yu)P7LK6Beu{0lsvNJ8Rc zY7ew&^Kyj^uP#IFgsF?RF>7CLCD+lN3%6wVmeMvoj=1E2<7_;-?%SI^mmqASSv`S85e9mFV~==iQkq#tjC^@6SmeZ z{Wc!jofb5`k8{%Pf7H+p9{Tw+A*Jz|??i9}f^Rxtf7+um;a&RA43oYQ?$$Q}P9Apq zfBPk2gCBy=5sZ_cW7m~Kzfo4%f061?+h9A=ckG*fousIO{$dms^C$%6(%bSy!h-IK z#5L>#uc#jnX#?gyOwLu{2+%Dk`}md?>HY1mX-+NNq=72M{b>^*oqhDWd_ek2{(`#Q zhI^!{OL0RZb#W()siLfe9DywX5pEu^itTwxN4xMNiGgE4Fm1$G{NZ)FNnNUHz&xi( z8B#mBDDV@=ILIw8e`tT2HklbI6=wd<0aID0EH%_ZX&P1&0l8U5ZLZjXFK3SxN%ys{ zI9|XZjKY_y8ScGwSEv1&VO&qcan)N(bA>L!QNORqEuAmJ>#)6k43T%J0Tif^Ie^Xk zI@(9|v~?Nmh+EBO86;1XdJHo+OEa=-xLqHeh{J!ofM%A6Rf$U&mLb&S2@00}tMwY% zoU7LEO%iD|ncZ9^dz);l64jP#d~w*SIT#W7pa#dPTfVx}LrsIJi;Qr!;DSg7_mMe&SM!ypqQPRk&p`W(AQ3ZoTwTf$65=%(q|kxKa_f>T{4K4>oz_&r=Y~YDFwOcGslS>>ZP3Y@I6L3Cw+&4NttXf>^udPs>kP( z9Okzj7(NWL=~I@_5X8CBWHwq{>*vPv@h-`tU%X!O8((3W3<%D@8{$dgl@|yVr?;*b z)V?u}0L3&&)lL*W`hZ$civgkCON4#tg=ghs>%a~>llPw(MVC+)N$qMF4a5d1HWy+f zlH-qGTo&vUmDS#=;paE4jWFS!HBB{?5VtUhGm8pb1^18Axh}pr(m@i%u{Mi=7#YI} znzWR+Jc*75)vdA8`GHRnT9cV-?L;7R$!bJ-`J*S!T01q)9l8ZyA~pXYQ~XOQrKmZ|V@?S0 zgWD&czfXOI!DH5qUp?!Y^WitIKhIaPDs7d)tWBIfpUYVMOEX8h>&o;StsQ&?aK~OW z=%LM1`^MuGWz|Db_bLyB`c-4eIiP?)Oel9=MQOqRXin%LLGZPD&UK3uImR2jS~U?b zyaJc8+={ld9EwBJ6dH|l9M@M3l|R83epe~%uYBC*@$hi1&{0Z!FY2lDMDvMr3s+Qy zb@HPSA{T$a6&Lv(2i-oi4VZglB{U=<)6RMXd&3U z_?|68n4E81ekzaxQe*W2VEceRq!16SvraC1ky?;t4!zEySaCLriS*F3Y1i+eU)gtFK-*iKQzK^bNZ z6v3WNpZlJ|=x^5E+>@Yu)HSXjrN5V{^ftGMM5Fl5(=6;0V{?0=~Zr1(|EUG z=J>YdqDLkv{IpS|Pf=tCAq|qj?SYNBAcG09TZaxeo!X1vvFN6(R`V8La~Wd%3>TX` zjRubt_`Li2c~nXEJRq4&&X&GQXByf;>`LG94?dB@P4Ns&gN!=vqqIy=W97>YpKM_mAc*{^iWu@&DD zlEa8lr;lSyS=KM0azMUcY7BkP?ip6y7PnxF^FQ07MYa4=75nWowO}PJ4l3$+L#aLU zjzER^I}89j3XKshyuMGQRe>-RC%PD?IJsJ?ZM6QXrEre0yc3m+J_KM zZnQ_a_sU3U+V!UV?3t(6Vwjim0CoVvVhck^Hpx}?OHOdO?oqlxPohM$+eQW5Fpb>mftF*g49ye-wj0zQYB+wf*s0^z=>G$^*-3(=ILjuspo4&6t;+yO@)T5z! zN=<|KW1HjtCj`@tsZarOp!Msjb!Q3F)4+HG%eg>>ZrP7dav6%$c1Py~4g-AfRqU_} z()h(Qua47A@3vvR6!thd2WDni#nmr?pF$7ciF$rdtU6c=x|Z3{Z98zStBO!E)Sp-5 z39X@wlGO_1DOtK`><`!tuSWbylFBBKlG(F}3kz#sBe5-aj$17M#i(OdwC!S9?2KU} zgv9REWGG(Z<%?{N)-~n`RGCBpd zTu)_TfsIQ?L$vPJSYlZsHFEHkbXhEs;6K08V~LY%7a_#Ndx*-D^|!KR)_YQu4O8b@ z7k_Z11V6Mx^~SgD6pJ0O@ybafmGuKN5w34DK>yC`tjx++4UkAA5{X12kw_%mQHac-__;s9@+s5I44htYq%P7O2>oF2`lnD9< zy=^RxI1J^&&k95!ID!@-F>4rK;cESD`Sl0^1V<2;bu1>mWvm1z?4SsGT6`E}$mU+T zOoW#Gpa>#ye!#t;D9L8)Kz%?@@FxTiTK2soh|9V{elG&mz~OoM_~n1U4~k1_U#jN{ zHI;Am9UQ4q?VOiuB|PvFs7=f~wEDOQYSb^z%P)_+wtZWC{Dbyz?eoS|_E&w%zSj_& zV8x-Vs}V;89H6Fi*!6eLd7s3okNDh>(eo|)&H{1tP}m7Crbbs#n+nzM5L2J%o^%Ga zbz?uuQ)*K#QnvdI-8&p{7D!&!8*$#2t0Oo-(ROS&=dJuRq;tE7w2WovoarP`({HKo z?R)x(!(1aDcKy8>UU!GJi%8t3wdWDzBoI|CLCN$NhvM^0cU)%hm|R41otlUR+9-bG zywf-D6(Ww?@S4Rzr2aG+q_qpILtMcj&;|kk0-Do6-iOTW(NWSL;|&m zxv$?NTpT*bh3fp0#2XsCjy(#B3I)c~aRkSgFno*XTGtd!~y5iAX$E zktA%ZKr~~1t>0=Fhm16yaa)H+hFUwksKpp`Yf?Dh`vQI_f^x zWv@H`+#y6HqdlAHH&mKVpJprg8+!O2olJtUet1m=5TjsT%;kHo;fg_^tkfyKLRN>a z@uR0TZlBf#1ehj=^p%C>U0v`s`PyAu&GrnNb4yyUNGlLujEyGE=7=KIrt&T@$JEGQ zoT-_%uRE48CTTXUYN(-Ra}<%t`{|4zU2}SyCLj8W!^hKiJcI%3JgCNG->^AQr0PuO z{d8d~7IxS3YI<*GtO7MF0`-Am7pq8=Zcnh1l^Fm*Zm!hJ{5 zvObHKKuw=kdtH#8C9Nv_dde#cv%^o|{rFvx60@&g?&M3%vQd0Il@AFm7u>K`H0)?X z`r6~g1Pff&zgUGQLGK4y`ZOt2($#kJB35j1_zQ}rCWhk!Xv)56!Z%+yF%JV@Di3}~ zF-NxJkgy*V-^6^AV1b&lZ|&3OfPZ4XNtE}b4fgDuFx#juL=mX9XJaJnDA;UN7lO+C zERo87AYo;FmZ<;j6RGS6A+b?ih$>KP&mLh;`1V^SqW{Ms&4vr|jrw?a$VSZ Date: Sat, 16 Dec 2023 17:16:55 -0600 Subject: [PATCH 5/8] fix: add launch.json file --- .gitignore | 3 ++- .vscode/launch.json | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .vscode/launch.json diff --git a/.gitignore b/.gitignore index 8481af0..8e16fba 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ node_modules/ dist # Custom -.vscode \ No newline at end of file +.vscode/*.json +!.vscode/launch.json \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..1aa51ad --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Run Agent Black", + "program": "index.js", + "cwd": "${workspaceFolder}/dist", + "runtimeArgs": ["--no-warnings"], // Experimental notice + "envFile": "${workspaceFolder}/.env" + } + ] +} From fdf68866e8a4b2e87c7bcf51016249f8f69bb681 Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 18 Dec 2023 23:23:53 +0100 Subject: [PATCH 6/8] add TS support --- .vscode/launch.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 1aa51ad..244233f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,10 +5,21 @@ "type": "node", "request": "launch", "name": "Run Agent Black", + "skipFiles": [ + "/**" + ], "program": "index.js", "cwd": "${workspaceFolder}/dist", - "runtimeArgs": ["--no-warnings"], // Experimental notice - "envFile": "${workspaceFolder}/.env" + "runtimeArgs": [ + // "--experimental-json-modules", + "--experimental-specifier-resolution=node", + // "--no-warnings" + ], + "envFile": "${workspaceFolder}/.env", + "preLaunchTask": "tsc: build - tsconfig.json", + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ] } ] } From 19003b1922c43eeb9ca5b026484186a5a87702d8 Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 18 Dec 2023 23:25:04 +0100 Subject: [PATCH 7/8] update runtime Args --- .vscode/launch.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 244233f..0c57b8c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,9 +11,7 @@ "program": "index.js", "cwd": "${workspaceFolder}/dist", "runtimeArgs": [ - // "--experimental-json-modules", - "--experimental-specifier-resolution=node", - // "--no-warnings" + "--no-warnings" ], "envFile": "${workspaceFolder}/.env", "preLaunchTask": "tsc: build - tsconfig.json", From 33c96a0f21c72ce3b679630f5dbe5e920aa1e83f Mon Sep 17 00:00:00 2001 From: Tavi <66774833+totallytavi@users.noreply.github.com> Date: Sun, 7 Jan 2024 04:54:59 -0600 Subject: [PATCH 8/8] minor: fix comments * Add ban command * Add default permissions for ban and setup * Add ephemeral tags where needed * Add guild settings db model * Add model typing explanation comments * Add guild authentication util function * Add interaction master handler * Update config references * Update model typings * Update commands to spread arguments --- .eslintrc.json | 2 +- package-lock.json | 246 ++++-------------- package.json | 4 - src/classes/banManager.ts | 8 +- src/commands/about.ts | 12 +- src/commands/alias.ts | 23 +- src/commands/alias/add.ts | 44 ++-- src/commands/alias/remove.ts | 9 +- src/commands/alias/update.ts | 9 +- src/commands/avatar.ts | 16 +- src/commands/ban.ts | 70 +++++ src/commands/banner.ts | 14 +- src/commands/broadcast.ts | 72 +++-- src/commands/changelog.ts | 10 +- src/commands/checkallusers.ts | 32 ++- src/commands/checkallusers/handler.ts | 8 +- src/commands/eval.ts | 13 +- src/commands/guild.ts | 32 +-- src/commands/guild/disable.ts | 7 +- src/commands/guild/enable.ts | 5 +- src/commands/guild/setup.ts | 54 ++-- src/commands/guild/stats.ts | 13 +- src/commands/guildmgr.ts | 15 +- src/commands/guildmgr/add.ts | 77 +++--- src/commands/guildmgr/block.ts | 9 +- src/commands/guildmgr/info.ts | 17 +- src/commands/guildmgr/remove.ts | 9 +- src/commands/help.ts | 10 +- src/commands/lookup.ts | 20 +- src/commands/lookup/aliasOverview.ts | 2 +- src/commands/lookup/userBans.ts | 2 +- src/commands/lookup/userWarns.ts | 2 +- src/commands/maintainer.ts | 23 +- src/commands/maintainer/add.ts | 10 +- src/commands/maintainer/info.ts | 9 +- src/commands/maintainer/remove.ts | 9 +- src/commands/ping.ts | 14 +- src/commands/syncallbans.ts | 14 +- src/commands/syncbans.ts | 28 +- src/commands/unban.ts | 32 +-- src/commands/warn.ts | 16 +- src/commands/warn/add.ts | 9 +- src/commands/warn/edit.ts | 9 +- src/configs/config.json | 5 +- src/configs/example_config.json | 11 - src/database/models/alias.ts | 58 +---- src/database/models/ban.ts | 21 +- src/database/models/guild.ts | 59 ++--- src/database/models/guildsettings.ts | 98 +++++++ src/database/models/user.ts | 3 +- src/database/models/warn.ts | 34 +-- .../events/interactionCreate/command.ts | 7 +- .../events/interactionCreate/component.ts | 2 +- .../events/interactionCreate/main.ts | 34 +++ src/functions/events/ready/commands.ts | 22 +- src/functions/load.ts | 64 ++--- src/functions/utils/guildAuth.ts | 16 ++ src/functions/utils/masterMessage.ts | 44 ++-- src/functions/utils/pagination.ts | 11 +- src/index.ts | 26 +- src/typings/Bitfield.js | 6 +- src/typings/Extensions.ts | 19 +- src/typings/Models.ts | 44 ++-- src/typings/StaffFlags.ts | 6 +- 64 files changed, 757 insertions(+), 872 deletions(-) create mode 100644 src/commands/ban.ts delete mode 100644 src/configs/example_config.json create mode 100644 src/database/models/guildsettings.ts create mode 100644 src/functions/events/interactionCreate/main.ts create mode 100644 src/functions/utils/guildAuth.ts diff --git a/.eslintrc.json b/.eslintrc.json index 3f2b25b..d3c83fb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -18,6 +18,6 @@ { "argsIgnorePattern": "^_" } - ] + ] } } diff --git a/package-lock.json b/package-lock.json index 2149ed4..eb50f88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,23 +12,19 @@ "axios": "1.6.2", "bufferutil": "4.0.8", "discord.js": "14.14.1", - "html-to-image": "1.11.11", "mysql2": "3.6.5", - "pino": "8.17.0", - "pretty-ms": "8.0.0", + "pino": "8.17.1", "sequelize": "6.35.2", "typescript": "5.3.3", "utf-8-validate": "6.0.3" }, "devDependencies": { - "@types/bunyan": "1.8.11", "@types/node": "20.10.4", "@typescript-eslint/eslint-plugin": "6.14.0", "@typescript-eslint/parser": "6.14.0", - "eslint": "8.55.0", - "eslint-config-airbnb-base": "15.0.0", + "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", - "eslint-plugin-import": "2.29.0", + "eslint-plugin-import": "2.29.1", "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "lint-staged": "15.2.0", @@ -190,9 +186,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -325,15 +321,6 @@ "npm": ">=7.0.0" } }, - "node_modules/@types/bunyan": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", - "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -1085,12 +1072,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1447,15 +1428,15 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1501,34 +1482,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", @@ -1588,9 +1541,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { "array-includes": "^3.1.7", @@ -1609,7 +1562,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -2329,11 +2282,6 @@ "node": ">= 0.4" } }, - "node_modules/html-to-image": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz", - "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" - }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -3105,10 +3053,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/moment": { "version": "2.29.4", @@ -3258,20 +3209,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.fromentries": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", @@ -3397,17 +3334,6 @@ "node": ">=6" } }, - "node_modules/parse-ms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3477,9 +3403,9 @@ } }, "node_modules/pino": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.0.tgz", - "integrity": "sha512-ey+Mku+PVPhvxglLXMg1l1zQMwSHuNrKC3MD40EDZbkckJmmuY7DYZLIOwwjZ8ix/Nvhe9dZt5H99cgkot9bAw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz", + "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -3547,20 +3473,6 @@ "node": ">=6.0.0" } }, - "node_modules/pretty-ms": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", - "dependencies": { - "parse-ms": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -4447,9 +4359,9 @@ "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -4926,9 +4838,9 @@ } }, "@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true }, "@fastify/busboy": { @@ -5018,15 +4930,6 @@ "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==" }, - "@types/bunyan": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", - "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -5526,12 +5429,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", - "dev": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5803,15 +5700,15 @@ "dev": true }, "eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5893,26 +5790,6 @@ } } }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "eslint-config-prettier": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", @@ -5963,9 +5840,9 @@ } }, "eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "requires": { "array-includes": "^3.1.7", @@ -5984,7 +5861,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "dependencies": { "debug": { @@ -6434,11 +6311,6 @@ "function-bind": "^1.1.2" } }, - "html-to-image": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz", - "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" - }, "human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -6956,9 +6828,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "moment": { @@ -7068,17 +6940,6 @@ "object-keys": "^1.1.1" } }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, "object.fromentries": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", @@ -7171,11 +7032,6 @@ "callsites": "^3.0.0" } }, - "parse-ms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==" - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -7224,9 +7080,9 @@ "dev": true }, "pino": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.0.tgz", - "integrity": "sha512-ey+Mku+PVPhvxglLXMg1l1zQMwSHuNrKC3MD40EDZbkckJmmuY7DYZLIOwwjZ8ix/Nvhe9dZt5H99cgkot9bAw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz", + "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==", "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", @@ -7276,14 +7132,6 @@ "fast-diff": "^1.1.2" } }, - "pretty-ms": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", - "requires": { - "parse-ms": "^3.0.0" - } - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7861,9 +7709,9 @@ "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" }, "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", diff --git a/package.json b/package.json index caddfa1..14130c2 100644 --- a/package.json +++ b/package.json @@ -7,21 +7,17 @@ "axios": "1.6.2", "bufferutil": "4.0.8", "discord.js": "14.14.1", - "html-to-image": "1.11.11", "mysql2": "3.6.5", "pino": "8.17.1", - "pretty-ms": "8.0.0", "sequelize": "6.35.2", "typescript": "5.3.3", "utf-8-validate": "6.0.3" }, "devDependencies": { - "@types/bunyan": "1.8.11", "@types/node": "20.10.4", "@typescript-eslint/eslint-plugin": "6.14.0", "@typescript-eslint/parser": "6.14.0", "eslint": "8.56.0", - "eslint-config-airbnb-base": "15.0.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-prettier": "5.0.1", diff --git a/src/classes/banManager.ts b/src/classes/banManager.ts index 917d73f..cb316e6 100644 --- a/src/classes/banManager.ts +++ b/src/classes/banManager.ts @@ -1,6 +1,6 @@ import { Guild, GuildBan, PermissionFlagsBits, UserFlags } from 'discord.js'; import { Sequelize } from 'sequelize'; -import { Ban } from '../typings/Models.js'; +import { ban } from '../typings/Models.js'; /** * @description Ban manager data @@ -72,9 +72,9 @@ class BanManager { * @description Syncs the manager with the database, adding bans that don't exist in the database * @returns {Promise} Result from Sequelize */ - sync(): Promise[]> { + sync(): Promise[]> { this.clean(); // Clean bans - const p: Promise<[Ban, boolean]>[] = []; + const p: Promise<[ban, boolean]>[] = []; for (const ban of this.bans) { p.push( this.sequelize.models.ban.findOrCreate({ @@ -83,7 +83,7 @@ class BanManager { targetId: ban.user.id, reason: String(ban.reason) } - }) as Promise<[Ban, boolean]> + }) as Promise<[ban, boolean]> ); } return Promise.allSettled(p); diff --git a/src/commands/about.ts b/src/commands/about.ts index 7ac4fc6..98b11e8 100644 --- a/src/commands/about.ts +++ b/src/commands/about.ts @@ -1,12 +1,14 @@ -import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { EmbedBuilder, SlashCommandBuilder } from 'discord.js'; import { readFileSync } from 'node:fs'; import { default as config } from '../configs/config.json' assert { type: 'json' }; -import { CustomClient } from '../typings/Extensions.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; const { commands } = config; -export const name = 'log'; -export const data = new SlashCommandBuilder().setName(name).setDescription('Displays some information about the bot'); -export async function run(_client: CustomClient, interaction: ChatInputCommandInteraction): Promise { +export const ephemeral = false; +export const data = new SlashCommandBuilder() + .setName('about') + .setDescription('Displays some information about the bot'); +export async function execute({ interaction }: CmdFileArgs): Promise { interaction.editReply({ embeds: [new EmbedBuilder().setDescription(readFileSync(commands.about).toString())] }); diff --git a/src/commands/alias.ts b/src/commands/alias.ts index dc820c7..e7d1db3 100644 --- a/src/commands/alias.ts +++ b/src/commands/alias.ts @@ -1,10 +1,9 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'alias'; export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('alias') .setDescription('Creates, updates, or removes an alias for a user') .addSubcommand((subcommand) => { return subcommand @@ -36,20 +35,16 @@ export const data = new SlashCommandBuilder() return option.setName('alias').setDescription('Alias ID to delete').setRequired(true); }); }); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { - const dbUser = await client.models.user.findOne({ - where: { userId: interaction.user.id } - }); - if (!dbUser || !dbUser.flags.any(['Moderator', 'Maintainer'])) { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { + // If they don't have the staff role, they can't use this command + if (!(await client.functions.get('utils_guildAuth').execute(client, interaction.member))) { interaction.editReply({ content: 'You are not authorized to use this command' }); return; } - await client.commands.get(`${name}_${options.getSubcommand()}`).run(client, interaction, options); + await client.commands + .get(`${interaction.commandName}_${options.getSubcommand()}`) + .execute({ client, interaction, options }); return; } diff --git a/src/commands/alias/add.ts b/src/commands/alias/add.ts index 21b9452..66d600a 100644 --- a/src/commands/alias/add.ts +++ b/src/commands/alias/add.ts @@ -1,20 +1,14 @@ -import { Alias, AliasCreationAttributes } from '../../typings/Models.js'; import { Op, UniqueConstraintError } from 'sequelize'; -import { CustomClient } from '../../typings/Extensions.js'; -import { ChatInputCommandInteraction } from 'discord.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; +import { alias, aliasCreationAttributes } from '../../typings/Models.js'; export const name = 'add'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { - if ( - options.getUser('user', true).id === options.getUser('alias', true).id || - options.getUser('user', true).id === interaction.user.id || - options.getUser('alias', true).id === interaction.user.id - ) { - interaction.editReply({ content: 'You cannot alias yourself or the same two users' }); +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { + const optUser = options.getUser('user', true); + const optAlias = options.getUser('alias', true); + // Check if aliasing the same two users + if (optUser.id === optAlias.id) { + interaction.editReply({ content: 'You cannot alias the same two users' }); return; } // Check if the alias already exists or exists in reverse @@ -22,12 +16,12 @@ export async function run( where: { [Op.or]: [ { - user: options.getUser('user', true).id, - alternative: options.getUser('alias', true).id + user: optUser.id, + alternative: optAlias.id }, { - user: options.getUser('alias', true).id, - alternative: options.getUser('user', true).id + user: optAlias.id, + alternative: optUser.id } ] } @@ -39,20 +33,20 @@ export async function run( return; } // Create the alias - const attr: AliasCreationAttributes = { - user: options.getUser('user', true).id, - alternative: options.getUser('alias', true).id, + const attr: aliasCreationAttributes = { + user: optUser.id, + alternative: optAlias.id, moderator: interaction.user.id }; // Check if alternative has an alias. If so, set the alternative to the primary account - const alt = await client.models.alias.findOne({ where: { user: options.getUser('alias', true).id } }); + const alt = await client.models.alias.findOne({ where: { user: optAlias.id } }); if (alt !== null) { attr.user = alt.user; - attr.alternative = options.getUser('user', true).id; + attr.alternative = optUser.id; } // Create and handle the alias await client.models.alias.create(attr).then( - (dbAlias: Alias) => { + (dbAlias: alias) => { if (!dbAlias) { interaction.editReply({ content: 'Failed to create the association in the database. Please try again later' @@ -60,7 +54,7 @@ export async function run( return; } interaction.editReply({ - content: `Success! ${options.getUser('user', true).toString()} has been aliased to ${options + content: `Success! ${optUser.toString()} has been aliased to ${options .getUser('alias', true) .toString()} with ID \`${dbAlias.aliasId}\`` }); diff --git a/src/commands/alias/remove.ts b/src/commands/alias/remove.ts index baf83e9..92d737f 100644 --- a/src/commands/alias/remove.ts +++ b/src/commands/alias/remove.ts @@ -1,12 +1,7 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'remove'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const dbAlias = await client.models.alias.findOne({ where: { aliasId: options.getString('alias', true) } }); diff --git a/src/commands/alias/update.ts b/src/commands/alias/update.ts index 83d5486..229b1b8 100644 --- a/src/commands/alias/update.ts +++ b/src/commands/alias/update.ts @@ -1,12 +1,7 @@ -import { CustomClient } from '../../typings/Extensions.js'; -import { ChatInputCommandInteraction } from 'discord.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'update'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { if ( options.getUser('user', true).id === options.getUser('alias', true).id || options.getUser('user', true).id === interaction.user.id || diff --git a/src/commands/avatar.ts b/src/commands/avatar.ts index 3e5723c..32f8768 100644 --- a/src/commands/avatar.ts +++ b/src/commands/avatar.ts @@ -1,25 +1,21 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'avatar'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('avatar') .setDescription("Fetches a user's profile picture") .addUserOption((option) => { return option.setName('user').setDescription('User to fetch').setRequired(true); }); -export async function run( - _client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ interaction, options }: CmdFileArgs): Promise { interaction.editReply({ embeds: [ { description: `Avatar for ${options.getUser('user', true).toString()}`, image: { url: - options.getUser('user', true).displayAvatarURL({ size: 2048 }) || + options.getUser('user', true).displayAvatarURL({ size: 4096 }) || 'https://cdn.discordapp.com/embed/avatars/5.png' } } diff --git a/src/commands/ban.ts b/src/commands/ban.ts new file mode 100644 index 0000000..8ee4e46 --- /dev/null +++ b/src/commands/ban.ts @@ -0,0 +1,70 @@ +import { PermissionFlagsBits, SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; + +export const ephemeral = true; +export const data = new SlashCommandBuilder() + .setName('ban') + .setDescription('Permanently bans a user from the server') + .addUserOption((option) => { + return option.setName('user').setDescription('The user to ban').setRequired(true); + }) + .addStringOption((option) => { + return option.setName('reason').setDescription('Reason for ban, if any').setAutocomplete(true).setRequired(false); + }) + .addNumberOption((option) => { + return option.setName('delete_messages').setDescription('Time to delete messages').setChoices( + { + name: "Don't Delete Any", + value: 0 + }, + { + name: '1 Hour', + value: 3600 + }, + { + name: '6 Hours', + value: 21600 + }, + { + name: '12 Hours', + value: 43200 + }, + { + name: '24 Hours', + value: 86400 + }, + { + name: '3 Days', + value: 259200 + }, + { + name: '7 Days', + value: 604800 + } + ); + }) + // Only allow users with the Ban Members permission to use this command + .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers); +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { + const target = options.getUser('user', true); + // Check if we can ban + if (!interaction.guild.members.me.permissions.has(PermissionFlagsBits.BanMembers)) { + interaction.editReply({ content: 'This bot needs the `Ban Members` permission' }); + return; + } + // Ban on Discord's side, removiung the ban if it exists + const b = await interaction.guild.bans.fetch(target); + if (b) await interaction.guild.bans.remove(target.id); + await interaction.guild.bans.create(target, { + reason: options.getString('reason') || undefined, + deleteMessageSeconds: options.getNumber('deleteMessages') || undefined + }); + // Find or create the ban in the database + await client.models.ban.findOrCreate({ + where: { + guildId: interaction.guild.id, + targetId: target.id, + reason: options.getString('reason') || null + } + }); +} diff --git a/src/commands/banner.ts b/src/commands/banner.ts index a8c3231..1f17319 100644 --- a/src/commands/banner.ts +++ b/src/commands/banner.ts @@ -1,18 +1,14 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'banner'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('banner') .setDescription("Fetches a user's banner") .addUserOption((option) => { return option.setName('user').setDescription('User to fetch').setRequired(true); }); -export async function run( - _client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ interaction, options }: CmdFileArgs): Promise { await options.getUser('user').fetch(); interaction.editReply({ embeds: [ diff --git a/src/commands/broadcast.ts b/src/commands/broadcast.ts index fe689db..a16416a 100644 --- a/src/commands/broadcast.ts +++ b/src/commands/broadcast.ts @@ -1,19 +1,35 @@ -import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'broadcast'; -export const ephemeral = false; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('broadcast') .setDescription('Broadcasts a message to all participating servers') + .addNumberOption((option) => { + return option.setName('type').setDescription('Type of message').setRequired(true).setChoices( + { + name: 'Broadcast', + value: 0x6699ff + }, + { + name: 'Maintenance', + value: 0x77b300 + }, + { + name: 'Security Alert', + value: 0xff0000 + }, + { + name: 'Other', + value: 0x000000 + } + ); + }) .addStringOption((option) => { return option.setName('message').setDescription('Content to message to servers').setRequired(true); }); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { + const kind = options.getNumber('type', true); const dbUser = await client.models.user.findOne({ where: { userId: interaction.user.id } }); @@ -30,39 +46,9 @@ export async function run( }); return; } - // Convert body + // Clean body const body = options.getString('message', true).replace(/\\n/g, '\n'); // Send message - interaction.editReply({ content: 'Sending messages...' }); - const guilds = await client.models.guild.findAll({ - where: { enabled: true, banned: false } - }); - const errors: { guildId: string; error: string }[] = []; - guilds.forEach((g) => { - client.channels - .fetch(g.settings.channel) - .then((c) => { - if (!c || !c.isTextBased()) { - errors.push({ - guildId: g.guildId, - error: 'Invalid channel provided' - }); - return; - } - c.send({ - content: `Message from Maintainer ${interaction.user.toString()}`, - embeds: [new EmbedBuilder().setDescription(body).setColor(4182379)] - }).catch((e) => errors.push({ guildId: g.guildId, error: e.message })); - }) - .catch((e) => errors.push({ guildId: g.guildId, error: e.message })); - }); - if (errors.length > 0) { - interaction.editReply({ - content: 'Success! Messages are being broadcast to all servers, but some errors occurred' - }); - } else { - interaction.editReply({ - content: 'Success! Messages are being broadcast to all servers without errors' - }); - } + client.functions.get('utils_masterMessage').execute(client, kind, body); + interaction.editReply({ content: 'Messages are being sent!' }); } diff --git a/src/commands/changelog.ts b/src/commands/changelog.ts index 6953cda..696a1b2 100644 --- a/src/commands/changelog.ts +++ b/src/commands/changelog.ts @@ -1,14 +1,14 @@ -import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { EmbedBuilder, SlashCommandBuilder } from 'discord.js'; import { readFileSync } from 'node:fs'; import { default as config } from '../configs/config.json' assert { type: 'json' }; -import { CustomClient } from '../typings/Extensions.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; const { commands } = config; -export const name = 'changelog'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('changelog') .setDescription('Displays current version and changes as of the most recent update'); -export async function run(_client: CustomClient, interaction: ChatInputCommandInteraction): Promise { +export async function execute({ interaction }: CmdFileArgs): Promise { interaction.editReply({ embeds: [new EmbedBuilder().setDescription(readFileSync(commands.changelog).toString())] }); diff --git a/src/commands/checkallusers.ts b/src/commands/checkallusers.ts index e3ab718..d7bc0ef 100644 --- a/src/commands/checkallusers.ts +++ b/src/commands/checkallusers.ts @@ -1,9 +1,9 @@ -import { ChatInputCommandInteraction, PermissionFlagsBits, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'checkallusers'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('checkallusers') .setDescription('Checks all users in the current server') .addStringOption((option) => { return option @@ -14,8 +14,9 @@ export const data = new SlashCommandBuilder() value: 'yes' }); }); -export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { - if ((interaction.member.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { +export async function execute({ client, interaction }: CmdFileArgs): Promise { + // Check if they have the role + if (!(await client.functions.get('utils_guildAuth').execute(client, interaction.member))) { interaction.editReply({ content: 'You are not authorized to use this command' }); @@ -28,18 +29,32 @@ export async function run(client: CustomClient, interaction: ChatInputCommandInt return; } const ids = users.map((user) => user.id); + // Get their aliases, if any exist + await client.models.alias + .findAll({ + where: { user: ids } + }) + // Map to alternative + .then((aliases) => aliases.map((a) => a.alternative)) + // Push to the list + .then((aliases) => aliases.forEach((a) => ids.push(a))) + // Catch and log the errors for later inspection + .catch((err) => client.logs.error({ err })); + // Find all bans relevant to the server const allBans = await client.models.ban.findAll({ where: { targetId: ids } }); + // We didn't find anyone banned if (!allBans || allBans.length === 0) { interaction.editReply({ content: `Success! Scanned all members and found no bans. Your server is clean` }); return; } + // If less than 5, emit embeds if (allBans.length <= 5) { allBans.forEach(async (ban) => { - const g = client.guilds.cache.get(ban.guildId) || (await client.guilds.fetch(ban.guildId)); + const g = await client.guilds.fetch(ban.guildId); interaction.followUp({ embeds: [ { @@ -56,7 +71,8 @@ export async function run(client: CustomClient, interaction: ChatInputCommandInt }); return; } + // If there's more than 5, send to the handler // @ts-expect-error This function has different parameters - await client.commands.get('checkallusers_handler').run(client, interaction, allBans); + await client.commands.get('checkallusers_handler').execute(client, interaction, allBans); return; } diff --git a/src/commands/checkallusers/handler.ts b/src/commands/checkallusers/handler.ts index a1fb53b..a901057 100644 --- a/src/commands/checkallusers/handler.ts +++ b/src/commands/checkallusers/handler.ts @@ -1,9 +1,13 @@ import { ChatInputCommandInteraction, EmbedBuilder } from 'discord.js'; import { CustomClient } from '../../typings/Extensions.js'; -import { Ban } from '../../typings/Models.js'; +import { ban } from '../../typings/Models.js'; export const name = 'handler'; -export async function run(client: CustomClient, interaction: ChatInputCommandInteraction, bans: Ban[]): Promise { +export async function execute( + client: CustomClient, + interaction: ChatInputCommandInteraction, + bans: ban[] +): Promise { // Split the bans into groups of 5 const banGroups: EmbedBuilder[][] = []; let temp: EmbedBuilder[] = []; diff --git a/src/commands/eval.ts b/src/commands/eval.ts index fa916da..a7d71c6 100644 --- a/src/commands/eval.ts +++ b/src/commands/eval.ts @@ -1,19 +1,14 @@ -import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'eval'; export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('eval') .setDescription('Runs snippets of code') .addStringOption((option) => { return option.setName('script').setDescription('The code to run').setRequired(true); }); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const dbUser = await client.models.user.findOne({ where: { userId: interaction.user.id } }); diff --git a/src/commands/guild.ts b/src/commands/guild.ts index b74511a..a498bec 100644 --- a/src/commands/guild.ts +++ b/src/commands/guild.ts @@ -1,16 +1,9 @@ -import { - ChannelType, - ChatInputCommandInteraction, - PermissionFlagsBits, - PermissionsBitField, - SlashCommandBuilder -} from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { ChannelType, PermissionFlagsBits, SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'guild'; export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('guild') .setDescription('Manages your server') .addSubcommand((subcommand) => { return subcommand @@ -25,7 +18,7 @@ export const data = new SlashCommandBuilder() }) .addRoleOption((option) => { return option - .setName('authorised_role') + .setName('staff_role') .setDescription('Role that is required when running staff-only commands') .setRequired(true); }); @@ -38,18 +31,9 @@ export const data = new SlashCommandBuilder() }) .addSubcommand((subcommand) => { return subcommand.setName('stats').setDescription('Returns statistics of the guild'); - }); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -) { - if ((interaction.member.permissions as PermissionsBitField).has(PermissionFlagsBits.ManageGuild)) { - interaction.editReply({ - content: 'You are not authorised to run this command' - }); - return; - } - await client.commands.get(`guild_${options.getSubcommand()}`).run(client, interaction, options); + }) + .setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild); +export async function execute({ client, interaction, options }: CmdFileArgs) { + await client.commands.get(`guild_${options.getSubcommand()}`).execute({ client, interaction, options }); return; } diff --git a/src/commands/guild/disable.ts b/src/commands/guild/disable.ts index 6872ce6..a387552 100644 --- a/src/commands/guild/disable.ts +++ b/src/commands/guild/disable.ts @@ -1,10 +1,9 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'disable'; -export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { +export async function execute({ client, interaction }: CmdFileArgs): Promise { const guild = await client.models.guild.findOne({ - where: { guildId: interaction.guildId as string } + where: { guildId: interaction.guildId } }); if (!guild) { interaction.editReply({ diff --git a/src/commands/guild/enable.ts b/src/commands/guild/enable.ts index 6c597f7..d7e66e3 100644 --- a/src/commands/guild/enable.ts +++ b/src/commands/guild/enable.ts @@ -1,8 +1,7 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'disable'; -export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { +export async function execute({ client, interaction }: CmdFileArgs): Promise { const guild = await client.models.guild.findOne({ where: { guildId: interaction.guildId as string } }); diff --git a/src/commands/guild/setup.ts b/src/commands/guild/setup.ts index e4a1231..d5391ae 100644 --- a/src/commands/guild/setup.ts +++ b/src/commands/guild/setup.ts @@ -1,35 +1,39 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; -import { GuildCreationAttributes } from '../../typings/Models.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'setup'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { - const attr: GuildCreationAttributes = { - guildId: interaction.guild.id as string, - settings: { - channel: options.getChannel('staff_channel', true).id, - role: options.getRole('authorised_role', true).id - } - }; - - const dbResponse = await client.models.guild.findOrCreate({ +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { + const existingGuild = await client.models.guild.findOne({ where: { - guildId: attr.guildId + guildId: interaction.guildId }, - defaults: attr + include: [{ model: client.models.guildsettings, as: 'setting' }] }); - if (!dbResponse) { - interaction.editReply({ - content: 'An error occurred while performing setup. Please try again later' - }); - return; + // Update the database if it exists + if (existingGuild) { + existingGuild.setting.staffRole = options.getRole('staff_role').id; + existingGuild.setting.logChannel = options.getChannel('staff_channel').id; + await existingGuild.setting.save(); + } else { + // Create guild settings first + await client.models.guildsettings + .create({ + staffRole: options.getRole('staff_role').id, + logChannel: options.getChannel('staff_channel').id + }) + // And use that to create the guild entry + .then((s) => + client.models.guild.create({ + guildId: interaction.guildId, + settingsId: s.settingsId, + enabled: true + }) + ) + // Safely catch and log errors + .catch((err) => client.logs.error({ err })); } + // User reply interaction.editReply({ - content: `Success! ${dbResponse[1] ? 'Created' : 'Updated'} guild settings for ${dbResponse[0].guildId}` + content: `Success! ${existingGuild !== null ? 'Updated' : 'Registered and created'} the settings for this server!` }); return; } diff --git a/src/commands/guild/stats.ts b/src/commands/guild/stats.ts index c594e78..f702abf 100644 --- a/src/commands/guild/stats.ts +++ b/src/commands/guild/stats.ts @@ -1,10 +1,11 @@ -import { ChatInputCommandInteraction, EmbedBuilder } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { EmbedBuilder } from 'discord.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'stats'; -export async function run(client: CustomClient, interaction: ChatInputCommandInteraction): Promise { +export async function execute({ client, interaction }: CmdFileArgs): Promise { const guild = await client.models.guild.findOne({ - where: { guildId: interaction.guildId as string } + where: { guildId: interaction.guildId }, + include: [{ model: client.models.guildsettings, as: 'setting' }] }); const owner = await interaction.guild.fetchOwner(); if (!owner) { @@ -31,12 +32,12 @@ export async function run(client: CustomClient, interaction: ChatInputCommandInt embed.addFields([ { name: 'Logging Channel', - value: `<#${guild.settings.channel}> (\`${guild.settings.channel}\`)`, + value: `<#${guild.setting.logChannel}> (\`${guild.setting.logChannel}\`)`, inline: true }, { name: 'Authorised Role', - value: `<@&${guild.settings.role}> (\`${guild.settings.role}\`)`, + value: `<@&${guild.setting.staffRole}> (\`${guild.setting.staffRole}\`)`, inline: true }, { diff --git a/src/commands/guildmgr.ts b/src/commands/guildmgr.ts index 2648bcc..02c30f8 100644 --- a/src/commands/guildmgr.ts +++ b/src/commands/guildmgr.ts @@ -1,11 +1,10 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; import { StaffFlags } from '../typings/StaffFlags.js'; -export const name = 'guildmgr'; export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('guildmgr') .setDescription('[Maintainer] Manages guilds') .addSubcommand((subcommand) => { return subcommand @@ -53,11 +52,7 @@ export const data = new SlashCommandBuilder() return option.setName('server').setDescription('Guild ID to block').setAutocomplete(true).setRequired(true); }); }); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const user = await client.models.user.findOne({ where: { userId: interaction.user.id } }); if (!user) { interaction.editReply({ content: 'You are not authorized to use this command.' }); @@ -67,6 +62,6 @@ export async function run( interaction.editReply({ content: 'You are not authorized to use this command.' }); return; } - await client.commands.get(`guildmgr_${options.getSubcommand(true)}`).run(client, interaction, options); + await client.commands.get(`guildmgr_${options.getSubcommand(true)}`).execute({ client, interaction, options }); return; } diff --git a/src/commands/guildmgr/add.ts b/src/commands/guildmgr/add.ts index e2bff0e..abad548 100644 --- a/src/commands/guildmgr/add.ts +++ b/src/commands/guildmgr/add.ts @@ -1,45 +1,56 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'add'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { - const rawChannel = options.getString('channel', true); - const rawGuild = options.getString('server', true); - const rawRole = options.getString('role', true); - const guild = await client.guilds.fetch(rawGuild); +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { + // Options + const guildId = options.getString('server', true); + const channelId = options.getString('channel', true); + const roleId = options.getString('role', true); + // Try to find guild + const guild = await client.guilds.fetch(guildId); if (!guild) { await interaction.editReply('Invalid argument: Guild not found'); return; } - const channel = guild.channels.cache.get(rawChannel); - if (!channel) { - await interaction.editReply('Invalid argument: Channel not found'); + // Try to find channel and role + const channel = guild.channels.cache.get(channelId); + const role = guild.roles.cache.get(roleId); + if (!channel || !role) { + await interaction.editReply('Invalid argument: Channel and/or role not found'); return; } - const role = guild.roles.cache.get(rawRole); - if (!role) { - await interaction.editReply('Invalid argument: Role not found'); - return; + // Check if guild already exists + const dbGuild = await client.models.guild.findOne({ + where: { guildId }, + include: [{ model: client.models.guildsettings, as: 'setting' }] + }); + // If it does, update settings + if (dbGuild) { + dbGuild.setting.logChannel = channelId; + dbGuild.setting.staffRole = roleId; + await dbGuild.setting.save(); + } else { + // Otherwise create settings + await client.models.guildsettings + .create({ + staffRole: roleId, + logChannel: channelId + }) + // And use that to create the guild entry + .then((s) => + client.models.guild.create({ + guildId, + settingsId: s.settingsId + }) + ) + // Safely catch and log errors + .catch((err) => client.logs.error({ err })); } - if (!client.models) return; // Suppress ESLint unsafe optional chaining - const [, created] = await client.models.guild.findOrCreate({ - where: { - guildId: guild.id - }, - defaults: { - guildId: guild.id, - banned: false, - enabled: true, - settings: { - channel: channel.id, - role: role.id - } - } + // User reply + await interaction.editReply({ + content: `Success! ${dbGuild !== null ? 'Updated' : 'Registered and created'} the settings for ${ + guild.name + } (${guildId})!` }); - interaction.editReply(`Guild ${guild.name} has been ${created ? 'added' : 'updated'} with the settings provided`); return; } diff --git a/src/commands/guildmgr/block.ts b/src/commands/guildmgr/block.ts index fad9b8d..ad8268a 100644 --- a/src/commands/guildmgr/block.ts +++ b/src/commands/guildmgr/block.ts @@ -1,12 +1,7 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'block'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const guildId = options.getString('server', true); const guild = client.guilds.cache.get(guildId); if (!guild) { diff --git a/src/commands/guildmgr/info.ts b/src/commands/guildmgr/info.ts index 4ab1254..58ab397 100644 --- a/src/commands/guildmgr/info.ts +++ b/src/commands/guildmgr/info.ts @@ -1,15 +1,12 @@ -import { ChatInputCommandInteraction, EmbedBuilder } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { EmbedBuilder } from 'discord.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'info'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const guildId = options.getString('server', true); const guild = await client.models.guild.findOne({ - where: { guildId } + where: { guildId }, + include: [{ model: client.models.guildsettings, as: 'setting' }] }); const owner = await interaction.guild.fetchOwner(); if (!owner) { @@ -36,12 +33,12 @@ export async function run( embed.addFields([ { name: 'Logging Channel', - value: `<#${guild.settings.channel}> (\`${guild.settings.channel}\`)`, + value: `<#${guild.setting.logChannel}> (\`${guild.setting.logChannel}\`)`, inline: true }, { name: 'Authorised Role', - value: `<@&${guild.settings.role}> (\`${guild.settings.role}\`)`, + value: `<@&${guild.setting.staffRole}> (\`${guild.setting.staffRole}\`)`, inline: true }, { diff --git a/src/commands/guildmgr/remove.ts b/src/commands/guildmgr/remove.ts index bd0f977..917bda9 100644 --- a/src/commands/guildmgr/remove.ts +++ b/src/commands/guildmgr/remove.ts @@ -1,12 +1,7 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'block'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const guildId = options.getString('server', true); const dbGuild = await client.models.guild.findOne({ where: { guildId } }); if (!dbGuild) { diff --git a/src/commands/help.ts b/src/commands/help.ts index 5714d8f..8c7b8cb 100644 --- a/src/commands/help.ts +++ b/src/commands/help.ts @@ -1,9 +1,9 @@ -import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'help'; -export const data = new SlashCommandBuilder().setName(name).setDescription('Displays help menu'); -export async function run(_client: CustomClient, interaction: ChatInputCommandInteraction): Promise { +export const ephemeral = false; +export const data = new SlashCommandBuilder().setName('help').setDescription('Displays help menu'); +export async function execute({ interaction }: CmdFileArgs): Promise { const embed = new EmbedBuilder().setTitle('Help Panel').setDescription( `Our wiki is found here and details every command: https://github.com/FlippedCode/agent-black/wiki You can also join our server found here: https://discord.gg/TqBwHtzzhD` diff --git a/src/commands/lookup.ts b/src/commands/lookup.ts index 84845a5..be051fc 100644 --- a/src/commands/lookup.ts +++ b/src/commands/lookup.ts @@ -1,22 +1,18 @@ -import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; -import { CustomClient, FlagEmoji } from '../typings/Extensions.js'; +import { EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { FlagEmoji, CmdFileArgs } from '../typings/Extensions.js'; // Load functions from other files -import { run as aliasOverview } from './lookup/aliasOverview.js'; -import { run as userBans } from './lookup/userBans.js'; -import { run as userWarns } from './lookup/userWarns.js'; +import { execute as aliasOverview } from './lookup/aliasOverview.js'; +import { execute as userBans } from './lookup/userBans.js'; +import { execute as userWarns } from './lookup/userWarns.js'; -export const name = 'lookup'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('lookup') .setDescription('Fetches data from the Discord API and Agent Black database') .addUserOption((option) => { return option.setName('user').setDescription('The user to search').setRequired(true); }); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { // Definitions const user = options.getUser('user', true), aliases = (await client.models.alias.findAll({ where: { user: user.id } })) || []; diff --git a/src/commands/lookup/aliasOverview.ts b/src/commands/lookup/aliasOverview.ts index e6f517c..4858330 100644 --- a/src/commands/lookup/aliasOverview.ts +++ b/src/commands/lookup/aliasOverview.ts @@ -2,7 +2,7 @@ import { EmbedBuilder } from 'discord.js'; import { CustomClient } from '../../typings/Extensions.js'; export const name = 'aliasOverview'; -export async function run(client: CustomClient, target: string): Promise { +export async function execute(client: CustomClient, target: string): Promise { // Variables const aliases = await client.models.alias.findAll({ where: { user: target } }); // No aliases diff --git a/src/commands/lookup/userBans.ts b/src/commands/lookup/userBans.ts index fc601e6..e7337f4 100644 --- a/src/commands/lookup/userBans.ts +++ b/src/commands/lookup/userBans.ts @@ -6,7 +6,7 @@ function escape(str: string): string { } export const name = 'userBans'; -export async function run(client: CustomClient, user: string): Promise { +export async function execute(client: CustomClient, user: string): Promise { const bans = await client.models.ban.findAll({ where: { targetId: user } }); const u = await client.users.fetch(user); const e: EmbedBuilder[] = []; diff --git a/src/commands/lookup/userWarns.ts b/src/commands/lookup/userWarns.ts index 0c88d83..05c59b3 100644 --- a/src/commands/lookup/userWarns.ts +++ b/src/commands/lookup/userWarns.ts @@ -6,7 +6,7 @@ function escape(str: string): string { } export const name = 'userWarns'; -export async function run(client: CustomClient, user: string): Promise { +export async function execute(client: CustomClient, user: string): Promise { const warns = await client.models.warn.findAll({ where: { targetId: user } }); const u = await client.users.fetch(user); if (!u) return []; diff --git a/src/commands/maintainer.ts b/src/commands/maintainer.ts index 5d06e7a..02642e4 100644 --- a/src/commands/maintainer.ts +++ b/src/commands/maintainer.ts @@ -1,9 +1,9 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'maintainer'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('maintainer') .setDescription('Manages the maintainers [STAFF ONLY]') .addUserOption((option) => option.setName('user').setDescription('Target user').setRequired(true)) .addStringOption((option) => @@ -26,22 +26,13 @@ export const data = new SlashCommandBuilder() ) .setRequired(true) ); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { - const u = await client.models.user.findOne({ where: { userId: interaction.user.id } }); - if (!u || !u.flags.has('Moderator')) { - interaction.editReply({ content: 'You are not authorised to use this command' }); - return; - } - // -- // +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const act = options.getString('action', true); + const u = await client.models.user.findOne({ where: { userId: interaction.user.id } }); if (act !== 'info' && !u.flags.has('Owner')) { interaction.editReply({ content: 'You are not authorised to use perform that action' }); return; } // -- // - client.commands.get(`${name}_${act}`).run(client, interaction, options); + client.commands.get(`${interaction.commandName}_${act}`).execute({ client, interaction, options }); } diff --git a/src/commands/maintainer/add.ts b/src/commands/maintainer/add.ts index f27ebe3..bc9d9ac 100644 --- a/src/commands/maintainer/add.ts +++ b/src/commands/maintainer/add.ts @@ -1,13 +1,9 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'add'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const m = await options.getUser('user'); + // Find or create the user const [u] = await client.models.user.findOrCreate({ where: { userId: m.id } }); diff --git a/src/commands/maintainer/info.ts b/src/commands/maintainer/info.ts index b9298b4..7b0ba01 100644 --- a/src/commands/maintainer/info.ts +++ b/src/commands/maintainer/info.ts @@ -1,12 +1,7 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'info'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const m = await options.getUser('user'); const u = await client.models.user.findOne({ where: { userId: m.id } }); if (!u) { diff --git a/src/commands/maintainer/remove.ts b/src/commands/maintainer/remove.ts index 21da969..88c8355 100644 --- a/src/commands/maintainer/remove.ts +++ b/src/commands/maintainer/remove.ts @@ -1,12 +1,7 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; export const name = 'remove'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const u = await client.models.user.findOne({ where: { userId: options.getUser('user').id } }); if (!u) { interaction.editReply({ content: 'User is not a member of staff' }); diff --git a/src/commands/ping.ts b/src/commands/ping.ts index db51e10..4f95d90 100644 --- a/src/commands/ping.ts +++ b/src/commands/ping.ts @@ -1,13 +1,9 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'ping'; -export const data = new SlashCommandBuilder().setName(name).setDescription('Shows Discord API and bot latency'); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - _options: ChatInputCommandInteraction['options'] -): Promise { +export const ephemeral = true; +export const data = new SlashCommandBuilder().setName('ping').setDescription('Shows Discord API and bot latency'); +export async function execute({ client, interaction }: CmdFileArgs): Promise { const t0 = Date.now(); await interaction.editReply({ content: 'Pinging services, please wait (0/1)' }); // -- // diff --git a/src/commands/syncallbans.ts b/src/commands/syncallbans.ts index be4c6cc..d47301f 100644 --- a/src/commands/syncallbans.ts +++ b/src/commands/syncallbans.ts @@ -1,6 +1,6 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder, Team } from 'discord.js'; +import { SlashCommandBuilder, Team } from 'discord.js'; import { BanManager } from '../classes/banManager.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { CmdFileArgs, CustomClient } from '../typings/Extensions.js'; function authorised(client: CustomClient, user: string): boolean { return ( @@ -9,15 +9,11 @@ function authorised(client: CustomClient, user: string): boolean { ); } -export const name = 'syncallbans'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('syncallbans') .setDescription('Adds all bans from all participating servers [OWNER ONLY]'); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - _options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction }: CmdFileArgs): Promise { // Check owner if (!authorised(client, interaction.user.id)) { interaction.editReply({ content: 'You are not authorised to use this command' }); diff --git a/src/commands/syncbans.ts b/src/commands/syncbans.ts index cc549cb..5755a10 100644 --- a/src/commands/syncbans.ts +++ b/src/commands/syncbans.ts @@ -1,25 +1,23 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; +import { SlashCommandBuilder } from 'discord.js'; import { BanManager } from '../classes/banManager.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { CmdFileArgs, CustomClient } from '../typings/Extensions.js'; -function authorised(client: CustomClient, user: string): Promise { - return client.models.user - .findOne({ where: { userId: user } }) - .then((u) => u.flags.has('Maintainer')) - .catch(() => false); +async function authorised(client: CustomClient, user: string): Promise { + try { + const u = await client.models.user.findOne({ where: { userId: user } }); + return u.flags.has('Maintainer'); + } catch { + return false; + } } -export const name = 'syncbans'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('syncbans') .setDescription('Adds bans from the current guild [MAINTAINER ONLY]'); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - _options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction }: CmdFileArgs): Promise { // Check owner - if (!authorised(client, interaction.user.id)) { + if (!(await authorised(client, interaction.user.id))) { interaction.editReply({ content: 'You are not authorised to use this command' }); return; } diff --git a/src/commands/unban.ts b/src/commands/unban.ts index aa7e25e..324f0b9 100644 --- a/src/commands/unban.ts +++ b/src/commands/unban.ts @@ -1,29 +1,29 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { PermissionFlagsBits, SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'unban'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('unban') .setDescription('Unbans a user') - .addUserOption((option) => option.setName('user').setDescription('Banned user').setRequired(true)); -export async function run( - _client: CustomClient, - interaction: ChatInputCommandInteraction, - interaction2: LockInfo, - options: ChatInputCommandInteraction['options'] -): Promise { - if (!interaction.memberPermissions.has('BanMembers')) { - interaction.editReply({ content: 'You are not authorised to use this command' }); - return; - } + .addUserOption((option) => option.setName('user').setDescription('Banned user').setRequired(true)) + // Only allow users with BanMembers permission to use this command + .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers); +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { // Find ban const b = await interaction.guild.bans.fetch(options.getUser('user')); if (!b) { interaction.editReply({ content: 'The supplied user is not banned' }); return; } - // Unban + // Unban on Discord's side await interaction.guild.bans.remove(b.user); + // Remove from database + await client.models.ban.destroy({ + where: { + targetId: b.user.id, + guildId: interaction.guild.id + } + }); // Reply interaction.editReply({ content: `Unbanned ${b.user.toString()}` }); } diff --git a/src/commands/warn.ts b/src/commands/warn.ts index caeb7e2..94cae82 100644 --- a/src/commands/warn.ts +++ b/src/commands/warn.ts @@ -1,9 +1,9 @@ -import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js'; -import { CustomClient } from '../typings/Extensions.js'; +import { SlashCommandBuilder } from 'discord.js'; +import { CmdFileArgs } from '../typings/Extensions.js'; -export const name = 'warn'; +export const ephemeral = true; export const data = new SlashCommandBuilder() - .setName(name) + .setName('warn') .setDescription('Warns other servers about a specific user') .addSubcommand((cmd) => { return cmd @@ -25,16 +25,12 @@ export const data = new SlashCommandBuilder() option.setName('message').setDescription('Statement regarding the user').setRequired(true) ); }); -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const dbUser = await client.models.user.findOne({ where: { userId: interaction.user.id } }); if ((!dbUser || dbUser.flags.has('Staff')) && interaction.memberPermissions.has('ModerateMembers')) { interaction.editReply({ content: 'You are not authorised to perform that action' }); return; } const act = options.getSubcommand(true); - client.commands.get(`${name}_${act}`).run(client, interaction, options); + client.commands.get(`${interaction.commandName}_${act}`).execute({ client, interaction, options }); } diff --git a/src/commands/warn/add.ts b/src/commands/warn/add.ts index ed7b223..e0b27fe 100644 --- a/src/commands/warn/add.ts +++ b/src/commands/warn/add.ts @@ -1,5 +1,4 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; // Safely escapes backticks and backslashes function escape(str: string): string { @@ -7,11 +6,7 @@ function escape(str: string): string { } export const name = 'add'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const t = options.getUser('target'); const w = await client.models.warn.create({ guildId: interaction.guild.id, diff --git a/src/commands/warn/edit.ts b/src/commands/warn/edit.ts index 37bd7f7..e7789ec 100644 --- a/src/commands/warn/edit.ts +++ b/src/commands/warn/edit.ts @@ -1,5 +1,4 @@ -import { ChatInputCommandInteraction } from 'discord.js'; -import { CustomClient } from '../../typings/Extensions.js'; +import { CmdFileArgs } from '../../typings/Extensions.js'; // Safely escapes backticks and backslashes function escape(str: string): string { @@ -7,11 +6,7 @@ function escape(str: string): string { } export const name = 'edit'; -export async function run( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] -): Promise { +export async function execute({ client, interaction, options }: CmdFileArgs): Promise { const entry = await client.models.warn.findOne({ where: { warnId: options.getNumber('id', true), diff --git a/src/configs/config.json b/src/configs/config.json index f2b4009..6102070 100644 --- a/src/configs/config.json +++ b/src/configs/config.json @@ -10,8 +10,9 @@ "lowerQuerryLimit": 5, "botBadge": "<:system_bot_notifier:813101401646432298>" }, - "about": "./ABOUT.md", - "changelog": "./CHANGELOG.md" + "about": "../ABOUT.md", + "changelog": "../CHANGELOG.md", + "avatar": "../assets/agentBlack.jpg" }, "functions": { "userTagRecord": { diff --git a/src/configs/example_config.json b/src/configs/example_config.json deleted file mode 100644 index 718aa6e..0000000 --- a/src/configs/example_config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "README": "THIS FILE OF FOR DEBUGGING PURPOSES ONLY! USE ENVIRONMENT VARIABLES IN PRODUCTION.", - "token": "**************************", - "development": { - "username": "***", - "password": "*****************", - "database": "**********************", - "host": "*****************", - "dialect": "mysql" - } -} diff --git a/src/database/models/alias.ts b/src/database/models/alias.ts index d25eb07..e1356f3 100644 --- a/src/database/models/alias.ts +++ b/src/database/models/alias.ts @@ -1,93 +1,57 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; -import type { user, userId } from './user.js'; export interface aliasAttributes { aliasId: number; user: string; - alternative?: string; + alternative: string; moderator: string; - createdAt: Date; - updatedAt: Date; } export type aliasPk = 'aliasId'; export type aliasId = alias[aliasPk]; -export type aliasOptionalAttributes = aliasPk | 'createdAt' | 'updatedAt'; +export type aliasOptionalAttributes = 'aliasId'; export type aliasCreationAttributes = Optional; export class alias extends Model implements aliasAttributes { + //? Convert non null assertions to declare to prevent shadowing declare aliasId: number; declare user: string; declare alternative: string; declare moderator: string; - declare createdAt: Date; - declare updatedAt: Date; - - // alias belongsTo user via moderator - declare moderator_user: user; - declare getModerator_user: Sequelize.BelongsToGetAssociationMixin; - declare setModerator_user: Sequelize.BelongsToSetAssociationMixin; - declare createModerator_user: Sequelize.BelongsToCreateAssociationMixin; static initModel(sequelize: Sequelize.Sequelize): typeof alias { return alias.init( { aliasId: { + autoIncrement: true, type: DataTypes.INTEGER, allowNull: false, - primaryKey: true, - autoIncrement: true + primaryKey: true }, user: { - type: DataTypes.CHAR(20), + type: DataTypes.STRING(30), allowNull: false }, alternative: { - type: DataTypes.CHAR(20), - allowNull: true, - unique: 'alternative' + type: DataTypes.STRING(30), + allowNull: false }, moderator: { - type: DataTypes.CHAR(20), - allowNull: false, - references: { - model: 'user', - key: 'userId' - } - }, - createdAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') - }, - updatedAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + type: DataTypes.STRING(30), + allowNull: false } }, { sequelize, tableName: 'alias', - timestamps: false, + timestamps: true, indexes: [ { name: 'PRIMARY', unique: true, using: 'BTREE', fields: [{ name: 'aliasId' }] - }, - { - name: 'alternative', - unique: true, - using: 'BTREE', - fields: [{ name: 'alternative' }] - }, - { - name: 'alias_ibfk_1', - using: 'BTREE', - fields: [{ name: 'moderator' }] } ] } diff --git a/src/database/models/ban.ts b/src/database/models/ban.ts index 16e069f..c99665e 100644 --- a/src/database/models/ban.ts +++ b/src/database/models/ban.ts @@ -7,23 +7,22 @@ export interface banAttributes { guildId: string; targetId: string; reason: string; - active: boolean; } export type banPk = 'banId'; export type banId = ban[banPk]; -export type banOptionalAttributes = banPk | 'active'; +export type banOptionalAttributes = 'banId'; export type banCreationAttributes = Optional; export class ban extends Model implements banAttributes { + //? Convert non null assertions to declare to prevent shadowing declare banId: number; declare guildId: string; declare targetId: string; declare reason: string; - declare active: boolean; declare createdAt: Date; declare updatedAt: Date; - declare deletedAt: Date | null; + declare deletedAt?: Date; // ban belongsTo guild via guildId declare guild: guild; @@ -35,13 +34,13 @@ export class ban extends Model implements return ban.init( { banId: { + autoIncrement: true, type: DataTypes.INTEGER, allowNull: false, - primaryKey: true, - autoIncrement: true + primaryKey: true }, guildId: { - type: DataTypes.CHAR(20), + type: DataTypes.STRING(30), allowNull: false, references: { model: 'guild', @@ -49,18 +48,12 @@ export class ban extends Model implements } }, targetId: { - type: DataTypes.CHAR(20), + type: DataTypes.STRING(30), allowNull: false }, reason: { type: DataTypes.TEXT, allowNull: false - }, - active: { - type: DataTypes.VIRTUAL, - get() { - return this.isSoftDeleted(); - } } }, { diff --git a/src/database/models/guild.ts b/src/database/models/guild.ts index aedcad1..4cfc86d 100644 --- a/src/database/models/guild.ts +++ b/src/database/models/guild.ts @@ -1,31 +1,26 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; import type { ban, banId } from './ban.js'; -import type { warn, warnId } from './warn.js'; +import type { guildsettings, guildsettingsId } from './guildsettings.js'; export interface guildAttributes { guildId: string; enabled: boolean; banned: boolean; - settings: guildSettings; - createdAt: Date; - updatedAt: Date; + settingsId: number; } export type guildPk = 'guildId'; export type guildId = guild[guildPk]; -export type guildOptionalAttributes = 'enabled' | 'banned' | 'createdAt' | 'updatedAt'; +export type guildOptionalAttributes = 'enabled' | 'banned'; export type guildCreationAttributes = Optional; -export type guildSettings = { - channel: string; - role: string; -}; export class guild extends Model implements guildAttributes { + //? Convert non null assertions to declare to prevent shadowing declare guildId: string; declare enabled: boolean; declare banned: boolean; - declare settings: guildSettings; + declare settingsId: number; declare createdAt: Date; declare updatedAt: Date; @@ -41,24 +36,17 @@ export class guild extends Model imple declare hasBan: Sequelize.HasManyHasAssociationMixin; declare hasBans: Sequelize.HasManyHasAssociationsMixin; declare countBans: Sequelize.HasManyCountAssociationsMixin; - // guild hasMany warn via guildId - declare warns: warn[]; - declare getWarns: Sequelize.HasManyGetAssociationsMixin; - declare setWarns: Sequelize.HasManySetAssociationsMixin; - declare addWarn: Sequelize.HasManyAddAssociationMixin; - declare addWarns: Sequelize.HasManyAddAssociationsMixin; - declare createWarn: Sequelize.HasManyCreateAssociationMixin; - declare removeWarn: Sequelize.HasManyRemoveAssociationMixin; - declare removeWarns: Sequelize.HasManyRemoveAssociationsMixin; - declare hasWarn: Sequelize.HasManyHasAssociationMixin; - declare hasWarns: Sequelize.HasManyHasAssociationsMixin; - declare countWarns: Sequelize.HasManyCountAssociationsMixin; + // guild belongsTo guildsettings via settingsId + declare setting: guildsettings; + declare getSetting: Sequelize.BelongsToGetAssociationMixin; + declare setSetting: Sequelize.BelongsToSetAssociationMixin; + declare createSetting: Sequelize.BelongsToCreateAssociationMixin; static initModel(sequelize: Sequelize.Sequelize): typeof guild { return guild.init( { guildId: { - type: DataTypes.CHAR(20), + type: DataTypes.STRING(30), allowNull: false, primaryKey: true }, @@ -72,31 +60,30 @@ export class guild extends Model imple allowNull: false, defaultValue: false }, - settings: { - type: DataTypes.JSON, - allowNull: false - }, - createdAt: { - type: DataTypes.DATE, - allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') - }, - updatedAt: { - type: DataTypes.DATE, + settingsId: { + type: DataTypes.INTEGER, allowNull: false, - defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP') + references: { + model: 'guildsettings', + key: 'settingsId' + } } }, { sequelize, tableName: 'guild', - timestamps: false, + timestamps: true, indexes: [ { name: 'PRIMARY', unique: true, using: 'BTREE', fields: [{ name: 'guildId' }] + }, + { + name: 'guild_fk_1', + using: 'BTREE', + fields: [{ name: 'settingsId' }] } ] } diff --git a/src/database/models/guildsettings.ts b/src/database/models/guildsettings.ts new file mode 100644 index 0000000..3cee287 --- /dev/null +++ b/src/database/models/guildsettings.ts @@ -0,0 +1,98 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { guild, guildId } from './guild.js'; + +export interface guildsettingsAttributes { + settingsId: number; + logChannel: string; + staffRole: string; + pointsSystemEnabled: number; + pointsSystemForceReason: number; + pointLifetime: string; +} + +export type guildsettingsPk = 'settingsId'; +export type guildsettingsId = guildsettings[guildsettingsPk]; +export type guildsettingsOptionalAttributes = + | 'settingsId' + | 'pointsSystemEnabled' + | 'pointsSystemForceReason' + | 'pointLifetime'; +export type guildsettingsCreationAttributes = Optional; + +export class guildsettings + extends Model + implements guildsettingsAttributes +{ + //? Convert non null assertions to declare to prevent shadowing + declare settingsId: number; + declare logChannel: string; + declare staffRole: string; + declare pointsSystemEnabled: number; + declare pointsSystemForceReason: number; + declare pointLifetime: string; + declare createdAt: Date; + declare updatedAt: Date; + + // guildsettings hasMany guild via settingsId + declare guilds: guild[]; + declare getGuilds: Sequelize.HasManyGetAssociationsMixin; + declare setGuilds: Sequelize.HasManySetAssociationsMixin; + declare addGuild: Sequelize.HasManyAddAssociationMixin; + declare addGuilds: Sequelize.HasManyAddAssociationsMixin; + declare createGuild: Sequelize.HasManyCreateAssociationMixin; + declare removeGuild: Sequelize.HasManyRemoveAssociationMixin; + declare removeGuilds: Sequelize.HasManyRemoveAssociationsMixin; + declare hasGuild: Sequelize.HasManyHasAssociationMixin; + declare hasGuilds: Sequelize.HasManyHasAssociationsMixin; + declare countGuilds: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof guildsettings { + return guildsettings.init( + { + settingsId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + logChannel: { + type: DataTypes.STRING(30), + allowNull: false + }, + staffRole: { + type: DataTypes.STRING(30), + allowNull: false + }, + pointsSystemEnabled: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: 0 + }, + pointsSystemForceReason: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: 0 + }, + pointLifetime: { + type: DataTypes.STRING(30), + allowNull: false, + defaultValue: '1210000000' + } + }, + { + sequelize, + tableName: 'guildsettings', + timestamps: true, + indexes: [ + { + name: 'PRIMARY', + unique: true, + using: 'BTREE', + fields: [{ name: 'settingsId' }] + } + ] + } + ); + } +} diff --git a/src/database/models/user.ts b/src/database/models/user.ts index 7f3bf8b..73f9815 100644 --- a/src/database/models/user.ts +++ b/src/database/models/user.ts @@ -13,6 +13,7 @@ export type userOptionalAttributes = 'flags'; export type userCreationAttributes = Optional; export class user extends Model implements userAttributes { + //? Convert non null assertions to declare to prevent shadowing declare userId: string; declare flags: StaffFlagsBitField; declare createdAt: Date; @@ -22,7 +23,7 @@ export class user extends Model implemen return user.init( { userId: { - type: DataTypes.CHAR(20), + type: DataTypes.CHAR(30), allowNull: false, primaryKey: true }, diff --git a/src/database/models/warn.ts b/src/database/models/warn.ts index d474207..b85d575 100644 --- a/src/database/models/warn.ts +++ b/src/database/models/warn.ts @@ -1,55 +1,45 @@ import * as Sequelize from 'sequelize'; import { DataTypes, Model, Optional } from 'sequelize'; -import type { guild, guildId } from './guild.js'; export interface warnAttributes { warnId: number; guildId: string; targetId: string; reason: string; - active: boolean; + readonly active: boolean; } export type warnPk = 'warnId'; export type warnId = warn[warnPk]; -export type warnOptionalAttributes = warnPk; +export type warnOptionalAttributes = 'warnId'; export type warnCreationAttributes = Optional; export class warn extends Model implements warnAttributes { + //? Convert non null assertions to declare to prevent shadowing declare warnId: number; declare guildId: string; declare targetId: string; declare reason: string; - declare active: boolean; + declare readonly active: boolean; declare createdAt: Date; declare updatedAt: Date; - declare deletedAt: Date; - - // warn belongsTo guild via guildId - declare guild: guild; - declare getGuild: Sequelize.BelongsToGetAssociationMixin; - declare setGuild: Sequelize.BelongsToSetAssociationMixin; - declare createGuild: Sequelize.BelongsToCreateAssociationMixin; + declare deletedAt?: Date; static initModel(sequelize: Sequelize.Sequelize): typeof warn { return warn.init( { warnId: { + autoIncrement: true, type: DataTypes.INTEGER, allowNull: false, - primaryKey: true, - autoIncrement: true + primaryKey: true }, guildId: { - type: DataTypes.CHAR(20), - allowNull: false, - references: { - model: 'guild', - key: 'guildId' - } + type: DataTypes.STRING(30), + allowNull: false }, targetId: { - type: DataTypes.CHAR(20), + type: DataTypes.STRING(30), allowNull: false }, reason: { @@ -59,7 +49,7 @@ export class warn extends Model implemen active: { type: DataTypes.VIRTUAL, get() { - return this.isSoftDeleted(); + return !this.isSoftDeleted(); } } }, @@ -76,7 +66,7 @@ export class warn extends Model implemen fields: [{ name: 'warnId' }] }, { - name: 'warns_ibfk_1', + name: 'warns_index_1', using: 'BTREE', fields: [{ name: 'guildId' }] } diff --git a/src/functions/events/interactionCreate/command.ts b/src/functions/events/interactionCreate/command.ts index a4c2eca..a79d65c 100644 --- a/src/functions/events/interactionCreate/command.ts +++ b/src/functions/events/interactionCreate/command.ts @@ -4,9 +4,8 @@ import { CustomClient } from '../../../typings/Extensions.js'; export const name = 'command'; export async function execute(client: CustomClient, interaction: ChatInputCommandInteraction) { if (!interaction.isChatInputCommand()) return; - // Use subcommand if it exists - const sc = interaction.options.getSubcommand(false); - const name = `${interaction.commandName.replace('d_', '')}${sc === null ? '' : `_${sc}`}`; + // Create name for command + const name = interaction.commandName.replace('d_', ''); // Get command const cmd = client.commands.get(name); if (!cmd) return; @@ -27,7 +26,7 @@ export async function execute(client: CustomClient, interaction: ChatInput } // Run command try { - cmd.run(client, interaction, interaction.options); + cmd.execute({ client, interaction, options: interaction.options }); } catch (err) { interaction.editReply({ content: 'Something went wrong while replying! This error has been logged' }); client.logs.error({ msg: `E | ✘ ${name}`, err }); diff --git a/src/functions/events/interactionCreate/component.ts b/src/functions/events/interactionCreate/component.ts index ef9f44c..16b34bd 100644 --- a/src/functions/events/interactionCreate/component.ts +++ b/src/functions/events/interactionCreate/component.ts @@ -12,7 +12,7 @@ export async function execute(_client: CustomClient, interaction: MessageC await new Promise((resolve) => setTimeout(resolve, 2000)); if (!messageEqual(m, interaction.message)) return; // Remove components and mark expired - interaction.message.edit({ + interaction.update({ components: [], content: `This embed has timed out. Please run the command again` }); diff --git a/src/functions/events/interactionCreate/main.ts b/src/functions/events/interactionCreate/main.ts new file mode 100644 index 0000000..ebd330e --- /dev/null +++ b/src/functions/events/interactionCreate/main.ts @@ -0,0 +1,34 @@ +import { Interaction, InteractionType } from 'discord.js'; +import { CustomClient } from '../../../typings/Extensions.js'; + +export const name = 'main'; +export async function execute(client: CustomClient, interaction: Interaction): Promise { + // Avoid running commands before the bot is ready + if (!client.ready && interaction.isCommand()) { + interaction.reply({ + content: 'The bot is still starting up. Please wait a few seconds and try again.', + ephemeral: true + }); + } else if (!client.ready) { + return; + } + // Get the interaction function + let func: string; + switch (interaction.type) { + case InteractionType.ApplicationCommand: { + func = 'command'; + break; + } + case InteractionType.MessageComponent: { + func = 'component'; + break; + } + case InteractionType.ApplicationCommandAutocomplete: { + func = 'autocomplete'; + break; + } + } + // Run all interaction functions + client.functions.get(`events_interactionCreate_${func}`).execute(client, interaction); + return; +} diff --git a/src/functions/events/ready/commands.ts b/src/functions/events/ready/commands.ts index 4d19cb5..906f5d2 100644 --- a/src/functions/events/ready/commands.ts +++ b/src/functions/events/ready/commands.ts @@ -18,17 +18,23 @@ export async function execute(client: CustomClient): Promise { // For each file, load the command const cmds: ReturnType[] = []; client.logs.debug(`F | ✦ Expecting ${files.length} command files`); - for (const file of files) { + // Initially use the raw filename + for (let name of files) { try { - const command: CommandFile = await import(`../../../commands/${file}`); - // Rewrite cmd name if development and push if found + const command: CommandFile = await import(`../../../commands/${name}`); + // Rewrite cmd name if development if (command.data && NODE_ENV === 'development') command.data.setName(`d_${command.data.name}`); - if (command.data) cmds.push(command.data.toJSON()); - const n = file.replace(/\.js$/, '').replace(/\//g, '_'); - client.commands.set(n, command); - client.logs.info(`F | ✓ ${n}`); + // If the command has data, use that and push data + if (command.data) { + name = command.data.name; + cmds.push(command.data.toJSON()); + } + // Reassign to function-friendly name + name = name.replace(/\.js$/, '').replace(/\//g, '_'); + client.commands.set(name, command); + client.logs.info(`F | ✓ ${name}`); } catch (err) { - client.logs.error({ msg: `F | ✘ ${file}`, err }); + client.logs.error({ msg: `F | ✘ ${name}`, err }); } } // Register the commands diff --git a/src/functions/load.ts b/src/functions/load.ts index 068b26d..fc15964 100644 --- a/src/functions/load.ts +++ b/src/functions/load.ts @@ -1,53 +1,43 @@ import { existsSync, readdirSync } from 'node:fs'; import { CustomClient, FunctionFile } from '../typings/Extensions.js'; +export const name = 'load'; // This loads all functions -export async function run(client: CustomClient): Promise { +export async function execute(client: CustomClient): Promise> { // Check for functions folder if (!existsSync('./functions')) { console.warn('F | ! No functions were found! Make sure you are running index.js from the dist directory'); - return; + return new Map() as Map; } client.logs.debug('F | ✦ Loading all functions'); - // Initialise variable - const functionFiles: { [key: string]: string[] } = {}; // Read the directory - const types: string[] = readdirSync('./functions').filter((f: string) => !f.endsWith('.js')); - // For each type, load the files - for (const type of types) { - functionFiles[type] = readdirSync(`./functions/${type}`, { recursive: true }) - // Map Buffers to string - .map((f: unknown) => String(f)) - // Trim directory - .map((f: string) => f.replace(`./functions/${type}/`, '')) - // Remove Windows backslashes - .map((f: string) => f.replace('\\', '/')) - // Filter out non-JS files - .filter((f: string) => f.endsWith('.js')); - } + const functionFiles: string[] = readdirSync(`./functions`, { recursive: true }) + // Ensure all file names are strings + .map((f: unknown) => String(f)) + // Trim directory + .map((f: string) => f.replace(`./functions/`, '')) + // Remove Windows backslashes + .map((f: string) => f.replace(/\\/g, '/')) + // Filter out non-JS files + .filter((f: string) => f.endsWith('.js')); // Load the functions + client.logs.debug(`F | ✦ Found ${functionFiles.length} function`); + // Initialise variables + // deepcode ignore CollectionUpdatedButNeverQueried: Used in return const functions = new Map(); - for (const [type, files] of Object.entries(functionFiles)) { - client.logs.debug(`F | ✦ Found ${files.length} ${type} function`); + for (const file of functionFiles) { // Set the file - for (const file of files) { - try { - const f: FunctionFile = await import(`../functions/${type}/${file}`); - const n = file.replace(/\.js$/, '').replace(/\//g, '_'); - // Skip if it's an archive - if (n.includes('archive_')) continue; - functions.set(type + '_' + n, f); - client.logs.debug(`F | ✓ ${n}`); - } catch (err) { - client.logs.error({ msg: `F | ✗ ${file}`, err }); - } + try { + const func: FunctionFile = await import(`../functions/${file}`); + const name = file.replace(/\.js$/, '').replace(/\//g, '_'); + // Skip if it's an archive + if (name.includes('archive_')) continue; + functions.set(name, func); + client.logs.debug(`F | ✓ ${name}`); + } catch (err) { + client.logs.error({ msg: `F | ✗ ${file}`, err }); } } - // Attach the functions - client.functions = functions; - client.ready = true; - // Return void - return; + // Return values + return functions; } - -// if name has archive_, drop it diff --git a/src/functions/utils/guildAuth.ts b/src/functions/utils/guildAuth.ts new file mode 100644 index 0000000..49e6ee6 --- /dev/null +++ b/src/functions/utils/guildAuth.ts @@ -0,0 +1,16 @@ +import { GuildMember } from 'discord.js'; +import { CustomClient } from '../../typings/Extensions.js'; + +export const name = 'guildAuth'; +export async function execute(client: CustomClient, member: GuildMember): Promise { + // Find DB entry + const dbGuild = await client.models.guild.findOne({ + where: { guildId: member.guild.id } + }); + if (!dbGuild) return false; + // Get settings + const settings = await dbGuild.getSetting(); + if (!settings) return false; + // Return whether they have the role or not + return member.roles.cache.has(settings.staffRole); +} diff --git a/src/functions/utils/masterMessage.ts b/src/functions/utils/masterMessage.ts index 8aba010..8e17579 100644 --- a/src/functions/utils/masterMessage.ts +++ b/src/functions/utils/masterMessage.ts @@ -1,36 +1,37 @@ -import { EmbedBuilder, Guild } from 'discord.js'; -import { CustomClient, MessageType } from '../../typings/Extensions.js'; +import { ChannelType, Collection, EmbedBuilder, Guild, Webhook } from 'discord.js'; +import { readFileSync } from 'node:fs'; +import { BroadcastType, CustomClient } from '../../typings/Extensions.js'; export const name = 'masterMessage'; export async function execute( client: CustomClient, - type: MessageType, + type: BroadcastType, msg: string, targetUser?: string ): Promise { const embed = new EmbedBuilder().setDescription(msg).setColor(type); switch (type) { - case MessageType.Broadcast: + case BroadcastType.Broadcast: embed.setTitle('Maintainer Broadcast'); break; - case MessageType.UserBanned: + case BroadcastType.UserBanned: embed.setTitle('User in This Server Banned'); break; - case MessageType.UserWarned: + case BroadcastType.UserWarned: embed.setTitle('User in This Server Warned'); break; - case MessageType.Maintenance: + case BroadcastType.Maintenance: embed.setTitle('Maintenance Notice'); break; - case MessageType.SecurityAlert: + case BroadcastType.SecurityAlert: embed.setTitle('** Security Alert **'); break; - case MessageType.Other: + case BroadcastType.Other: embed.setTitle('General Notice'); break; } const servers: Guild[] = []; - if (type === MessageType.UserBanned || type === MessageType.UserWarned) { + if (type === BroadcastType.UserBanned || type === BroadcastType.UserWarned) { // Find affected guilds client.guilds.cache.each((g) => g.members @@ -42,13 +43,26 @@ export async function execute( // Send to all servers client.guilds.cache.each((g) => servers.push(g)); } - // Check guilds for active status and send to participating ones servers.forEach(async (g) => { - const s = await client.models.guild.findOne({ where: { guildId: g.id } }); + // Check guilds for active status and send to participating ones + const s = await client.models.guild.findOne({ + where: { guildId: g.id }, + include: [{ model: client.models.guildsettings, as: 'setting' }] + }); if (!s || !s.enabled) return; // The server's not participating or inactive + // Find channel and grab webhooks + const c = await client.channels.fetch(s.setting.logChannel); + if (!c || c.type !== ChannelType.GuildText) return; // Invalid channel + const webhooks = await c + .fetchWebhooks() + .then((w) => w.filter((w) => w.applicationId === client.application.id)) + .catch(() => new Collection()); + // Use the first webhook or create one + const hook = + webhooks.size > 1 + ? (webhooks.first() as Webhook | Record) + : await c.createWebhook({ name: 'Agent Black', avatar: readFileSync('../assets/agentBlack.jpg') }); // Send message - const c = await g.channels.fetch(s.settings.channel); - if (!c || !c.isTextBased()) return; // Channel not found - c.send({ embeds: [embed] }); + hook.send({ embeds: [embed] }); }); } diff --git a/src/functions/utils/pagination.ts b/src/functions/utils/pagination.ts index bb68f52..b45c418 100644 --- a/src/functions/utils/pagination.ts +++ b/src/functions/utils/pagination.ts @@ -114,13 +114,10 @@ export async function execute( }); coll.on('end', () => { interaction - .fetchReply() - .then((m) => - m.edit({ - content: `This embed has timed out. Please run the command again: `, - components: [] - }) - ) + .editReply({ + content: `This embed has timed out. Please run the command again: `, + components: [] + }) .catch(() => null); }); //#endregion diff --git a/src/index.ts b/src/index.ts index 589f7f0..5990cb6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ //#region Packages -import { Client, Collection, IntentsBitField, InteractionType } from 'discord.js'; +import { Client, Collection, IntentsBitField } from 'discord.js'; import { CustomClient } from './typings/Extensions.js'; // Log developer mode if (process.env.NODE_ENV === 'development') console.debug('Starting in development mode'); @@ -17,7 +17,11 @@ const client: CustomClient = new Client({ ] }); client.logs = console; -await import('./functions/load.js').then((f) => f.run(client)).catch((e) => client.logs.error(e)); +// Load all functions +const funcs = await import('./functions/load.js').then((f) => f.execute(client)).catch((e) => client.logs.error(e)); +if (!funcs) process.exit(1); +client.functions = funcs; +// Run all startup functions Array.from(client.functions.keys()) .filter((f) => f.startsWith('startup_')) .forEach((f) => client.functions.get(f).execute(client)); @@ -35,23 +39,7 @@ client.on('ready', () => { }); client.on('interactionCreate', async (interaction) => { - let func: string; - switch (interaction.type) { - case InteractionType.ApplicationCommand: { - func = 'command'; - break; - } - case InteractionType.MessageComponent: { - func = 'component'; - break; - } - case InteractionType.ApplicationCommandAutocomplete: { - func = 'autocomplete'; - break; - } - } - // Run all interaction functions - client.functions.get(`events_interactionCreate_${func}`).execute(client, interaction); + client.functions.get('events_interactionCreate_main').execute(client, interaction); }); client.login(process.env.DCtoken); diff --git a/src/typings/Bitfield.js b/src/typings/Bitfield.js index 9372448..2e68651 100644 --- a/src/typings/Bitfield.js +++ b/src/typings/Bitfield.js @@ -217,7 +217,7 @@ export class StaffFlagsBitField extends BitField { * @returns {string[]} */ missing(bits, checkAdmin = true) { - return checkAdmin && super.has(StaffFlags.Maintainer) ? [] : super.missing(bits, null); + return checkAdmin && super.has(StaffFlags.Owner) ? [] : super.missing(bits, null); } /** @@ -227,7 +227,7 @@ export class StaffFlagsBitField extends BitField { * @returns {boolean} */ any(flag, checkAdmin = true) { - return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.any(flag); + return (checkAdmin && super.has(StaffFlags.Owner)) || super.any(flag); } /** @@ -237,7 +237,7 @@ export class StaffFlagsBitField extends BitField { * @returns {boolean} */ has(flag, checkAdmin = true) { - return (checkAdmin && super.has(StaffFlags.Maintainer)) || super.has(flag); + return (checkAdmin && super.has(StaffFlags.Owner)) || super.has(flag); } /** diff --git a/src/typings/Extensions.ts b/src/typings/Extensions.ts index 0ac8ebc..ed42b7d 100644 --- a/src/typings/Extensions.ts +++ b/src/typings/Extensions.ts @@ -19,18 +19,14 @@ export interface CustomClient extends Client { } // Various types of file that will be imported export interface CommandFile { - name: string; + name?: string; ephemeral?: boolean; data?: SlashCommandBuilder; - run: ( - client: CustomClient, - interaction: ChatInputCommandInteraction, - options: ChatInputCommandInteraction['options'] - ) => Promise; + execute: ({ client, interaction, options }: CmdFileArgs) => Promise; } export interface FunctionFile { name: string; - execute: (client: CustomClient, ...args: unknown[]) => Promise; + execute: (client: CustomClient, ...args: unknown[]) => Promise; } export enum FlagEmoji { @@ -52,9 +48,8 @@ export enum FlagEmoji { VerifiedBot = '<:DB_VerifiedBot:1118377792652980224>', VerifiedDeveloper = '<:DB_VerifiedDeveloper:1118377595277418576>' } - /** @desc Messages to be sent to the masterMessage function */ -export enum MessageType { +export enum BroadcastType { /** @desc Broadcast from Maintainer+ */ Broadcast = 0x6699ff, /** @desc User banned alert */ @@ -68,3 +63,9 @@ export enum MessageType { /** @desc Other - All servers */ Other = 0xffffff } + +export type CmdFileArgs = { + client: CustomClient; + interaction: ChatInputCommandInteraction; + options: ChatInputCommandInteraction['options']; +}; diff --git a/src/typings/Models.ts b/src/typings/Models.ts index f39fb1b..3df5054 100644 --- a/src/typings/Models.ts +++ b/src/typings/Models.ts @@ -5,45 +5,49 @@ import type { banAttributes, banCreationAttributes } from '../database/models/ba import { ban as _ban } from '../database/models/ban.js'; import type { guildAttributes, guildCreationAttributes } from '../database/models/guild.js'; import { guild as _guild } from '../database/models/guild.js'; +import type { guildsettingsAttributes, guildsettingsCreationAttributes } from '../database/models/guildsettings.js'; +import { guildsettings as _guildsettings } from '../database/models/guildsettings.js'; import type { userAttributes, userCreationAttributes } from '../database/models/user.js'; import { user as _user } from '../database/models/user.js'; import type { warnAttributes, warnCreationAttributes } from '../database/models/warn.js'; import { warn as _warn } from '../database/models/warn.js'; -export { _alias as Alias, _ban as Ban, _guild as Guild, _user as User, _warn as Warn }; +export { _alias as alias, _ban as ban, _guild as guild, _guildsettings as guildsettings, _user as user, _warn as warn }; export type { - aliasAttributes as AliasAttributes, - aliasCreationAttributes as AliasCreationAttributes, - banAttributes as BanAttributes, - banCreationAttributes as BanCreationAttributes, - guildAttributes as GuildAttributes, - guildCreationAttributes as GuildCreationAttributes, - userAttributes as UserAttributes, - userCreationAttributes as UserCreationAttributes, - warnAttributes as WarnAttributes, - warnCreationAttributes as WarnCreationAttributes + aliasAttributes, + aliasCreationAttributes, + banAttributes, + banCreationAttributes, + guildAttributes, + guildCreationAttributes, + guildsettingsAttributes, + guildsettingsCreationAttributes, + userAttributes, + userCreationAttributes, + warnAttributes, + warnCreationAttributes }; export function initModels(sequelize: Sequelize) { const alias = _alias.initModel(sequelize); const ban = _ban.initModel(sequelize); const guild = _guild.initModel(sequelize); + const guildsettings = _guildsettings.initModel(sequelize); const user = _user.initModel(sequelize); const warn = _warn.initModel(sequelize); ban.belongsTo(guild, { as: 'guild', foreignKey: 'guildId' }); guild.hasMany(ban, { as: 'bans', foreignKey: 'guildId' }); - warn.belongsTo(guild, { as: 'guild', foreignKey: 'guildId' }); - guild.hasMany(warn, { as: 'warns', foreignKey: 'guildId' }); - alias.belongsTo(user, { as: 'moderator_user', foreignKey: 'moderator' }); - user.hasMany(alias, { as: 'aliases', foreignKey: 'moderator' }); + guild.belongsTo(guildsettings, { as: 'setting', foreignKey: 'settingsId' }); + guildsettings.hasMany(guild, { as: 'guilds', foreignKey: 'settingsId' }); return { - alias, - ban, - guild, - user, - warn + alias: alias, + ban: ban, + guild: guild, + guildsettings: guildsettings, + user: user, + warn: warn }; } diff --git a/src/typings/StaffFlags.ts b/src/typings/StaffFlags.ts index 5297ab2..df62f5d 100644 --- a/src/typings/StaffFlags.ts +++ b/src/typings/StaffFlags.ts @@ -20,11 +20,7 @@ const StaffFlags = { /** * Moderator */ - Moderator: BigInt(1 << 2), - /** - * Donator - */ - Donator: BigInt(1 << 5) + Moderator: BigInt(1 << 2) } as const; export { StaffFlags };