diff --git a/.eslintrc.json b/.eslintrc.json index d38a593..90ca1cd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,12 @@ { - "extends": ["eslint:recommended", "standard"], + "extends": ["eslint:recommended", "standard", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking"], + "plugins": ["@typescript-eslint"], "rules": { "semi": [2, "always"] + }, + "parserOptions": { + "project": ["tsconfig.json"] } } \ No newline at end of file diff --git a/package.json b/package.json index d9a9a89..d85ceb9 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ "@types/node-fetch": "^2", "@types/string-similarity": "^4.0.0", "@types/ws": "^8.2.0", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", "eslint": "^8.0.1", "eslint-config-standard": "^16.0.3", "eslint-plugin-import": "^2.25.2", diff --git a/src/commands/ban.ts b/src/commands/ban.ts index 364cb7d..68d7b33 100644 --- a/src/commands/ban.ts +++ b/src/commands/ban.ts @@ -3,7 +3,7 @@ import discord = require('discord.js'); export const roles = ['Admins', 'Moderators', 'CitraBot']; export function command (message: discord.Message) { - message.mentions.users.map((user) => { - ban(user, message.author, message.guild); + message.mentions.users.map(async (user) => { + await ban(user, message.author, message.guild); }); }; diff --git a/src/commands/clearWarnings.ts b/src/commands/clearWarnings.ts index ebfa753..a95e727 100644 --- a/src/commands/clearWarnings.ts +++ b/src/commands/clearWarnings.ts @@ -5,17 +5,17 @@ import discord = require('discord.js'); export const roles = ['Admins', 'Moderators']; export function command (message: discord.Message) { - message.mentions.users.map((user) => { + message.mentions.users.map(async (user) => { const count = state.warnings.filter(x => x.id === user.id && !x.cleared); if (count != null && count.length > 0) { count.forEach(warning => { warning.cleared = true; }); data.flushWarnings(); - message.channel.send(`${user.toString()}, your warnings have been cleared.`); + await message.channel.send(`${user.toString()}, your warnings have been cleared.`); } else { - message.channel.send(`${user.toString()}, you have no warnings to clear.`); + await message.channel.send(`${user.toString()}, you have no warnings to clear.`); } logger.info(`${message.author.username} has cleared all warnings for ${user} ${user.username} [${count?.length}].`); - state.logChannel?.send(`${message.author.toString()} has cleared all warnings for ${user.toString()} [${count?.length}].`); + await state.logChannel?.send(`${message.author.toString()} has cleared all warnings for ${user.toString()} [${count?.length}].`); }); }; diff --git a/src/commands/game.ts b/src/commands/game.ts index 4d01c64..4678565 100644 --- a/src/commands/game.ts +++ b/src/commands/game.ts @@ -62,11 +62,11 @@ export async function command (message: discord.Message) { try { await state.gameDBPromise; } catch (e) { - message.channel.send('Game compatibility feed temporarily unavailable.'); + await message.channel.send('Game compatibility feed temporarily unavailable.'); throw e; } finally { // We don't need this message anymore - waitMessage.then(waitMessageResult => waitMessageResult.delete()); + waitMessage.then(async waitMessageResult => await waitMessageResult.delete()); } } @@ -87,7 +87,7 @@ export async function command (message: discord.Message) { } if (!bestGame) { - message.channel.send('Game could not be found.'); + await message.channel.send('Game could not be found.'); return; } @@ -104,5 +104,5 @@ export async function command (message: discord.Message) { .setURL(url) .setThumbnail(screenshot); - message.channel.send({embeds: [embed]}); + await message.channel.send({embeds: [embed]}); } diff --git a/src/commands/grantDeveloper.ts b/src/commands/grantDeveloper.ts index b71389a..27214de 100644 --- a/src/commands/grantDeveloper.ts +++ b/src/commands/grantDeveloper.ts @@ -16,22 +16,22 @@ export function command (message: discord.Message) { const alreadyJoined = member.roles.cache.has(role); if (alreadyJoined) { - member.roles.remove(role).then(() => { - message.channel.send(`${user.toString()}'s speech has been revoked in the #development channel.`); - }).catch(() => { - state.logChannel?.send(`Error revoking ${user.toString()}'s developer speech...`); + member.roles.remove(role).then(async () => { + await message.channel.send(`${user.toString()}'s speech has been revoked in the #development channel.`); + }).catch(async () => { + await state.logChannel?.send(`Error revoking ${user.toString()}'s developer speech...`); logger.error(`Error revoking ${user} ${user.username}'s developer speech...`); }); } else { - member.roles.add(role).then(() => { - message.channel.send(`${user.toString()} has been granted speech in the #development channel.`); - }).catch(() => { - state.logChannel?.send(`Error granting ${user.toString()}'s developer speech...`); + member.roles.add(role).then(async () => { + await message.channel.send(`${user.toString()} has been granted speech in the #development channel.`); + }).catch(async () => { + await state.logChannel?.send(`Error granting ${user.toString()}'s developer speech...`); logger.error(`Error granting ${user} ${user.username}'s developer speech...`); }); } - }).catch(() => { - message.channel.send(`User ${user.toString()} was not found in the channel.`); + }).catch(async () => { + await message.channel.send(`User ${user.toString()} was not found in the channel.`); }); }); diff --git a/src/commands/info.ts b/src/commands/info.ts index ef504d4..d5e90d7 100644 --- a/src/commands/info.ts +++ b/src/commands/info.ts @@ -13,8 +13,8 @@ function formatBans (bans: UserBan[]) { return bans.map(x => `[${x.date}] ${x.warnedByUsername} banned ${x.username} [${x.priorWarnings} + 1].`); } -export function command (message: discord.Message) { - message.mentions.users.map((user) => { +export async function command (message: discord.Message) { + message.mentions.users.map(async (user) => { const totalWarnings = state.warnings.filter(x => x.id === user.id && x.cleared === false).length; const warns = state.warnings.filter(x => x.id === user.id); const bans = state.bans.filter(x => x.id === user.id); @@ -22,6 +22,6 @@ export function command (message: discord.Message) { const warnsString = `Warns: \`\`\`${formatWarnings(warns).join('\n')}\`\`\``; const bansString = `Bans: \`\`\`${formatBans(bans).join('\n')}\`\`\``; - message.channel.send(`\`${user.username} (${totalWarnings}) information:\`${warns.length !== 0 ? warnsString : '\n\n'}${bans.length !== 0 ? bansString : ''}`); + await message.channel.send(`\`${user.username} (${totalWarnings}) information:\`${warns.length !== 0 ? warnsString : '\n\n'}${bans.length !== 0 ? bansString : ''}`); }); }; diff --git a/src/commands/quote.ts b/src/commands/quote.ts index 2eee13c..208dc98 100644 --- a/src/commands/quote.ts +++ b/src/commands/quote.ts @@ -1,7 +1,7 @@ import discord = require('discord.js'); export const roles = ['Admins', 'Moderators']; -export function command (message: discord.Message, reply: string) { +export async function command (message: discord.Message, reply: string) { let replyMessage; if (reply == null) { replyMessage = message.content.substr(message.content.indexOf(' ') + 1); @@ -9,5 +9,5 @@ export function command (message: discord.Message, reply: string) { replyMessage = `${message.mentions.users.map(user => `${user.toString()}`)} ${reply}`; } - message.channel.send(replyMessage); + await message.channel.send(replyMessage); } diff --git a/src/commands/status.ts b/src/commands/status.ts index 846b592..6193162 100644 --- a/src/commands/status.ts +++ b/src/commands/status.ts @@ -14,7 +14,7 @@ export function command(message: discord.Message) { if (!pr || pr.documentation_url || !pr.head) throw new Error('PR not found'); const headSHA = pr.head.sha; // use the new GitHub checks API - fetch(`https://api.github.com/repos/${repo}/commits/${headSHA}/check-runs`, fetchOptions).then(response => response.json()).then((statuses: any) => { + fetch(`https://api.github.com/repos/${repo}/commits/${headSHA}/check-runs`, fetchOptions).then(response => response.json()).then(async (statuses: any) => { if (!statuses.check_runs || statuses.total_count < 1) throw new Error('No check runs'); let msg = new discord.MessageEmbed().setTitle(`Status for PR #${pr_number}`).setURL(pr.html_url); let color = 'GREEN' as discord.ColorResolvable; @@ -23,11 +23,11 @@ export function command(message: discord.Message) { if (run.conclusion !== 'success') color = 'RED'; }); msg.setColor(color); - message.channel.send({ embeds: [msg] }); - }).catch(() => { - message.channel.send('I wasn\'t able to get the status of that PR...') + await message.channel.send({ embeds: [msg] }); + }).catch(async () => { + await message.channel.send('I wasn\'t able to get the status of that PR...') }); - }).catch(() => { - message.channel.send('No such PR.'); + }).catch(async () => { + await message.channel.send('No such PR.'); }); } diff --git a/src/commands/warn.ts b/src/commands/warn.ts index a815325..713dcd2 100644 --- a/src/commands/warn.ts +++ b/src/commands/warn.ts @@ -8,15 +8,15 @@ exports.roles = ['Admins', 'Moderators']; exports.command = function (message: discord.Message) { const silent = message.content.includes('silent'); - message.mentions.users.map((user) => { + message.mentions.users.map(async (user) => { const count = state.warnings.filter(x => x.id === user.id && !x.cleared).length || 0; if (silent === false) { - message.channel.send(`${user.toString()} You have been warned. Additional infractions may result in a ban.`); + await message.channel.send(`${user.toString()} You have been warned. Additional infractions may result in a ban.`); } logger.info(`${message.author.username} ${message.author} has warned ${user.username} ${user} [${count} + 1].`); - state.logChannel?.send(`${message.author.toString()} has warned ${user.toString()} (${user.username}) [${user}] [${count} + 1].`); + await state.logChannel?.send(`${message.author.toString()} has warned ${user.toString()} (${user.username}) [${user}] [${count} + 1].`); state.warnings.push(new UserWarning(user.id, user.username, message.author.id, message.author.username, count, silent)); data.flushWarnings(); diff --git a/src/commands/warnings.ts b/src/commands/warnings.ts index 52e517e..ce6d57e 100644 --- a/src/commands/warnings.ts +++ b/src/commands/warnings.ts @@ -2,8 +2,8 @@ import state from '../state'; import discord = require('discord.js'); exports.command = function (message: discord.Message) { - message.mentions.users.map((user) => { + message.mentions.users.map(async (user) => { const warnings = state.warnings.filter(x => x.id === user.id && !x.cleared); - message.channel.send(`${user.toString()}, you have ${warnings.length} total warnings.`); + await message.channel.send(`${user.toString()}, you have ${warnings.length} total warnings.`); }); }; diff --git a/src/common.ts b/src/common.ts index fed1d47..bfc15a2 100644 --- a/src/common.ts +++ b/src/common.ts @@ -4,15 +4,15 @@ import logger from './logging'; import UserBan from './models/UserBan'; import discord = require('discord.js'); -export function ban(user: discord.User, moderator: discord.User, guild: discord.Guild | null) { +export async function ban(user: discord.User, moderator: discord.User, guild: discord.Guild | null) { const count = state.warnings.filter(x => x.id === user.id && !x.cleared).length || 0; logger.info(`${moderator.toString()} has banned ${user.toString()} ${user.id} ${user.username}.`); - state.logChannel?.send(`${moderator.toString()} has banned ${user.id} ${user.toString()} [${count}].`); + await state.logChannel?.send(`${moderator.toString()} has banned ${user.id} ${user.toString()} [${count}].`); state.bans.push(new UserBan(user.id, user.username, moderator.id, moderator.username, count)); - guild?.members?.ban(user).catch(function (error) { - state.logChannel?.send(`Error banning ${user.toString()} ${user.username}`); + guild?.members?.ban(user).catch(async function (error) { + await state.logChannel?.send(`Error banning ${user.toString()} ${user.username}`); logger.error(`Error banning ${user.toString()} ${user.id} ${user.username}.`, error); }); diff --git a/src/server.ts b/src/server.ts index 62011b8..d42380a 100644 --- a/src/server.ts +++ b/src/server.ts @@ -68,12 +68,12 @@ client.on('disconnect', () => { logger.warn('Disconnected from Discord server.'); }); -client.on('guildMemberAdd', (member) => { +client.on('guildMemberAdd', async (member) => { if (process.env.DISCORD_RULES_ROLE) - member.roles.add(process.env.DISCORD_RULES_ROLE); + await member.roles.add(process.env.DISCORD_RULES_ROLE); }); -client.on('messageDelete', message => { +client.on('messageDelete', async (message) => { const AllowedRoles = ['Administrators', 'Moderators', 'Team', 'Developer', 'Support', 'VIP']; let authorRoles = message.member?.roles?.cache?.map(x => x.name); if (!authorRoles) { @@ -97,14 +97,14 @@ client.on('messageDelete', message => { let userInfo = `${message.author?.toString()} (${message.author?.username}) (${message.author})` - state.msglogChannel?.send({ content: userInfo, embeds: [deletionEmbed] }); + await state.msglogChannel?.send({ content: userInfo, embeds: [deletionEmbed] }); logger.info(`${message.author?.username} ${message.author} deleted message: ${message.cleanContent}.`); } } } }); -client.on('messageUpdate', (oldMessage, newMessage) => { +client.on('messageUpdate', async (oldMessage, newMessage) => { const AllowedRoles = ['Administrators', 'Moderators', 'Team', 'Developer', 'Support', 'VIP']; let authorRoles = oldMessage.member?.roles?.cache?.map(x => x.name); if (!authorRoles) { @@ -131,21 +131,21 @@ client.on('messageUpdate', (oldMessage, newMessage) => { let userInfo = `${oldMessage.author?.toString()} (${oldMessage.author?.username}) (${oldMessage.author})` - state.msglogChannel?.send({ content: userInfo, embeds: [editedEmbed] }); + await state.msglogChannel?.send({ content: userInfo, embeds: [editedEmbed] }); logger.info(`${oldMessage.author?.username} ${oldMessage.author} edited message from: ${oldM} to: ${newM}.`); } } } }); -client.on('messageCreate', message => { +client.on('messageCreate', async (message) => { if (message.author.bot && message.content.startsWith('.ban') === false) { return; } if (message.guild == null && state.responses.pmReply) { // We want to log PM attempts. // logger.info(`${message.author.username} ${message.author} [PM]: ${message.content}`); // state.logChannel.send(`${message.author.toString()} [PM]: ${message.content}`); - message.reply(state.responses.pmReply); + await message.reply(state.responses.pmReply); return; } @@ -166,7 +166,7 @@ client.on('messageCreate', message => { } else if (mediaUsers.get(message.author.id)) { mediaUsers.set(message.author.id, false); } else { - message.delete(); + await message.delete(); mediaUsers.set(message.author.id, false); } } @@ -177,11 +177,11 @@ client.on('messageCreate', message => { if (message.content.toLowerCase().includes(rulesTrigger)) { // We want to remove the 'Unauthorized' role from them once they agree to the rules. logger.verbose(`${message.author.username} ${message.author} has accepted the rules, removing role ${process.env.DISCORD_RULES_ROLE}.`); - message.member?.roles.remove(rluesRole, 'Accepted the rules.'); + await message.member?.roles.remove(rluesRole, 'Accepted the rules.'); } // Delete the message in the channel to force a cleanup. - message.delete(); + await message.delete(); } else if (message.content.startsWith('.') && message.content.startsWith('..') === false) { // We want to make sure it's an actual command, not someone '...'-ing. const cmd = message.content.split(' ', 1)[0].slice(1); @@ -199,30 +199,30 @@ client.on('messageCreate', message => { return; } if (cachedModule && cachedModule.roles && !findArray(authorRoles, cachedModule.roles)) { - state.logChannel?.send(`${message.author.toString()} attempted to use admin command: ${message.content}`); + await state.logChannel?.send(`${message.author.toString()} attempted to use admin command: ${message.content}`); logger.info(`${message.author.username} ${message.author} attempted to use admin command: ${message.content}`); return; } logger.info(`${message.author.username} ${message.author} [Channel: ${message.channel}] executed command: ${message.content}`); - message.delete(); + await message.delete(); try { if (!!cachedModule) { - cachedModule.command(message); + await cachedModule.command(message); } else if (cachedModules['quote']) { - cachedModules['quote'].command(message, quoteResponse?.reply); + await cachedModules['quote'].command(message, quoteResponse?.reply); } } catch (err) { logger.error(err); } } else if (message.author.bot === false) { // This is a normal channel message. - cachedTriggers.forEach(function (trigger) { + cachedTriggers.forEach(async function (trigger) { if (!trigger.roles || authorRoles && findArray(authorRoles, trigger.roles)) { if (trigger.trigger(message) === true) { logger.debug(`${message.author.username} ${message.author} [Channel: ${message.channel}] triggered: ${message.content}`); try { - trigger.execute(message); + await trigger.execute(message); } catch (err) { logger.error(err); } } } @@ -272,5 +272,5 @@ if (process.env.DATA_CUSTOM_RESPONSES) { data.readCustomResponses(); } -client.login(process.env.DISCORD_LOGIN_TOKEN); +client.login(process.env.DISCORD_LOGIN_TOKEN).catch(err => logger.error(err)); logger.info('Startup completed. Established connection to Discord.'); diff --git a/src/triggers/pingBomb.ts b/src/triggers/pingBomb.ts index 5f9fb84..9684051 100644 --- a/src/triggers/pingBomb.ts +++ b/src/triggers/pingBomb.ts @@ -7,9 +7,9 @@ export function trigger(message: discord.Message) { return message.mentions.users.size > 10; } -export function execute(message: discord.Message) { +export async function execute(message: discord.Message) { const count = message.mentions.users.size; logger.info(`${message.author.toString()} tagged ${count} users in ${message.channel.toString()}`); state.logChannel?.send(`Ping bomb detected in ${message.channel.toString()} by ${message.author.toString()}`); - ban(message.author, message.author, message.guild); + await ban(message.author, message.author, message.guild); }; diff --git a/yarn.lock b/yarn.lock index bf17eb1..ca001d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -93,6 +93,27 @@ resolved "https://registry.yarnpkg.com/@logdna/stdlib/-/stdlib-1.1.5.tgz#e6795149c8e195e71a46237f744b7bdc90eef88c" integrity sha512-SFSLi7TT260tDPRVKpSvbDrYwJSbD+b9zpuf2YdPOBqJjvt5LUbFCur/RJ+whaNArguZhgdi/Lv7aR12T7aCBQ== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@sapphire/async-queue@^1.1.5": version "1.1.7" resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.7.tgz#7f23fc0fdf888d25a04876c2fbf3a207ddf4a2c8" @@ -130,6 +151,11 @@ dependencies: "@types/node" "*" +"@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -160,6 +186,76 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz#2bdb247cc2e2afce7efbce09afb9a6f0a8a08434" + integrity sha512-qQwg7sqYkBF4CIQSyRQyqsYvP+g/J0To9ZPVNJpfxfekl5RmdvQnFFTVVwpRtaUDFNvjfe/34TgY/dpc3MgNTw== + dependencies: + "@typescript-eslint/experimental-utils" "5.2.0" + "@typescript-eslint/scope-manager" "5.2.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.2.0.tgz#e3b2cb9cd0aff9b50f68d9a414c299fd26b067e6" + integrity sha512-fWyT3Agf7n7HuZZRpvUYdFYbPk3iDCq6fgu3ulia4c7yxmPnwVBovdSOX7RL+k8u6hLbrXcdAehlWUVpGh6IEw== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.2.0" + "@typescript-eslint/types" "5.2.0" + "@typescript-eslint/typescript-estree" "5.2.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.2.0.tgz#dc081aa89de16b5676b10215519af3aa7b58fb72" + integrity sha512-Uyy4TjJBlh3NuA8/4yIQptyJb95Qz5PX//6p8n7zG0QnN4o3NF9Je3JHbVU7fxf5ncSXTmnvMtd/LDQWDk0YqA== + dependencies: + "@typescript-eslint/scope-manager" "5.2.0" + "@typescript-eslint/types" "5.2.0" + "@typescript-eslint/typescript-estree" "5.2.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz#7ce8e4ab2baaa0ad5282913ea8e13ce03ec6a12a" + integrity sha512-RW+wowZqPzQw8MUFltfKYZfKXqA2qgyi6oi/31J1zfXJRpOn6tCaZtd9b5u9ubnDG2n/EMvQLeZrsLNPpaUiFQ== + dependencies: + "@typescript-eslint/types" "5.2.0" + "@typescript-eslint/visitor-keys" "5.2.0" + +"@typescript-eslint/types@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.2.0.tgz#7ad32d15abddb0ee968a330f0ea182ea544ef7cf" + integrity sha512-cTk6x08qqosps6sPyP2j7NxyFPlCNsJwSDasqPNjEQ8JMD5xxj2NHxcLin5AJQ8pAVwpQ8BMI3bTxR0zxmK9qQ== + +"@typescript-eslint/typescript-estree@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.2.0.tgz#c22e0ff6f8a4a3f78504a80ebd686fe2870a68ae" + integrity sha512-RsdXq2XmVgKbm9nLsE3mjNUM7BTr/K4DYR9WfFVMUuozHWtH5gMpiNZmtrMG8GR385EOSQ3kC9HiEMJWimxd/g== + dependencies: + "@typescript-eslint/types" "5.2.0" + "@typescript-eslint/visitor-keys" "5.2.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.2.0.tgz#03522d35df98474f08e0357171a7d1b259a88f55" + integrity sha512-Nk7HizaXWWCUBfLA/rPNKMzXzWS8Wg9qHMuGtT+v2/YpPij4nVXrVJc24N/r5WrrmqK31jCrZxeHqIgqRzs0Xg== + dependencies: + "@typescript-eslint/types" "5.2.0" + eslint-visitor-keys "^3.0.0" + acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -261,6 +357,11 @@ array-includes@^3.1.4: get-intrinsic "^1.1.1" is-string "^1.0.7" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array.prototype.flat@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" @@ -305,6 +406,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -497,6 +605,13 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + discord-api-types@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.22.0.tgz#34dc57fe8e016e5eaac5e393646cd42a7e1ccc2a" @@ -675,6 +790,14 @@ eslint-plugin-standard@^4.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-scope@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-6.0.0.tgz#9cf45b13c5ac8f3d4c50f46a5121f61b3e318978" @@ -784,6 +907,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" @@ -799,6 +927,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -809,6 +948,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + fecha@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" @@ -821,6 +967,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -892,6 +1045,13 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -918,6 +1078,18 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" +globby@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -979,7 +1151,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: +ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== @@ -1075,7 +1247,7 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-glob@^4.0.0, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -1094,6 +1266,11 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -1278,6 +1455,19 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + mime-db@1.50.0: version "1.50.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" @@ -1454,6 +1644,16 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -1481,6 +1681,11 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + readable-stream@^2.3.7: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -1521,6 +1726,11 @@ resolve@^1.10.1, resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -1528,6 +1738,13 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -1548,7 +1765,7 @@ semver@^6.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1: +semver@^7.2.1, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -1583,6 +1800,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -1683,6 +1905,13 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -1726,11 +1955,23 @@ tsconfig-paths@^3.11.0: minimist "^1.2.0" strip-bom "^3.0.0" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"