From 9fecc38ef8ed8ccc4655e83060f74347c9d79115 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 7 Sep 2022 15:22:50 -0500 Subject: [PATCH 001/146] Move util and roleUtils into separate utils folder --- commands/owner/createRoles.ts | 2 +- commands/owner/csClassPoll.ts | 4 ++-- commands/owner/staffPoll.ts | 2 +- commands/owner/yearPoll.ts | 2 +- commands/user/clear.ts | 2 +- commands/user/view.ts | 2 +- features/interactionCreate.ts | 2 +- models/classModel.ts | 2 +- models/staffModel.ts | 2 +- models/yearModel.ts | 2 +- rolesOps.ts => utils/roleUtils.ts | 6 +++--- util.ts => utils/util.ts | 0 12 files changed, 14 insertions(+), 14 deletions(-) rename rolesOps.ts => utils/roleUtils.ts (96%) rename util.ts => utils/util.ts (100%) diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index 2b1efd4..17115d0 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -1,5 +1,5 @@ import { ICommand } from "wokcommands"; -import { createRoles } from "../../rolesOps"; +import { createRoles } from "../../utils/roleUtils"; import chalk from "chalk"; import { classModel } from "../../models/classModel"; import { staffModel } from "../../models/staffModel"; diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index 37457e6..447aab3 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -7,8 +7,8 @@ import { import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { checkForRoles } from "../../rolesOps"; -import { sleep } from "../../util"; +import { checkForRoles } from "../../utils/roleUtils"; +import { sleep } from "../../utils/util"; // Splits any size list into lists of at most `max_list_len` function split_list(list: T[], max_list_len: number): T[][] { diff --git a/commands/owner/staffPoll.ts b/commands/owner/staffPoll.ts index 8b6cc06..2a010a3 100644 --- a/commands/owner/staffPoll.ts +++ b/commands/owner/staffPoll.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { MessageEmbed, MessageActionRow, MessageSelectMenu } from "discord.js"; import { ICommand } from "wokcommands"; -import { checkForRoles } from "../../rolesOps"; +import { checkForRoles } from "../../utils/roleUtils"; export default { name: "staffPoll", diff --git a/commands/owner/yearPoll.ts b/commands/owner/yearPoll.ts index 2042765..1f434c0 100644 --- a/commands/owner/yearPoll.ts +++ b/commands/owner/yearPoll.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { MessageEmbed, MessageActionRow, MessageSelectMenu } from "discord.js"; import { ICommand } from "wokcommands"; -import { checkForRoles } from "../../rolesOps"; +import { checkForRoles } from "../../utils/roleUtils"; export default { name: "yearPoll", diff --git a/commands/user/clear.ts b/commands/user/clear.ts index d3520a9..7c90193 100644 --- a/commands/user/clear.ts +++ b/commands/user/clear.ts @@ -4,7 +4,7 @@ import { ICommand } from "wokcommands"; import { classModel } from "../../models/classModel"; import { staffModel } from "../../models/staffModel"; import { yearModel } from "../../models/yearModel"; -import { removeRole } from "../../rolesOps"; +import { removeRole } from "../../utils/roleUtils"; export default { name: "clear", diff --git a/commands/user/view.ts b/commands/user/view.ts index c6b0cd9..c5eee6e 100644 --- a/commands/user/view.ts +++ b/commands/user/view.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { GuildMember } from "discord.js"; import { ICommand } from "wokcommands"; -import { getUsersRoles } from "../../rolesOps"; +import { getUsersRoles } from "../../utils/roleUtils"; export default { name: "view", diff --git a/features/interactionCreate.ts b/features/interactionCreate.ts index 7f25607..25a51b6 100644 --- a/features/interactionCreate.ts +++ b/features/interactionCreate.ts @@ -1,6 +1,6 @@ import { Client, MessageEmbed, GuildMember } from "discord.js"; import { yearModel } from "../models/yearModel"; -import { removeRole, addNewRole } from "../rolesOps"; +import { removeRole, addNewRole } from "../utils/roleUtils"; import { staffModel } from "../models/staffModel"; import { classModel } from "../models/classModel"; diff --git a/models/classModel.ts b/models/classModel.ts index b0d3c07..c2f449e 100644 --- a/models/classModel.ts +++ b/models/classModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../rolesOps"; +import { IRole } from "../utils/roleUtils"; export interface IClass extends IRole { id: string; diff --git a/models/staffModel.ts b/models/staffModel.ts index 3d6f3c2..c6b0822 100644 --- a/models/staffModel.ts +++ b/models/staffModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../rolesOps"; +import { IRole } from "../utils/roleUtils"; export interface IStaff extends IRole { id: string; diff --git a/models/yearModel.ts b/models/yearModel.ts index dcded9e..dc6463b 100644 --- a/models/yearModel.ts +++ b/models/yearModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../rolesOps"; +import { IRole } from "../utils/roleUtils"; export interface IYear extends IRole { id: string; diff --git a/rolesOps.ts b/utils/roleUtils.ts similarity index 96% rename from rolesOps.ts rename to utils/roleUtils.ts index 4b5767b..509d012 100644 --- a/rolesOps.ts +++ b/utils/roleUtils.ts @@ -1,8 +1,8 @@ import { GuildMember, Guild } from "discord.js"; import chalk from "chalk"; -import { classModel } from "./models/classModel"; -import { staffModel } from "./models/staffModel"; -import { yearModel } from "./models/yearModel"; +import { classModel } from "../models/classModel"; +import { staffModel } from "../models/staffModel"; +import { yearModel } from "../models/yearModel"; import { Model } from "mongoose"; export interface IRole { diff --git a/util.ts b/utils/util.ts similarity index 100% rename from util.ts rename to utils/util.ts From c93c16c1abc4b11628af0fc6b54a31d6291bbc06 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 7 Sep 2022 15:23:06 -0500 Subject: [PATCH 002/146] WIP --- commands/owner/csCreateChannels.ts | 61 ++++++++++++++++++++++++++++++ utils/channelUtils.ts | 33 ++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 commands/owner/csCreateChannels.ts create mode 100644 utils/channelUtils.ts diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts new file mode 100644 index 0000000..01745e2 --- /dev/null +++ b/commands/owner/csCreateChannels.ts @@ -0,0 +1,61 @@ +import { MessageEmbed } from "discord.js"; + +import chalk from "chalk"; +import { ICommand } from "wokcommands"; +import { classModel } from "../../models/classModel"; +import { checkForChannel, createTextChannel } from "../../utils/channelUtils"; + +export default { + name: "csCreateChannels", + category: "owner", + description: "Update CS class channels", + slash: true, + testOnly: false, + guildOnly: true, + requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], + ownerOnly: true, + + callback: async ({ client, interaction: msgInt }) => { + if (msgInt.guild === null) { + console.log(chalk.red("No guild")); + return; + } + + const classes = await classModel.find({}).sort({ CODE: 1 }); + + for (let index = 0; index < classes.length; index++) { + const channel = await checkForChannel(msgInt.guild, classes[index].CODE); + + if (channel === undefined) { + const new_channel = await createTextChannel( + msgInt.guild, + classes[index].CODE, + classes[index].INFO + ); + } else { + } + } + + const infoEmbed = new MessageEmbed() + .setTitle("Created Classes") + .setColor("#0099ff") + .setDescription(`Populated ${msgInt.guild.name} with COMPSCI classes.`) + .setFooter({ + text: `Delivered in: ${client.ws.ping}ms | CSSC-Bot | ${process.env.VERSION}`, + iconURL: "https://playantares.com/resources/CSSC-bot/icon.jpg", + }); + + msgInt.reply({ embeds: [infoEmbed] }); + + // Log the command usage + console.log( + chalk.blue( + `${chalk.green(`[COMMAND]`)} ${chalk.yellow( + msgInt.user.tag + )} used the ${chalk.green(`/csclasspoll`)} command in ${chalk.yellow( + msgInt.guild?.name + )}` + ) + ); + }, +} as ICommand; diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts new file mode 100644 index 0000000..46f9d9c --- /dev/null +++ b/utils/channelUtils.ts @@ -0,0 +1,33 @@ +import { Guild } from "discord.js"; + +export async function checkForChannel(guild: Guild, channel_name: string) { + return guild.channels.cache.find((channel) => channel.name === channel_name); +} + +export async function createTextChannel( + guild: Guild, + channel_name: string, + channel_topic?: string, + channel_category?: string +) { + let category = undefined; + + if (channel_category) { + category = guild.channels.cache.find( + (channel) => + channel.name == channel_name && channel.type === "GUILD_CATEGORY" + ); + + if (category === undefined) { + category = guild.channels.create(channel_category, { + type: "GUILD_CATEGORY", + }); + } + } + + return guild.channels.create(channel_name, { + type: "GUILD_TEXT", + topic: channel_topic ? channel_topic : "", + parent: channel_category, + }); +} From 19c483766b0f68a705cb0634dfcfdce8c9453b96 Mon Sep 17 00:00:00 2001 From: Nate Goldsborough Date: Wed, 7 Sep 2022 15:25:29 -0500 Subject: [PATCH 003/146] add is-docker --- env.template | 17 +---------------- package-lock.json | 22 +++++++++++++++++++++- package.json | 3 ++- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/env.template b/env.template index f2db930..4df9c9e 100644 --- a/env.template +++ b/env.template @@ -3,19 +3,4 @@ MONGODB_URI= BOT_DEFAULT_PREFIX= VERSION= UPTIME_KUMA_MONITOR_DOMAIN= -UPTIME_KUMA_MONITOR_ID= - - -# Fill out these values with the role id's of the roles you have in your server - -Prefrosh= -Freshman= -Sophomore= -Junior= -Senior= -Graduatestudent= -Alumni= -Sileader= -Ta= -Studentemployee= -Professor= \ No newline at end of file +UPTIME_KUMA_MONITOR_ID= \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 860b625..c51b043 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "axios": "^0.27.2", "chalk": "4.1.2", "discord.js": "^13.9.2", + "is-docker": "^3.0.0", "mongoose": "^6.5.4", "path": "^0.12.7", "prettier": "^2.7.1", @@ -481,6 +482,20 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, + "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==", + "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/kareem": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", @@ -1199,6 +1214,11 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, + "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==" + }, "kareem": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", @@ -1476,4 +1496,4 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index b135bcb..2f73918 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "axios": "^0.27.2", "chalk": "4.1.2", "discord.js": "^13.9.2", + "is-docker": "^3.0.0", "mongoose": "^6.5.4", "path": "^0.12.7", "prettier": "^2.7.1", @@ -31,4 +32,4 @@ "typescript": "^4.5.5", "wokcommands": "^1.5.3" } -} \ No newline at end of file +} From adb3695ae6aaf9b84179ed61f48a76d8fe03a055 Mon Sep 17 00:00:00 2001 From: Nate Goldsborough Date: Wed, 7 Sep 2022 15:33:40 -0500 Subject: [PATCH 004/146] Detect running in a container --- features/statuspage.ts | 5 +++++ index.ts | 2 ++ package-lock.json | 20 -------------------- package.json | 1 - util.ts | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/features/statuspage.ts b/features/statuspage.ts index a555560..7249eb5 100644 --- a/features/statuspage.ts +++ b/features/statuspage.ts @@ -1,12 +1,17 @@ import axios from "axios"; import { Client } from "discord.js"; +import { isDocker } from "../util"; export default (client: Client): void => { + + // Check if the bot is running in a docker container by checking if the env variable UPTIME_KUMA_CONTAINERIZED is true + if (isDocker()) return; const updateStatus = async () => { // This function is called every 1 minutes and pings the network status page for uptime monitoring await axios.get( `https://${process.env.UPTIME_KUMA_MONITOR_DOMAIN}/api/push/${process.env.UPTIME_KUMA_MONITOR_ID}?msg=OK&ping=${client.ws.ping}` ); + console.log("ping anyways") setTimeout(updateStatus, 1000 * 60); }; updateStatus().catch((err) => console.log(err)); diff --git a/index.ts b/index.ts index ee5ec5e..6b38a77 100644 --- a/index.ts +++ b/index.ts @@ -4,6 +4,7 @@ import WOKCommands from "wokcommands"; import path from "path"; import chalk from "chalk"; import dotenv from "dotenv"; +import { isDocker } from "./util"; // import custom modules import { checkForRoles, checkIfCollectionsExist } from "./rolesOps"; @@ -27,6 +28,7 @@ const client = new DiscordJs.Client({ client.on("ready", async () => { if (client.user) { console.log(chalk.green(`Logged in as ${client.user.tag}!`)); + if (isDocker()) console.log(chalk.blueBright(`Running in a Docker container!`)); console.log( chalk.yellow.bold(`I am running version: ${process.env.VERSION}`) ); diff --git a/package-lock.json b/package-lock.json index c51b043..fddf6eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "axios": "^0.27.2", "chalk": "4.1.2", "discord.js": "^13.9.2", - "is-docker": "^3.0.0", "mongoose": "^6.5.4", "path": "^0.12.7", "prettier": "^2.7.1", @@ -482,20 +481,6 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, - "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==", - "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/kareem": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", @@ -1214,11 +1199,6 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" }, - "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==" - }, "kareem": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", diff --git a/package.json b/package.json index 2f73918..53b3ee4 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "axios": "^0.27.2", "chalk": "4.1.2", "discord.js": "^13.9.2", - "is-docker": "^3.0.0", "mongoose": "^6.5.4", "path": "^0.12.7", "prettier": "^2.7.1", diff --git a/util.ts b/util.ts index 6d492e6..41380da 100644 --- a/util.ts +++ b/util.ts @@ -1,6 +1,38 @@ +import fs from 'node:fs'; export function sleep(ms: number) { // Create new promise that resolves itself after a delay of return new Promise((resolve: (args: void) => void) => setTimeout(resolve, ms) ); } + + +//! This code was taken from the package `is-docker` and modified to work here with esm +//! Original repository: https://github.com/sindresorhus/is-docker +let isDockerCached: boolean; + +function hasDockerEnv() { + try { + fs.statSync('/.dockerenv'); + return true; + } catch { + return false; + } +} + +function hasDockerCGroup() { + try { + return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker'); + } catch { + return false; + } +} + +export function isDocker() { + // TODO: Use `??=` when targeting Node.js 16. + if (isDockerCached === undefined) { + isDockerCached = hasDockerEnv() || hasDockerCGroup(); + } + + return isDockerCached; +} \ No newline at end of file From f1746fe11cd0fc4f423637a52bbe071eadd66381 Mon Sep 17 00:00:00 2001 From: Nate Goldsborough Date: Wed, 7 Sep 2022 16:27:58 -0500 Subject: [PATCH 005/146] Update branch to be even with `staging` --- features/statuspage.ts | 3 +-- index.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/features/statuspage.ts b/features/statuspage.ts index 7249eb5..03e9730 100644 --- a/features/statuspage.ts +++ b/features/statuspage.ts @@ -1,6 +1,6 @@ import axios from "axios"; import { Client } from "discord.js"; -import { isDocker } from "../util"; +import { isDocker } from "../utils/util"; export default (client: Client): void => { @@ -11,7 +11,6 @@ export default (client: Client): void => { await axios.get( `https://${process.env.UPTIME_KUMA_MONITOR_DOMAIN}/api/push/${process.env.UPTIME_KUMA_MONITOR_ID}?msg=OK&ping=${client.ws.ping}` ); - console.log("ping anyways") setTimeout(updateStatus, 1000 * 60); }; updateStatus().catch((err) => console.log(err)); diff --git a/index.ts b/index.ts index 6b38a77..80c7c5d 100644 --- a/index.ts +++ b/index.ts @@ -4,10 +4,10 @@ import WOKCommands from "wokcommands"; import path from "path"; import chalk from "chalk"; import dotenv from "dotenv"; -import { isDocker } from "./util"; +import { isDocker } from "./utils/util"; // import custom modules -import { checkForRoles, checkIfCollectionsExist } from "./rolesOps"; +import { checkForRoles, checkIfCollectionsExist } from "./utils/roleUtils"; import { classModel } from "./models/classModel"; import { staffModel } from "./models/staffModel"; import { yearModel } from "./models/yearModel"; From b0cd0ffec1e983f8ac0072217f07a87b64356233 Mon Sep 17 00:00:00 2001 From: nathen418 Date: Wed, 7 Sep 2022 21:28:28 +0000 Subject: [PATCH 006/146] Apply auto formatting changes --- features/statuspage.ts | 1 - index.ts | 3 ++- utils/util.ts | 37 ++++++++++++++++++------------------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/features/statuspage.ts b/features/statuspage.ts index 03e9730..2bd8b1a 100644 --- a/features/statuspage.ts +++ b/features/statuspage.ts @@ -3,7 +3,6 @@ import { Client } from "discord.js"; import { isDocker } from "../utils/util"; export default (client: Client): void => { - // Check if the bot is running in a docker container by checking if the env variable UPTIME_KUMA_CONTAINERIZED is true if (isDocker()) return; const updateStatus = async () => { diff --git a/index.ts b/index.ts index 80c7c5d..be57762 100644 --- a/index.ts +++ b/index.ts @@ -28,7 +28,8 @@ const client = new DiscordJs.Client({ client.on("ready", async () => { if (client.user) { console.log(chalk.green(`Logged in as ${client.user.tag}!`)); - if (isDocker()) console.log(chalk.blueBright(`Running in a Docker container!`)); + if (isDocker()) + console.log(chalk.blueBright(`Running in a Docker container!`)); console.log( chalk.yellow.bold(`I am running version: ${process.env.VERSION}`) ); diff --git a/utils/util.ts b/utils/util.ts index 41380da..a781494 100644 --- a/utils/util.ts +++ b/utils/util.ts @@ -1,4 +1,4 @@ -import fs from 'node:fs'; +import fs from "node:fs"; export function sleep(ms: number) { // Create new promise that resolves itself after a delay of return new Promise((resolve: (args: void) => void) => @@ -6,33 +6,32 @@ export function sleep(ms: number) { ); } - //! This code was taken from the package `is-docker` and modified to work here with esm //! Original repository: https://github.com/sindresorhus/is-docker let isDockerCached: boolean; function hasDockerEnv() { - try { - fs.statSync('/.dockerenv'); - return true; - } catch { - return false; - } + try { + fs.statSync("/.dockerenv"); + return true; + } catch { + return false; + } } function hasDockerCGroup() { - try { - return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker'); - } catch { - return false; - } + try { + return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); + } catch { + return false; + } } export function isDocker() { - // TODO: Use `??=` when targeting Node.js 16. - if (isDockerCached === undefined) { - isDockerCached = hasDockerEnv() || hasDockerCGroup(); - } + // TODO: Use `??=` when targeting Node.js 16. + if (isDockerCached === undefined) { + isDockerCached = hasDockerEnv() || hasDockerCGroup(); + } - return isDockerCached; -} \ No newline at end of file + return isDockerCached; +} From b5dfd6e00de3c0e793f6d4ce66573b3c4706c6d7 Mon Sep 17 00:00:00 2001 From: Nate Goldsborough Date: Wed, 7 Sep 2022 17:07:13 -0500 Subject: [PATCH 007/146] Empty Commit From 8fc0485dbb7da40a345f4f6790f064ae77216e95 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 7 Sep 2022 23:03:50 -0500 Subject: [PATCH 008/146] WIP --- commands/owner/csCreateChannels.ts | 52 +++++++++++++++++++++--------- index.ts | 2 +- utils/channelUtils.ts | 44 +++++++++++++++++++++++-- 3 files changed, 79 insertions(+), 19 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 01745e2..8b280f8 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -3,7 +3,11 @@ import { MessageEmbed } from "discord.js"; import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel } from "../../models/classModel"; -import { checkForChannel, createTextChannel } from "../../utils/channelUtils"; +import { + checkForChannel, + createTextChannel, + moveChannel, +} from "../../utils/channelUtils"; export default { name: "csCreateChannels", @@ -21,40 +25,58 @@ export default { return; } + const color = "#0099ff"; + const thumbnail = + "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + const title = "Create Classes"; + const description = `Populated ${msgInt.guild.name} with COMPSCI classes.`; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + const classes = await classModel.find({}).sort({ CODE: 1 }); for (let index = 0; index < classes.length; index++) { const channel = await checkForChannel(msgInt.guild, classes[index].CODE); - if (channel === undefined) { + if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, classes[index].CODE, classes[index].INFO ); + + console.log( + chalk.yellow( + `Created channel: ${new_channel.name} in guild ${msgInt.guild.name}` + ) + ); + + moveChannel(msgInt.guild, new_channel, "COMP SCI CLASSES"); + //TODO: Write channel id to db } else { + moveChannel(msgInt.guild, channel, "COMP SCI CLASSES"); + //Confirm channel ID is in db } } - const infoEmbed = new MessageEmbed() - .setTitle("Created Classes") - .setColor("#0099ff") - .setDescription(`Populated ${msgInt.guild.name} with COMPSCI classes.`) - .setFooter({ - text: `Delivered in: ${client.ws.ping}ms | CSSC-Bot | ${process.env.VERSION}`, - iconURL: "https://playantares.com/resources/CSSC-bot/icon.jpg", - }); - - msgInt.reply({ embeds: [infoEmbed] }); + await msgInt.reply({ embeds: [embed], ephemeral: true }); // Log the command usage console.log( chalk.blue( `${chalk.green(`[COMMAND]`)} ${chalk.yellow( msgInt.user.tag - )} used the ${chalk.green(`/csclasspoll`)} command in ${chalk.yellow( - msgInt.guild?.name - )}` + )} used the ${chalk.green( + `/csCreateChannels` + )} command in ${chalk.yellow(msgInt.guild?.name)}` ) ); }, diff --git a/index.ts b/index.ts index ee5ec5e..5467eea 100644 --- a/index.ts +++ b/index.ts @@ -6,7 +6,7 @@ import chalk from "chalk"; import dotenv from "dotenv"; // import custom modules -import { checkForRoles, checkIfCollectionsExist } from "./rolesOps"; +import { checkForRoles, checkIfCollectionsExist } from "./utils/roleUtils"; import { classModel } from "./models/classModel"; import { staffModel } from "./models/staffModel"; import { yearModel } from "./models/yearModel"; diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 46f9d9c..3d638a2 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,7 +1,11 @@ -import { Guild } from "discord.js"; +import { Guild, GuildChannel } from "discord.js"; export async function checkForChannel(guild: Guild, channel_name: string) { - return guild.channels.cache.find((channel) => channel.name === channel_name); + // console.log(guild.channels.cache); + return guild.channels.cache.find((channel) => { + console.log(channel.name); + return channel.name == channel_name; + }); } export async function createTextChannel( @@ -19,7 +23,7 @@ export async function createTextChannel( ); if (category === undefined) { - category = guild.channels.create(channel_category, { + category = await guild.channels.create(channel_category, { type: "GUILD_CATEGORY", }); } @@ -31,3 +35,37 @@ export async function createTextChannel( parent: channel_category, }); } + +export async function moveChannel( + guild: Guild, + channel: GuildChannel, + category_name: string +) { + if ( + channel.parent === null || + channel.parent === undefined || + channel.parent?.name != category_name + ) { + // Move the class to parent "COMP SCI" + console.log( + `Parent Name: ${channel.parent?.name}.....Category name: ${category_name}` + ); + console.log("moving channel"); + let category = await findCategory(guild, category_name); + channel.setParent(category); + } +} + +async function findCategory(guild: Guild, category_name: string) { + let category = guild.channels.cache.find( + (category) => category.name == category_name + ); + + if (category === undefined || category.type !== "GUILD_CATEGORY") { + category = await guild.channels.create(category_name, { + type: "GUILD_CATEGORY", + }); + } + + return category; +} From 952015aa4a81cc8091f358ddadac44bac5478210 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 7 Sep 2022 23:36:57 -0500 Subject: [PATCH 009/146] WIP --- commands/owner/csCreateChannels.ts | 30 +++++++++++++++++++++++------- utils/channelUtils.ts | 26 ++++++-------------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 8b280f8..23fbe0e 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -6,8 +6,10 @@ import { classModel } from "../../models/classModel"; import { checkForChannel, createTextChannel, + findCategory, moveChannel, } from "../../utils/channelUtils"; +import { sleep } from "../../utils/util"; export default { name: "csCreateChannels", @@ -29,7 +31,7 @@ export default { const thumbnail = "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; const title = "Create Classes"; - const description = `Populated ${msgInt.guild.name} with COMPSCI classes.`; + const description = `Finished populating ${msgInt.guild.name} with COMPSCI classes.`; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; @@ -41,25 +43,36 @@ export default { .setDescription(description) .setFooter({ text: footer, iconURL: footerIcon }); + const finish_description = `Started populating ${msgInt.guild.name} with COMPSCI classes.`; + + const finish_embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + + await msgInt.reply({ embeds: [finish_embed], ephemeral: true }); + const classes = await classModel.find({}).sort({ CODE: 1 }); + const cs_category_name = "COMP SCI CLASSES"; for (let index = 0; index < classes.length; index++) { const channel = await checkForChannel(msgInt.guild, classes[index].CODE); + console.log(channel); if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, classes[index].CODE, - classes[index].INFO + classes[index].INFO, + cs_category_name ); console.log( - chalk.yellow( - `Created channel: ${new_channel.name} in guild ${msgInt.guild.name}` - ) + chalk.yellow(`Created channel: ${new_channel.name} index: ${index}`) ); - moveChannel(msgInt.guild, new_channel, "COMP SCI CLASSES"); //TODO: Write channel id to db } else { moveChannel(msgInt.guild, channel, "COMP SCI CLASSES"); @@ -67,7 +80,10 @@ export default { } } - await msgInt.reply({ embeds: [embed], ephemeral: true }); + console.log("reply"); + + // Can't reply for some reason. Timeout? + // await msgInt.reply({ embeds: [embed], ephemeral: true }); // Log the command usage console.log( diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 3d638a2..98da248 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,9 +1,8 @@ import { Guild, GuildChannel } from "discord.js"; export async function checkForChannel(guild: Guild, channel_name: string) { - // console.log(guild.channels.cache); + //FIXME: returns undefined return guild.channels.cache.find((channel) => { - console.log(channel.name); return channel.name == channel_name; }); } @@ -11,28 +10,15 @@ export async function checkForChannel(guild: Guild, channel_name: string) { export async function createTextChannel( guild: Guild, channel_name: string, - channel_topic?: string, - channel_category?: string + channel_topic: string, + channel_category_name: string ) { - let category = undefined; - - if (channel_category) { - category = guild.channels.cache.find( - (channel) => - channel.name == channel_name && channel.type === "GUILD_CATEGORY" - ); - - if (category === undefined) { - category = await guild.channels.create(channel_category, { - type: "GUILD_CATEGORY", - }); - } - } + let category = await findCategory(guild, channel_category_name); return guild.channels.create(channel_name, { type: "GUILD_TEXT", topic: channel_topic ? channel_topic : "", - parent: channel_category, + parent: category, }); } @@ -56,7 +42,7 @@ export async function moveChannel( } } -async function findCategory(guild: Guild, category_name: string) { +export async function findCategory(guild: Guild, category_name: string) { let category = guild.channels.cache.find( (category) => category.name == category_name ); From 1ddc5991d1131de3560e3baf85521077ecc4bd99 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 12:52:03 -0500 Subject: [PATCH 010/146] Create channels rework --- commands/owner/csCreateChannels.ts | 100 +++++++++++++++++------------ utils/channelUtils.ts | 31 ++++++--- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 23fbe0e..329d358 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -1,16 +1,35 @@ -import { MessageEmbed } from "discord.js"; +import { Client, MessageEmbed } from "discord.js"; import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel } from "../../models/classModel"; import { checkForChannel, + cleanChannelString, createTextChannel, - findCategory, moveChannel, } from "../../utils/channelUtils"; -import { sleep } from "../../utils/util"; +function create_default_embed( + client: Client, + title: string, + description: string +) { + const color = "#0099ff"; + const thumbnail = + "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + return embed; +} export default { name: "csCreateChannels", category: "owner", @@ -27,63 +46,60 @@ export default { return; } - const color = "#0099ff"; - const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; - const title = "Create Classes"; - const description = `Finished populating ${msgInt.guild.name} with COMPSCI classes.`; - const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; - - // Embed construction - const embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); - - const finish_description = `Started populating ${msgInt.guild.name} with COMPSCI classes.`; - - const finish_embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); + await msgInt.deferReply({ ephemeral: true }); - await msgInt.reply({ embeds: [finish_embed], ephemeral: true }); + const courses = await classModel.find({}).sort({ CODE: 1 }); - const classes = await classModel.find({}).sort({ CODE: 1 }); + //create a copy of the courses with cleaned names + const cleaned_courses = Array.from(courses).map((course) => { + course.CODE = cleanChannelString(course.CODE); + return course; + }); const cs_category_name = "COMP SCI CLASSES"; - for (let index = 0; index < classes.length; index++) { - const channel = await checkForChannel(msgInt.guild, classes[index].CODE); - console.log(channel); + let new_channel_count = 0; + let move_channel_count = 0; + for (let index = 0; index < cleaned_courses.length; index++) { + const channel = await checkForChannel( + msgInt.guild, + cleaned_courses[index].CODE + ); if (channel === undefined || channel.type !== "GUILD_TEXT") { + console.log( + chalk.yellow(`Created channel: ${cleaned_courses[index].CODE}`) + ); const new_channel = await createTextChannel( msgInt.guild, - classes[index].CODE, - classes[index].INFO, + cleaned_courses[index].CODE, + cleaned_courses[index].INFO, cs_category_name ); - console.log( - chalk.yellow(`Created channel: ${new_channel.name} index: ${index}`) - ); + ++new_channel_count; + console.log(chalk.yellow(`Created channel: ${new_channel.name}`)); //TODO: Write channel id to db } else { - moveChannel(msgInt.guild, channel, "COMP SCI CLASSES"); - //Confirm channel ID is in db + move_channel_count += await moveChannel( + msgInt.guild, + channel, + "COMP SCI CLASSES" + ); + //TODO: Confirm channel ID is in db } } - console.log("reply"); + const title = "Create Classes"; + let description = `Created ${new_channel_count} new channels\nMoved ${move_channel_count} channels`; + if (move_channel_count > 0) { + description += ` to ${cs_category_name}`; + } + + const embed = create_default_embed(client, title, description); + await msgInt.editReply({ embeds: [embed] }); - // Can't reply for some reason. Timeout? - // await msgInt.reply({ embeds: [embed], ephemeral: true }); + console.log(chalk.yellow(description)); // Log the command usage console.log( diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 98da248..8acb4f5 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,7 +1,7 @@ import { Guild, GuildChannel } from "discord.js"; +import chalk from "chalk"; export async function checkForChannel(guild: Guild, channel_name: string) { - //FIXME: returns undefined return guild.channels.cache.find((channel) => { return channel.name == channel_name; }); @@ -26,26 +26,29 @@ export async function moveChannel( guild: Guild, channel: GuildChannel, category_name: string -) { +): Promise { if ( channel.parent === null || channel.parent === undefined || channel.parent?.name != category_name ) { - // Move the class to parent "COMP SCI" - console.log( - `Parent Name: ${channel.parent?.name}.....Category name: ${category_name}` - ); - console.log("moving channel"); let category = await findCategory(guild, category_name); channel.setParent(category); + + console.log( + chalk.yellow( + `Moved channel${channel.name} from: ${channel.parent?.name} to: ${category_name}` + ) + ); + return 1; } + return 0; } export async function findCategory(guild: Guild, category_name: string) { - let category = guild.channels.cache.find( - (category) => category.name == category_name - ); + let category = guild.channels.cache.find((category) => { + return category.name == category_name; + }); if (category === undefined || category.type !== "GUILD_CATEGORY") { category = await guild.channels.create(category_name, { @@ -55,3 +58,11 @@ export async function findCategory(guild: Guild, category_name: string) { return category; } + +export function cleanChannelString(s: string): string { + return s + .toLowerCase() + .replace(/[`~!@#$%^&*)|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace("(", "-") + .replace("compsci ", "cs"); +} From b102371dd5005725ad14fccbc1af34b6f89f5a5e Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Thu, 8 Sep 2022 17:59:33 +0000 Subject: [PATCH 011/146] Apply auto formatting changes --- commands/owner/csCreateChannels.ts | 230 ++++++++++++++--------------- utils/channelUtils.ts | 136 ++++++++--------- 2 files changed, 183 insertions(+), 183 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 329d358..a8d020c 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -1,115 +1,115 @@ -import { Client, MessageEmbed } from "discord.js"; - -import chalk from "chalk"; -import { ICommand } from "wokcommands"; -import { classModel } from "../../models/classModel"; -import { - checkForChannel, - cleanChannelString, - createTextChannel, - moveChannel, -} from "../../utils/channelUtils"; - -function create_default_embed( - client: Client, - title: string, - description: string -) { - const color = "#0099ff"; - const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; - const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; - - // Embed construction - const embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); - return embed; -} -export default { - name: "csCreateChannels", - category: "owner", - description: "Update CS class channels", - slash: true, - testOnly: false, - guildOnly: true, - requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], - ownerOnly: true, - - callback: async ({ client, interaction: msgInt }) => { - if (msgInt.guild === null) { - console.log(chalk.red("No guild")); - return; - } - - await msgInt.deferReply({ ephemeral: true }); - - const courses = await classModel.find({}).sort({ CODE: 1 }); - - //create a copy of the courses with cleaned names - const cleaned_courses = Array.from(courses).map((course) => { - course.CODE = cleanChannelString(course.CODE); - return course; - }); - const cs_category_name = "COMP SCI CLASSES"; - - let new_channel_count = 0; - let move_channel_count = 0; - for (let index = 0; index < cleaned_courses.length; index++) { - const channel = await checkForChannel( - msgInt.guild, - cleaned_courses[index].CODE - ); - - if (channel === undefined || channel.type !== "GUILD_TEXT") { - console.log( - chalk.yellow(`Created channel: ${cleaned_courses[index].CODE}`) - ); - const new_channel = await createTextChannel( - msgInt.guild, - cleaned_courses[index].CODE, - cleaned_courses[index].INFO, - cs_category_name - ); - - ++new_channel_count; - console.log(chalk.yellow(`Created channel: ${new_channel.name}`)); - - //TODO: Write channel id to db - } else { - move_channel_count += await moveChannel( - msgInt.guild, - channel, - "COMP SCI CLASSES" - ); - //TODO: Confirm channel ID is in db - } - } - - const title = "Create Classes"; - let description = `Created ${new_channel_count} new channels\nMoved ${move_channel_count} channels`; - if (move_channel_count > 0) { - description += ` to ${cs_category_name}`; - } - - const embed = create_default_embed(client, title, description); - await msgInt.editReply({ embeds: [embed] }); - - console.log(chalk.yellow(description)); - - // Log the command usage - console.log( - chalk.blue( - `${chalk.green(`[COMMAND]`)} ${chalk.yellow( - msgInt.user.tag - )} used the ${chalk.green( - `/csCreateChannels` - )} command in ${chalk.yellow(msgInt.guild?.name)}` - ) - ); - }, -} as ICommand; +import { Client, MessageEmbed } from "discord.js"; + +import chalk from "chalk"; +import { ICommand } from "wokcommands"; +import { classModel } from "../../models/classModel"; +import { + checkForChannel, + cleanChannelString, + createTextChannel, + moveChannel, +} from "../../utils/channelUtils"; + +function create_default_embed( + client: Client, + title: string, + description: string +) { + const color = "#0099ff"; + const thumbnail = + "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + return embed; +} +export default { + name: "csCreateChannels", + category: "owner", + description: "Update CS class channels", + slash: true, + testOnly: false, + guildOnly: true, + requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], + ownerOnly: true, + + callback: async ({ client, interaction: msgInt }) => { + if (msgInt.guild === null) { + console.log(chalk.red("No guild")); + return; + } + + await msgInt.deferReply({ ephemeral: true }); + + const courses = await classModel.find({}).sort({ CODE: 1 }); + + //create a copy of the courses with cleaned names + const cleaned_courses = Array.from(courses).map((course) => { + course.CODE = cleanChannelString(course.CODE); + return course; + }); + const cs_category_name = "COMP SCI CLASSES"; + + let new_channel_count = 0; + let move_channel_count = 0; + for (let index = 0; index < cleaned_courses.length; index++) { + const channel = await checkForChannel( + msgInt.guild, + cleaned_courses[index].CODE + ); + + if (channel === undefined || channel.type !== "GUILD_TEXT") { + console.log( + chalk.yellow(`Created channel: ${cleaned_courses[index].CODE}`) + ); + const new_channel = await createTextChannel( + msgInt.guild, + cleaned_courses[index].CODE, + cleaned_courses[index].INFO, + cs_category_name + ); + + ++new_channel_count; + console.log(chalk.yellow(`Created channel: ${new_channel.name}`)); + + //TODO: Write channel id to db + } else { + move_channel_count += await moveChannel( + msgInt.guild, + channel, + "COMP SCI CLASSES" + ); + //TODO: Confirm channel ID is in db + } + } + + const title = "Create Classes"; + let description = `Created ${new_channel_count} new channels\nMoved ${move_channel_count} channels`; + if (move_channel_count > 0) { + description += ` to ${cs_category_name}`; + } + + const embed = create_default_embed(client, title, description); + await msgInt.editReply({ embeds: [embed] }); + + console.log(chalk.yellow(description)); + + // Log the command usage + console.log( + chalk.blue( + `${chalk.green(`[COMMAND]`)} ${chalk.yellow( + msgInt.user.tag + )} used the ${chalk.green( + `/csCreateChannels` + )} command in ${chalk.yellow(msgInt.guild?.name)}` + ) + ); + }, +} as ICommand; diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 8acb4f5..252c1fb 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,68 +1,68 @@ -import { Guild, GuildChannel } from "discord.js"; -import chalk from "chalk"; - -export async function checkForChannel(guild: Guild, channel_name: string) { - return guild.channels.cache.find((channel) => { - return channel.name == channel_name; - }); -} - -export async function createTextChannel( - guild: Guild, - channel_name: string, - channel_topic: string, - channel_category_name: string -) { - let category = await findCategory(guild, channel_category_name); - - return guild.channels.create(channel_name, { - type: "GUILD_TEXT", - topic: channel_topic ? channel_topic : "", - parent: category, - }); -} - -export async function moveChannel( - guild: Guild, - channel: GuildChannel, - category_name: string -): Promise { - if ( - channel.parent === null || - channel.parent === undefined || - channel.parent?.name != category_name - ) { - let category = await findCategory(guild, category_name); - channel.setParent(category); - - console.log( - chalk.yellow( - `Moved channel${channel.name} from: ${channel.parent?.name} to: ${category_name}` - ) - ); - return 1; - } - return 0; -} - -export async function findCategory(guild: Guild, category_name: string) { - let category = guild.channels.cache.find((category) => { - return category.name == category_name; - }); - - if (category === undefined || category.type !== "GUILD_CATEGORY") { - category = await guild.channels.create(category_name, { - type: "GUILD_CATEGORY", - }); - } - - return category; -} - -export function cleanChannelString(s: string): string { - return s - .toLowerCase() - .replace(/[`~!@#$%^&*)|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace("(", "-") - .replace("compsci ", "cs"); -} +import { Guild, GuildChannel } from "discord.js"; +import chalk from "chalk"; + +export async function checkForChannel(guild: Guild, channel_name: string) { + return guild.channels.cache.find((channel) => { + return channel.name == channel_name; + }); +} + +export async function createTextChannel( + guild: Guild, + channel_name: string, + channel_topic: string, + channel_category_name: string +) { + let category = await findCategory(guild, channel_category_name); + + return guild.channels.create(channel_name, { + type: "GUILD_TEXT", + topic: channel_topic ? channel_topic : "", + parent: category, + }); +} + +export async function moveChannel( + guild: Guild, + channel: GuildChannel, + category_name: string +): Promise { + if ( + channel.parent === null || + channel.parent === undefined || + channel.parent?.name != category_name + ) { + let category = await findCategory(guild, category_name); + channel.setParent(category); + + console.log( + chalk.yellow( + `Moved channel${channel.name} from: ${channel.parent?.name} to: ${category_name}` + ) + ); + return 1; + } + return 0; +} + +export async function findCategory(guild: Guild, category_name: string) { + let category = guild.channels.cache.find((category) => { + return category.name == category_name; + }); + + if (category === undefined || category.type !== "GUILD_CATEGORY") { + category = await guild.channels.create(category_name, { + type: "GUILD_CATEGORY", + }); + } + + return category; +} + +export function cleanChannelString(s: string): string { + return s + .toLowerCase() + .replace(/[`~!@#$%^&*)|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace("(", "-") + .replace("compsci ", "cs"); +} From ab67099f9cfc50f0e9325ab9f640b6e88318f5f4 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 17:40:06 -0500 Subject: [PATCH 012/146] Archive old classes --- commands/owner/csCreateChannels.ts | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index a8d020c..1590a55 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -55,17 +55,39 @@ export default { course.CODE = cleanChannelString(course.CODE); return course; }); - const cs_category_name = "COMP SCI CLASSES"; + const cs_category_name = "COMP SCI CLASSES"; + const cs_past_category_name = "PAST CLASSES"; let new_channel_count = 0; let move_channel_count = 0; + + //Move classes no longer in the db to + const cs_category = await checkForChannel(msgInt.guild, cs_category_name); + if (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { + const children = Array.from(cs_category.children.values()); + for (let index = 0; index < children.length; index++) { + const match = cleaned_courses.find((course) => { + return course.CODE == children[index].name; + }); + if (match == undefined) { + await moveChannel( + msgInt.guild, + children[index], + cs_past_category_name + ); + } + } + } + for (let index = 0; index < cleaned_courses.length; index++) { + // Iterate through courses in db const channel = await checkForChannel( msgInt.guild, cleaned_courses[index].CODE ); if (channel === undefined || channel.type !== "GUILD_TEXT") { + // Create new channels console.log( chalk.yellow(`Created channel: ${cleaned_courses[index].CODE}`) ); @@ -81,6 +103,7 @@ export default { //TODO: Write channel id to db } else { + // Move old channels move_channel_count += await moveChannel( msgInt.guild, channel, From f9b8c62e79d8a31eac56e023cb24004661aae044 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 18:56:23 -0500 Subject: [PATCH 013/146] Deepsource fixes --- commands/owner/csCreateChannels.ts | 4 ++-- utils/channelUtils.ts | 33 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 1590a55..f597222 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -62,7 +62,7 @@ export default { let move_channel_count = 0; //Move classes no longer in the db to - const cs_category = await checkForChannel(msgInt.guild, cs_category_name); + const cs_category = checkForChannel(msgInt.guild, cs_category_name); if (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { @@ -81,7 +81,7 @@ export default { for (let index = 0; index < cleaned_courses.length; index++) { // Iterate through courses in db - const channel = await checkForChannel( + const channel = checkForChannel( msgInt.guild, cleaned_courses[index].CODE ); diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 252c1fb..2441ab9 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,19 +1,32 @@ import { Guild, GuildChannel } from "discord.js"; import chalk from "chalk"; -export async function checkForChannel(guild: Guild, channel_name: string) { +export function checkForChannel(guild: Guild, channel_name: string) { return guild.channels.cache.find((channel) => { return channel.name == channel_name; }); } +export async function findCategory(guild: Guild, category_name: string) { + let category = guild.channels.cache.find((category) => { + return category.name == category_name; + }); + + if (category === undefined || category.type !== "GUILD_CATEGORY") { + category = await guild.channels.create(category_name, { + type: "GUILD_CATEGORY", + }); + } + + return category; +} export async function createTextChannel( guild: Guild, channel_name: string, channel_topic: string, channel_category_name: string ) { - let category = await findCategory(guild, channel_category_name); + const category = await findCategory(guild, channel_category_name); return guild.channels.create(channel_name, { type: "GUILD_TEXT", @@ -32,7 +45,7 @@ export async function moveChannel( channel.parent === undefined || channel.parent?.name != category_name ) { - let category = await findCategory(guild, category_name); + const category = await findCategory(guild, category_name); channel.setParent(category); console.log( @@ -45,20 +58,6 @@ export async function moveChannel( return 0; } -export async function findCategory(guild: Guild, category_name: string) { - let category = guild.channels.cache.find((category) => { - return category.name == category_name; - }); - - if (category === undefined || category.type !== "GUILD_CATEGORY") { - category = await guild.channels.create(category_name, { - type: "GUILD_CATEGORY", - }); - } - - return category; -} - export function cleanChannelString(s: string): string { return s .toLowerCase() From 8e4669cf4960861d2675b800eac77178b12cc6c0 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 19:30:39 -0500 Subject: [PATCH 014/146] Add ability to pass in category or category name --- utils/channelUtils.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 2441ab9..13f6bb8 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,4 +1,4 @@ -import { Guild, GuildChannel } from "discord.js"; +import { CategoryChannel, Guild, GuildChannel } from "discord.js"; import chalk from "chalk"; export function checkForChannel(guild: Guild, channel_name: string) { @@ -24,14 +24,24 @@ export async function createTextChannel( guild: Guild, channel_name: string, channel_topic: string, - channel_category_name: string + channel_category?: CategoryChannel, + channel_category_name?: string ) { - const category = await findCategory(guild, channel_category_name); - + if ( + channel_category_name == undefined && + channel_category_name == undefined + ) { + throw Error( + "Must specify either channel_category or channel_category_name" + ); + } return guild.channels.create(channel_name, { type: "GUILD_TEXT", topic: channel_topic ? channel_topic : "", - parent: category, + parent: + channel_category != undefined + ? channel_category + : await findCategory(guild, channel_category_name), }); } From f7e166b7a2f8811b966b4cf392d2a3ece57d6891 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 19:37:44 -0500 Subject: [PATCH 015/146] split more than 50 channels into separate categories --- commands/owner/csCreateChannels.ts | 42 +++++++++++++++++++++++------- utils/channelUtils.ts | 8 ++++++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index f597222..38f7bad 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -7,7 +7,9 @@ import { checkForChannel, cleanChannelString, createTextChannel, + findCategory, moveChannel, + concatCategoryName, } from "../../utils/channelUtils"; function create_default_embed( @@ -56,13 +58,19 @@ export default { return course; }); - const cs_category_name = "COMP SCI CLASSES"; + let category_name = "COMP SCI CLASSES"; + let category_number = 0; + const max_category_size = 50; + const cs_past_category_name = "PAST CLASSES"; let new_channel_count = 0; let move_channel_count = 0; //Move classes no longer in the db to - const cs_category = checkForChannel(msgInt.guild, cs_category_name); + const cs_category = checkForChannel( + msgInt.guild, + concatCategoryName(category_name, category_number) + ); if (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { @@ -86,29 +94,42 @@ export default { cleaned_courses[index].CODE ); + // Create new channels if (channel === undefined || channel.type !== "GUILD_TEXT") { - // Create new channels - console.log( - chalk.yellow(`Created channel: ${cleaned_courses[index].CODE}`) + let category = await findCategory( + msgInt.guild, + concatCategoryName(category_name, category_number) ); + + // Increment category if category is full + if (category.children.size >= max_category_size) { + ++category_number; + category = await findCategory( + msgInt.guild, + concatCategoryName(category_name, category_number) + ); + } + const new_channel = await createTextChannel( msgInt.guild, cleaned_courses[index].CODE, cleaned_courses[index].INFO, - cs_category_name + category ); ++new_channel_count; console.log(chalk.yellow(`Created channel: ${new_channel.name}`)); //TODO: Write channel id to db - } else { - // Move old channels + } + // Move old channels + else { move_channel_count += await moveChannel( msgInt.guild, channel, "COMP SCI CLASSES" ); + //TODO: Confirm channel ID is in db } } @@ -116,7 +137,10 @@ export default { const title = "Create Classes"; let description = `Created ${new_channel_count} new channels\nMoved ${move_channel_count} channels`; if (move_channel_count > 0) { - description += ` to ${cs_category_name}`; + description += ` to ${concatCategoryName( + category_name, + category_number + )}`; } const embed = create_default_embed(client, title, description); diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 13f6bb8..0e3fd6e 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -75,3 +75,11 @@ export function cleanChannelString(s: string): string { .replace("(", "-") .replace("compsci ", "cs"); } +export function concatCategoryName( + category_name: string, + category_number: number +) { + return category_number == 0 + ? category_name + : category_name + ` ${category_number}`; +} From 60e1daadb285e0bec9544a32f01104c6b4d277f9 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 20:00:04 -0500 Subject: [PATCH 016/146] Clean up createTextChannel --- utils/channelUtils.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 0e3fd6e..d8f284a 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -27,21 +27,24 @@ export async function createTextChannel( channel_category?: CategoryChannel, channel_category_name?: string ) { - if ( - channel_category_name == undefined && - channel_category_name == undefined - ) { + console.log(`Category: ${channel_category}`); + console.log(`Category name: ${channel_category_name}`); + + let channel_parent = undefined; + if (channel_category !== undefined) { + channel_parent = channel_category; + } else if (channel_category_name !== undefined) { + channel_parent = await findCategory(guild, channel_category_name); + } else { throw Error( "Must specify either channel_category or channel_category_name" ); } + return guild.channels.create(channel_name, { type: "GUILD_TEXT", - topic: channel_topic ? channel_topic : "", - parent: - channel_category != undefined - ? channel_category - : await findCategory(guild, channel_category_name), + topic: channel_topic, + parent: channel_parent, }); } From 068deba6216cb7c32582cf2f6d46f5dea51e74cd Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 20:02:32 -0500 Subject: [PATCH 017/146] Further clean up for createTextChannel --- utils/channelUtils.ts | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index d8f284a..4c5b11c 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -22,28 +22,26 @@ export async function findCategory(guild: Guild, category_name: string) { } export async function createTextChannel( guild: Guild, - channel_name: string, - channel_topic: string, - channel_category?: CategoryChannel, - channel_category_name?: string + name: string, + topic: string, + category?: CategoryChannel, + category_name?: string ) { - console.log(`Category: ${channel_category}`); - console.log(`Category name: ${channel_category_name}`); - - let channel_parent = undefined; - if (channel_category !== undefined) { - channel_parent = channel_category; - } else if (channel_category_name !== undefined) { - channel_parent = await findCategory(guild, channel_category_name); + //Determine which arg to use + let channel_parent: CategoryChannel | undefined = undefined; + if (category !== undefined) { + channel_parent = category; + } else if (category_name !== undefined) { + channel_parent = await findCategory(guild, category_name); } else { throw Error( "Must specify either channel_category or channel_category_name" ); } - return guild.channels.create(channel_name, { + return guild.channels.create(name, { type: "GUILD_TEXT", - topic: channel_topic, + topic: topic, parent: channel_parent, }); } From 178acab24d20d992020a106f58ec938e6abadcf8 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 20:03:32 -0500 Subject: [PATCH 018/146] Deepsource --- commands/owner/csCreateChannels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 38f7bad..2b1aa80 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -58,7 +58,7 @@ export default { return course; }); - let category_name = "COMP SCI CLASSES"; + const category_name = "COMP SCI CLASSES"; let category_number = 0; const max_category_size = 50; From 31e1d5f462a0fa05a04ca886f6bc852723e0c787 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 20:16:23 -0500 Subject: [PATCH 019/146] Fixed issue where you could move a channel into a full category --- commands/owner/csCreateChannels.ts | 26 ++++++++++++-------------- utils/channelUtils.ts | 6 +++--- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 2b1aa80..10b48c3 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -94,22 +94,20 @@ export default { cleaned_courses[index].CODE ); - // Create new channels - if (channel === undefined || channel.type !== "GUILD_TEXT") { - let category = await findCategory( + let category = await findCategory( + msgInt.guild, + concatCategoryName(category_name, category_number) + ); + // Increment category if category is full + if (category.children.size >= max_category_size) { + ++category_number; + category = await findCategory( msgInt.guild, concatCategoryName(category_name, category_number) ); - - // Increment category if category is full - if (category.children.size >= max_category_size) { - ++category_number; - category = await findCategory( - msgInt.guild, - concatCategoryName(category_name, category_number) - ); - } - + } + // Create new channels + if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, cleaned_courses[index].CODE, @@ -127,7 +125,7 @@ export default { move_channel_count += await moveChannel( msgInt.guild, channel, - "COMP SCI CLASSES" + concatCategoryName(category_name, category_number) ); //TODO: Confirm channel ID is in db diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 4c5b11c..611f7e7 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -61,7 +61,7 @@ export async function moveChannel( console.log( chalk.yellow( - `Moved channel${channel.name} from: ${channel.parent?.name} to: ${category_name}` + `Moved channel ${channel.name} from: ${channel.parent?.name} to: ${category_name}` ) ); return 1; @@ -73,8 +73,8 @@ export function cleanChannelString(s: string): string { return s .toLowerCase() .replace(/[`~!@#$%^&*)|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace("(", "-") - .replace("compsci ", "cs"); + .replace("compsci ", "cs") + .replace(/[ (]/gi, "-"); } export function concatCategoryName( category_name: string, From be7fcdf6c93c410d17728994ad687826a75362a1 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 20:20:56 -0500 Subject: [PATCH 020/146] Prevent excessive moving --- commands/owner/csCreateChannels.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 10b48c3..86576c0 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -121,7 +121,10 @@ export default { //TODO: Write channel id to db } // Move old channels - else { + else if ( + channel.parent !== null && + !channel.parent.name.startsWith(category_name) + ) { move_channel_count += await moveChannel( msgInt.guild, channel, From b4071fac8142aad6de8a72b0f68869223281c4a7 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 20:35:47 -0500 Subject: [PATCH 021/146] Clean strings in functions that need it Save course id to db --- commands/owner/csCreateChannels.ts | 15 ++++++++------- utils/channelUtils.ts | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 86576c0..4f42b01 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -87,12 +87,9 @@ export default { } } - for (let index = 0; index < cleaned_courses.length; index++) { + for (let index = 0; index < courses.length; index++) { // Iterate through courses in db - const channel = checkForChannel( - msgInt.guild, - cleaned_courses[index].CODE - ); + const channel = checkForChannel(msgInt.guild, courses[index].CODE); let category = await findCategory( msgInt.guild, @@ -110,8 +107,8 @@ export default { if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, - cleaned_courses[index].CODE, - cleaned_courses[index].INFO, + courses[index].CODE, + courses[index].INFO, category ); @@ -119,6 +116,8 @@ export default { console.log(chalk.yellow(`Created channel: ${new_channel.name}`)); //TODO: Write channel id to db + courses[index].CHANNEL_ID = new_channel.id; + courses[index].save(); } // Move old channels else if ( @@ -132,6 +131,8 @@ export default { ); //TODO: Confirm channel ID is in db + courses[index].CHANNEL_ID = channel.id; + courses[index].save(); } } diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 611f7e7..23e0ff3 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -2,6 +2,7 @@ import { CategoryChannel, Guild, GuildChannel } from "discord.js"; import chalk from "chalk"; export function checkForChannel(guild: Guild, channel_name: string) { + channel_name = cleanChannelString(channel_name); return guild.channels.cache.find((channel) => { return channel.name == channel_name; }); @@ -39,7 +40,7 @@ export async function createTextChannel( ); } - return guild.channels.create(name, { + return guild.channels.create(cleanChannelString(name), { type: "GUILD_TEXT", topic: topic, parent: channel_parent, From 38c2a8dacafe9ca23707bd39f09a4da479b3299c Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 8 Sep 2022 20:38:03 -0500 Subject: [PATCH 022/146] Deepsource --- commands/owner/deleteChannels.ts | 65 ++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 commands/owner/deleteChannels.ts diff --git a/commands/owner/deleteChannels.ts b/commands/owner/deleteChannels.ts new file mode 100644 index 0000000..4fe0e29 --- /dev/null +++ b/commands/owner/deleteChannels.ts @@ -0,0 +1,65 @@ +import { MessageEmbed } from "discord.js"; + +import chalk from "chalk"; +import { ICommand } from "wokcommands"; + +export default { + name: "deleteAllChannels", + category: "owner", + description: "Delete all channels not named general or banshee", + slash: true, + testOnly: false, + guildOnly: true, + requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], + ownerOnly: true, + + callback: async ({ client, interaction: msgInt }) => { + if (msgInt.guild === null) { + console.log(chalk.red("No guild")); + return; + } + + const color = "#0099ff"; + const thumbnail = ""; + const title = "Delete all channels"; + const description = `deleted channels`; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = ""; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + + await msgInt.deferReply({ ephemeral: true }); + + msgInt.guild.channels.cache.forEach((channel) => { + if ( + !( + channel == undefined || + channel?.name == "general" || // Channels and categories to keep + channel?.name == "banshee" + ) + ) { + console.log(`Deleted channel: ${channel?.name}`); + channel.delete(); + } + }); + + await msgInt.editReply({ embeds: [embed] }); + + // Log the command usage + console.log( + chalk.blue( + `${chalk.green(`[COMMAND]`)} ${chalk.yellow( + msgInt.user.tag + )} used the ${chalk.green( + `/csCreateChannels` + )} command in ${chalk.yellow(msgInt.guild?.name)}` + ) + ); + }, +} as ICommand; From ca6e279759da87314c55f6b3e607d4b18838d388 Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Fri, 9 Sep 2022 01:38:27 +0000 Subject: [PATCH 023/146] Apply auto formatting changes --- commands/owner/deleteChannels.ts | 130 +++++++++++++++---------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/commands/owner/deleteChannels.ts b/commands/owner/deleteChannels.ts index 4fe0e29..3515034 100644 --- a/commands/owner/deleteChannels.ts +++ b/commands/owner/deleteChannels.ts @@ -1,65 +1,65 @@ -import { MessageEmbed } from "discord.js"; - -import chalk from "chalk"; -import { ICommand } from "wokcommands"; - -export default { - name: "deleteAllChannels", - category: "owner", - description: "Delete all channels not named general or banshee", - slash: true, - testOnly: false, - guildOnly: true, - requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], - ownerOnly: true, - - callback: async ({ client, interaction: msgInt }) => { - if (msgInt.guild === null) { - console.log(chalk.red("No guild")); - return; - } - - const color = "#0099ff"; - const thumbnail = ""; - const title = "Delete all channels"; - const description = `deleted channels`; - const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = ""; - - // Embed construction - const embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); - - await msgInt.deferReply({ ephemeral: true }); - - msgInt.guild.channels.cache.forEach((channel) => { - if ( - !( - channel == undefined || - channel?.name == "general" || // Channels and categories to keep - channel?.name == "banshee" - ) - ) { - console.log(`Deleted channel: ${channel?.name}`); - channel.delete(); - } - }); - - await msgInt.editReply({ embeds: [embed] }); - - // Log the command usage - console.log( - chalk.blue( - `${chalk.green(`[COMMAND]`)} ${chalk.yellow( - msgInt.user.tag - )} used the ${chalk.green( - `/csCreateChannels` - )} command in ${chalk.yellow(msgInt.guild?.name)}` - ) - ); - }, -} as ICommand; +import { MessageEmbed } from "discord.js"; + +import chalk from "chalk"; +import { ICommand } from "wokcommands"; + +export default { + name: "deleteAllChannels", + category: "owner", + description: "Delete all channels not named general or banshee", + slash: true, + testOnly: false, + guildOnly: true, + requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], + ownerOnly: true, + + callback: async ({ client, interaction: msgInt }) => { + if (msgInt.guild === null) { + console.log(chalk.red("No guild")); + return; + } + + const color = "#0099ff"; + const thumbnail = ""; + const title = "Delete all channels"; + const description = `deleted channels`; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = ""; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + + await msgInt.deferReply({ ephemeral: true }); + + msgInt.guild.channels.cache.forEach((channel) => { + if ( + !( + channel == undefined || + channel?.name == "general" || // Channels and categories to keep + channel?.name == "banshee" + ) + ) { + console.log(`Deleted channel: ${channel?.name}`); + channel.delete(); + } + }); + + await msgInt.editReply({ embeds: [embed] }); + + // Log the command usage + console.log( + chalk.blue( + `${chalk.green(`[COMMAND]`)} ${chalk.yellow( + msgInt.user.tag + )} used the ${chalk.green( + `/csCreateChannels` + )} command in ${chalk.yellow(msgInt.guild?.name)}` + ) + ); + }, +} as ICommand; From 423bf8cfe341dab2ad1739dad49e57da46c94458 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Sep 2022 08:50:22 +0000 Subject: [PATCH 024/146] Bump typescript from 4.8.2 to 4.8.3 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.8.2 to 4.8.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.8.2...v4.8.3) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fddf6eb..5a3aa23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "path": "^0.12.7", "prettier": "^2.7.1", "ts-node": "^10.5.0", - "typescript": "^4.5.5", + "typescript": "^4.8.3", "wokcommands": "^1.5.3" }, "engines": { @@ -792,9 +792,9 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1423,9 +1423,9 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==" }, "util": { "version": "0.10.4", diff --git a/package.json b/package.json index 53b3ee4..e1ba49c 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "path": "^0.12.7", "prettier": "^2.7.1", "ts-node": "^10.5.0", - "typescript": "^4.5.5", + "typescript": "^4.8.3", "wokcommands": "^1.5.3" } } From bd0bf8587d167b01f1dc1c5c48d3907532bf1b4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Sep 2022 08:50:30 +0000 Subject: [PATCH 025/146] Bump mongoose from 6.5.4 to 6.6.0 Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.5.4 to 6.6.0. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/6.5.4...6.6.0) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 46 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index fddf6eb..98a7140 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "axios": "^0.27.2", "chalk": "4.1.2", "discord.js": "^13.9.2", - "mongoose": "^6.5.4", + "mongoose": "^6.6.0", "path": "^0.12.7", "prettier": "^2.7.1", "ts-node": "^10.5.0", @@ -522,14 +522,14 @@ } }, "node_modules/mongodb": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.8.1.tgz", - "integrity": "sha512-/NyiM3Ox9AwP5zrfT9TXjRKDJbXlLaUDQ9Rg//2lbg8D2A8GXV0VidYYnA/gfdK6uwbnL4FnAflH7FbGw3TS7w==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", + "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", "dependencies": { - "bson": "^4.6.5", - "denque": "^2.0.1", - "mongodb-connection-string-url": "^2.5.2", - "socks": "^2.6.2" + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.3", + "socks": "^2.7.0" }, "engines": { "node": ">=12.9.0" @@ -548,13 +548,13 @@ } }, "node_modules/mongoose": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.5.4.tgz", - "integrity": "sha512-8hKV+9baDa7fyWRADQcSN/c0/QQbnewA2D0xOqdFb7f1UGYAHk4YSMNu9Hu2bdRUfQbK/daFuqlcmI17j6/8eg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.0.tgz", + "integrity": "sha512-5sS0D7qbmfT4G/nODkJhx5l2qvhqLMplhMlp08Wea8eoi6O/B6b+o1ukUEKjjm1MV8dAS3w8kx47R/klYKLPpQ==", "dependencies": { "bson": "^4.6.5", "kareem": "2.4.1", - "mongodb": "4.8.1", + "mongodb": "4.9.1", "mpath": "0.9.0", "mquery": "4.0.3", "ms": "2.1.3", @@ -1234,15 +1234,15 @@ } }, "mongodb": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.8.1.tgz", - "integrity": "sha512-/NyiM3Ox9AwP5zrfT9TXjRKDJbXlLaUDQ9Rg//2lbg8D2A8GXV0VidYYnA/gfdK6uwbnL4FnAflH7FbGw3TS7w==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", + "integrity": "sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ==", "requires": { - "bson": "^4.6.5", - "denque": "^2.0.1", - "mongodb-connection-string-url": "^2.5.2", + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.3", "saslprep": "^1.0.3", - "socks": "^2.6.2" + "socks": "^2.7.0" } }, "mongodb-connection-string-url": { @@ -1255,13 +1255,13 @@ } }, "mongoose": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.5.4.tgz", - "integrity": "sha512-8hKV+9baDa7fyWRADQcSN/c0/QQbnewA2D0xOqdFb7f1UGYAHk4YSMNu9Hu2bdRUfQbK/daFuqlcmI17j6/8eg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.6.0.tgz", + "integrity": "sha512-5sS0D7qbmfT4G/nODkJhx5l2qvhqLMplhMlp08Wea8eoi6O/B6b+o1ukUEKjjm1MV8dAS3w8kx47R/klYKLPpQ==", "requires": { "bson": "^4.6.5", "kareem": "2.4.1", - "mongodb": "4.8.1", + "mongodb": "4.9.1", "mpath": "0.9.0", "mquery": "4.0.3", "ms": "2.1.3", diff --git a/package.json b/package.json index 53b3ee4..47668a4 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "axios": "^0.27.2", "chalk": "4.1.2", "discord.js": "^13.9.2", - "mongoose": "^6.5.4", + "mongoose": "^6.6.0", "path": "^0.12.7", "prettier": "^2.7.1", "ts-node": "^10.5.0", From 57d4e88a5f4ff5ffb8560ffec0541cc8c75cb8cb Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 9 Sep 2022 11:38:09 -0500 Subject: [PATCH 026/146] deepsource --- utils/channelUtils.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 23e0ff3..2151a94 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,6 +1,14 @@ import { CategoryChannel, Guild, GuildChannel } from "discord.js"; import chalk from "chalk"; +export function cleanChannelString(s: string): string { + return s + .toLowerCase() + .replace(/[`~!@#$%^&*)|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace("compsci ", "cs") + .replace(/[ (]/gi, "-"); +} + export function checkForChannel(guild: Guild, channel_name: string) { channel_name = cleanChannelString(channel_name); return guild.channels.cache.find((channel) => { @@ -70,13 +78,6 @@ export async function moveChannel( return 0; } -export function cleanChannelString(s: string): string { - return s - .toLowerCase() - .replace(/[`~!@#$%^&*)|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace("compsci ", "cs") - .replace(/[ (]/gi, "-"); -} export function concatCategoryName( category_name: string, category_number: number From 74d123495ec540751796111d638c8241b5bc30f8 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 08:51:00 -0500 Subject: [PATCH 027/146] Change string cleaning --- utils/channelUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 2151a94..6f64875 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -4,9 +4,9 @@ import chalk from "chalk"; export function cleanChannelString(s: string): string { return s .toLowerCase() - .replace(/[`~!@#$%^&*)|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[`~!@#$%^&*())|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") .replace("compsci ", "cs") - .replace(/[ (]/gi, "-"); + .replace(" ", "-"); } export function checkForChannel(guild: Guild, channel_name: string) { From 3395191d8597dfc4035d776b1162bb560b4a6936 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 08:51:12 -0500 Subject: [PATCH 028/146] Only clean channel strings --- commands/owner/csCreateChannels.ts | 5 ++++- utils/channelUtils.ts | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 4f42b01..eaee25c 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -89,7 +89,10 @@ export default { for (let index = 0; index < courses.length; index++) { // Iterate through courses in db - const channel = checkForChannel(msgInt.guild, courses[index].CODE); + const channel = checkForChannel( + msgInt.guild, + cleanChannelString(courses[index].CODE) + ); let category = await findCategory( msgInt.guild, diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 6f64875..1ed5392 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -10,7 +10,6 @@ export function cleanChannelString(s: string): string { } export function checkForChannel(guild: Guild, channel_name: string) { - channel_name = cleanChannelString(channel_name); return guild.channels.cache.find((channel) => { return channel.name == channel_name; }); From cfcc96318b20c3322b30b77a40a3eb7b247978b8 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 08:51:27 -0500 Subject: [PATCH 029/146] WIP: Moving old channels not working --- commands/owner/csCreateChannels.ts | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index eaee25c..e27cf42 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -66,26 +66,37 @@ export default { let new_channel_count = 0; let move_channel_count = 0; - //Move classes no longer in the db to - const cs_category = checkForChannel( + console.log( + `category name: ${concatCategoryName(category_name, category_number)}` + ); + //Move classes no longer in the db to cs_past_category_name + let cs_category = checkForChannel( msgInt.guild, concatCategoryName(category_name, category_number) ); - if (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { + console.log(`Channel: ${cs_category}`); + + while (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { + console.log(`Checking category: ${cs_category.name}`); const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { + console.log(`Checking channel: ${children[index].name}`); const match = cleaned_courses.find((course) => { return course.CODE == children[index].name; }); - if (match == undefined) { - await moveChannel( - msgInt.guild, - children[index], - cs_past_category_name - ); + if (match != undefined) { + continue; } + await moveChannel(msgInt.guild, children[index], cs_past_category_name); } + + ++category_number; + cs_category = checkForChannel( + msgInt.guild, + concatCategoryName(category_name, category_number) + ); } + category_number = 0; for (let index = 0; index < courses.length; index++) { // Iterate through courses in db From 8cd44edb04f425c3455c4a3230b70a1d976fa90d Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 20:24:36 -0500 Subject: [PATCH 030/146] Refresh cache, and lower max number of channels by 1 Also add log messages --- commands/owner/csCreateChannels.ts | 46 +++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index e27cf42..0949ec3 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -77,16 +77,15 @@ export default { console.log(`Channel: ${cs_category}`); while (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { - console.log(`Checking category: ${cs_category.name}`); const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { - console.log(`Checking channel: ${children[index].name}`); const match = cleaned_courses.find((course) => { return course.CODE == children[index].name; }); if (match != undefined) { continue; } + console.log(`Moving: ${children[index]} to: ${cs_past_category_name}`); await moveChannel(msgInt.guild, children[index], cs_past_category_name); } @@ -105,18 +104,34 @@ export default { cleanChannelString(courses[index].CODE) ); - let category = await findCategory( - msgInt.guild, - concatCategoryName(category_name, category_number) - ); - // Increment category if category is full - if (category.children.size >= max_category_size) { - ++category_number; - category = await findCategory( + let category = await ( + await findCategory( msgInt.guild, concatCategoryName(category_name, category_number) + ) + ).fetch(true); + // Increment category if category is full + if (category.children.size >= max_category_size - 1) { + ++category_number; + category = await ( + await findCategory( + msgInt.guild, + concatCategoryName(category_name, category_number) + ) + ).fetch(true); + console.log( + `old category full, new category: ${concatCategoryName( + category_name, + category_number + )} created` ); } + console.log( + `Working in category: ${concatCategoryName( + category_name, + category_number + )} size: ${category.children.size}` + ); // Create new channels if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( @@ -132,12 +147,17 @@ export default { //TODO: Write channel id to db courses[index].CHANNEL_ID = new_channel.id; courses[index].save(); - } - // Move old channels - else if ( + } else if ( channel.parent !== null && !channel.parent.name.startsWith(category_name) ) { + // Move old channels + console.log( + `Moving: ${channel.name} to: ${concatCategoryName( + category_name, + category_number + )}` + ); move_channel_count += await moveChannel( msgInt.guild, channel, From 652990532a5cd41b6e0d7d749239e609b3b35c52 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 21:29:35 -0500 Subject: [PATCH 031/146] Update cleanString --- utils/channelUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 1ed5392..5f2cc8f 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -4,9 +4,9 @@ import chalk from "chalk"; export function cleanChannelString(s: string): string { return s .toLowerCase() - .replace(/[`~!@#$%^&*())|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") .replace("compsci ", "cs") - .replace(" ", "-"); + .replace(/[ (]/gi, "-"); } export function checkForChannel(guild: Guild, channel_name: string) { From 27ab197aa37a95168e7737273acec0c5e252389d Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 21:58:48 -0500 Subject: [PATCH 032/146] Change cleaned_courses data structure --- commands/owner/csCreateChannels.ts | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 0949ec3..2e3a44d 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -52,11 +52,15 @@ export default { const courses = await classModel.find({}).sort({ CODE: 1 }); - //create a copy of the courses with cleaned names - const cleaned_courses = Array.from(courses).map((course) => { - course.CODE = cleanChannelString(course.CODE); - return course; - }); + //create an array of the courses with cleaned names + const cleaned_courses: string[] = []; + for (let index = 0; index < courses.length; index++) { + cleaned_courses.push(cleanChannelString(courses[index].CODE)); + } + + // for (let index = 0; index < courses.length; index++) { + // console.log(courses[index].CODE); + // } const category_name = "COMP SCI CLASSES"; let category_number = 0; @@ -80,7 +84,7 @@ export default { const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { const match = cleaned_courses.find((course) => { - return course.CODE == children[index].name; + return course == children[index].name; }); if (match != undefined) { continue; @@ -110,6 +114,7 @@ export default { concatCategoryName(category_name, category_number) ) ).fetch(true); + // Increment category if category is full if (category.children.size >= max_category_size - 1) { ++category_number; @@ -132,11 +137,12 @@ export default { category_number )} size: ${category.children.size}` ); + // Create new channels if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, - courses[index].CODE, + cleanChannelString(courses[index].CODE), courses[index].INFO, category ); @@ -144,7 +150,6 @@ export default { ++new_channel_count; console.log(chalk.yellow(`Created channel: ${new_channel.name}`)); - //TODO: Write channel id to db courses[index].CHANNEL_ID = new_channel.id; courses[index].save(); } else if ( @@ -164,7 +169,6 @@ export default { concatCategoryName(category_name, category_number) ); - //TODO: Confirm channel ID is in db courses[index].CHANNEL_ID = channel.id; courses[index].save(); } From b19873734a8cd30a7637a9cfc1da8b7dc00f5e53 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 22:18:49 -0500 Subject: [PATCH 033/146] Update existing channel descriptions --- commands/owner/csCreateChannels.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 2e3a44d..0d036d6 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -163,6 +163,7 @@ export default { category_number )}` ); + channel.edit({ topic: courses[index].INFO }); move_channel_count += await moveChannel( msgInt.guild, channel, @@ -171,6 +172,11 @@ export default { courses[index].CHANNEL_ID = channel.id; courses[index].save(); + } else if ( + channel.parent !== null && + channel.parent.name.startsWith(category_name) + ) { + channel.edit({ topic: courses[index].INFO }); } } From 5b3a1740818d9d627e9f47faa7c3756e56babe08 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 23:08:43 -0500 Subject: [PATCH 034/146] Ping members --- commands/owner/csCreateChannels.ts | 35 +++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 0d036d6..96e4bd4 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -32,6 +32,21 @@ function create_default_embed( .setFooter({ text: footer, iconURL: footerIcon }); return embed; } + +function cleanRoleString(role_name: string): string { + let clean_role_name: string = role_name + .toLowerCase() + .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[ (]/gi, "-"); + + if (Number.isInteger(role_name[role_name.length - 1])) { + const num = Number(role_name[role_name.length - 1]) - 1; + clean_role_name = role_name.slice(0, role_name.length - 2) + String(num); + return clean_role_name; + } + return clean_role_name; +} + export default { name: "csCreateChannels", category: "owner", @@ -152,11 +167,28 @@ export default { courses[index].CHANNEL_ID = new_channel.id; courses[index].save(); + + // Ping members who have this role + const role = msgInt.guild.roles.cache.find((role) => { + // console.log( + // `${cleanRoleString(role.name)}:${cleanChannelString( + // courses[index].CODE + // )}` + // ); + return ( + cleanRoleString(role.name) == + cleanChannelString(courses[index].CODE) + ); + }); + if (role !== undefined) { + //Ping member + new_channel.send(`Hey! <@&${role.id}> here is a channel for you!`); + } } else if ( channel.parent !== null && !channel.parent.name.startsWith(category_name) ) { - // Move old channels + // Moves and updates old channels console.log( `Moving: ${channel.name} to: ${concatCategoryName( category_name, @@ -176,6 +208,7 @@ export default { channel.parent !== null && channel.parent.name.startsWith(category_name) ) { + // updates old channels channel.edit({ topic: courses[index].INFO }); } } From 3e34c3794bf3f0ed65d81ab667ccf6d1162544bf Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 10 Sep 2022 23:11:57 -0500 Subject: [PATCH 035/146] Ping roles if you move the course from past courses --- commands/owner/csCreateChannels.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 96e4bd4..0ced656 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -170,11 +170,6 @@ export default { // Ping members who have this role const role = msgInt.guild.roles.cache.find((role) => { - // console.log( - // `${cleanRoleString(role.name)}:${cleanChannelString( - // courses[index].CODE - // )}` - // ); return ( cleanRoleString(role.name) == cleanChannelString(courses[index].CODE) @@ -204,6 +199,17 @@ export default { courses[index].CHANNEL_ID = channel.id; courses[index].save(); + // Ping members who have this role + const role = msgInt.guild.roles.cache.find((role) => { + return ( + cleanRoleString(role.name) == + cleanChannelString(courses[index].CODE) + ); + }); + if (role !== undefined) { + //Ping member + channel.send(`Hey! <@&${role.id}> here is the channel for you!`); + } } else if ( channel.parent !== null && channel.parent.name.startsWith(category_name) From 13564ba621b581c0694f49bedb968046cbde492e Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 12 Sep 2022 15:16:17 -0500 Subject: [PATCH 036/146] Remove delete command --- commands/owner/deleteChannels.ts | 65 -------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 commands/owner/deleteChannels.ts diff --git a/commands/owner/deleteChannels.ts b/commands/owner/deleteChannels.ts deleted file mode 100644 index 3515034..0000000 --- a/commands/owner/deleteChannels.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { MessageEmbed } from "discord.js"; - -import chalk from "chalk"; -import { ICommand } from "wokcommands"; - -export default { - name: "deleteAllChannels", - category: "owner", - description: "Delete all channels not named general or banshee", - slash: true, - testOnly: false, - guildOnly: true, - requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], - ownerOnly: true, - - callback: async ({ client, interaction: msgInt }) => { - if (msgInt.guild === null) { - console.log(chalk.red("No guild")); - return; - } - - const color = "#0099ff"; - const thumbnail = ""; - const title = "Delete all channels"; - const description = `deleted channels`; - const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = ""; - - // Embed construction - const embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); - - await msgInt.deferReply({ ephemeral: true }); - - msgInt.guild.channels.cache.forEach((channel) => { - if ( - !( - channel == undefined || - channel?.name == "general" || // Channels and categories to keep - channel?.name == "banshee" - ) - ) { - console.log(`Deleted channel: ${channel?.name}`); - channel.delete(); - } - }); - - await msgInt.editReply({ embeds: [embed] }); - - // Log the command usage - console.log( - chalk.blue( - `${chalk.green(`[COMMAND]`)} ${chalk.yellow( - msgInt.user.tag - )} used the ${chalk.green( - `/csCreateChannels` - )} command in ${chalk.yellow(msgInt.guild?.name)}` - ) - ); - }, -} as ICommand; From 7d728e20bc503bd983732dadf8609cb7542f332d Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 12 Sep 2022 15:22:04 -0500 Subject: [PATCH 037/146] Remove unused code --- commands/owner/csCreateChannels.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 0ced656..58d37a5 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -38,12 +38,7 @@ function cleanRoleString(role_name: string): string { .toLowerCase() .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") .replace(/[ (]/gi, "-"); - - if (Number.isInteger(role_name[role_name.length - 1])) { - const num = Number(role_name[role_name.length - 1]) - 1; - clean_role_name = role_name.slice(0, role_name.length - 2) + String(num); - return clean_role_name; - } + console.log(`${role_name}:${clean_role_name}`); return clean_role_name; } From df4e24792b20bcc99f2d6c17b005be5cc9bdffa5 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 12 Sep 2022 15:32:15 -0500 Subject: [PATCH 038/146] Deepsource --- commands/owner/csCreateChannels.ts | 2 +- utils/channelUtils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 58d37a5..18523db 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -34,7 +34,7 @@ function create_default_embed( } function cleanRoleString(role_name: string): string { - let clean_role_name: string = role_name + const clean_role_name: string = role_name .toLowerCase() .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") .replace(/[ (]/gi, "-"); diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 5f2cc8f..1c8662b 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -36,7 +36,7 @@ export async function createTextChannel( category_name?: string ) { //Determine which arg to use - let channel_parent: CategoryChannel | undefined = undefined; + let channel_parent: CategoryChannel | undefined; if (category !== undefined) { channel_parent = category; } else if (category_name !== undefined) { From 4efe07b84761f6ea1fe9e6f5ea4d0b05c5e91e99 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 12 Sep 2022 15:36:39 -0500 Subject: [PATCH 039/146] Deepsource --- utils/channelUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 1c8662b..2adaf59 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -83,5 +83,5 @@ export function concatCategoryName( ) { return category_number == 0 ? category_name - : category_name + ` ${category_number}`; + : `${category_name} ${category_number}!`; } From 4afa13d91d114386b71c1b87b3ee75d390995bc5 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 12 Sep 2022 15:40:08 -0500 Subject: [PATCH 040/146] Deepsource --- commands/owner/csCreateChannels.ts | 1 - utils/channelUtils.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 18523db..c1977fe 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -38,7 +38,6 @@ function cleanRoleString(role_name: string): string { .toLowerCase() .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") .replace(/[ (]/gi, "-"); - console.log(`${role_name}:${clean_role_name}`); return clean_role_name; } diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 2adaf59..7766d4d 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -83,5 +83,5 @@ export function concatCategoryName( ) { return category_number == 0 ? category_name - : `${category_name} ${category_number}!`; + : `${category_name} ${category_number}`; } From e0dc1a475fd42d2b6d46a530d75ce1d85f932ce0 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 13 Sep 2022 18:54:06 -0500 Subject: [PATCH 041/146] Move utils to correct locations --- commands/owner/csCreateChannels.ts | 31 ++---------------------------- utils/channelUtils.ts | 7 +++++++ utils/roleUtils.ts | 8 ++++++++ utils/util.ts | 23 ++++++++++++++++++++++ 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index c1977fe..8571a35 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -11,35 +11,8 @@ import { moveChannel, concatCategoryName, } from "../../utils/channelUtils"; - -function create_default_embed( - client: Client, - title: string, - description: string -) { - const color = "#0099ff"; - const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; - const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; - - // Embed construction - const embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); - return embed; -} - -function cleanRoleString(role_name: string): string { - const clean_role_name: string = role_name - .toLowerCase() - .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[ (]/gi, "-"); - return clean_role_name; -} +import { create_default_embed } from "../../utils/util"; +import { cleanRoleString } from "../../utils/roleUtils"; export default { name: "csCreateChannels", diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 7766d4d..eb259a2 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -8,6 +8,13 @@ export function cleanChannelString(s: string): string { .replace("compsci ", "cs") .replace(/[ (]/gi, "-"); } +export function isDupe(name: string): boolean { + if (name.search(/\(\d\)/) == -1) { + return true; + } else { + return false; + } +} export function checkForChannel(guild: Guild, channel_name: string) { return guild.channels.cache.find((channel) => { diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index 509d012..29f7f27 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -10,6 +10,14 @@ export interface IRole { ROLE_ID: string; } +export function cleanRoleString(role_name: string): string { + const clean_role_name: string = role_name + .toLowerCase() + .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[ (]/gi, "-"); + return clean_role_name; +} + export async function checkIfCollectionsExist(model: Model) { if (!(await model.exists({}))) { throw new Error(`${model.name} collection does not exist`); diff --git a/utils/util.ts b/utils/util.ts index a781494..84448ce 100644 --- a/utils/util.ts +++ b/utils/util.ts @@ -1,4 +1,27 @@ +import { Client, MessageEmbed } from "discord.js"; import fs from "node:fs"; + +export function create_default_embed( + client: Client, + title: string, + description: string +) { + const color = "#0099ff"; + const thumbnail = + "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + return embed; +} + export function sleep(ms: number) { // Create new promise that resolves itself after a delay of return new Promise((resolve: (args: void) => void) => From 76eee73524f06b0bf2b66165db9d332bab4797a3 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 13 Sep 2022 18:55:02 -0500 Subject: [PATCH 042/146] Add cleanCompSciString and remove functionality from cleanChannelString --- commands/owner/csCreateChannels.ts | 15 ++++++++++----- utils/channelUtils.ts | 1 - 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 8571a35..ce1d836 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -14,6 +14,9 @@ import { import { create_default_embed } from "../../utils/util"; import { cleanRoleString } from "../../utils/roleUtils"; +function cleanCompSciString(s: string): string { + return s.toLowerCase().replace("compsci ", "cs"); +} export default { name: "csCreateChannels", category: "owner", @@ -37,7 +40,9 @@ export default { //create an array of the courses with cleaned names const cleaned_courses: string[] = []; for (let index = 0; index < courses.length; index++) { - cleaned_courses.push(cleanChannelString(courses[index].CODE)); + cleaned_courses.push( + cleanChannelString(cleanCompSciString(courses[index].CODE)) + ); } // for (let index = 0; index < courses.length; index++) { @@ -87,7 +92,7 @@ export default { // Iterate through courses in db const channel = checkForChannel( msgInt.guild, - cleanChannelString(courses[index].CODE) + cleanChannelString(cleanCompSciString(courses[index].CODE)) ); let category = await ( @@ -124,7 +129,7 @@ export default { if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, - cleanChannelString(courses[index].CODE), + cleanCompSciString(courses[index].CODE), courses[index].INFO, category ); @@ -139,7 +144,7 @@ export default { const role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == - cleanChannelString(courses[index].CODE) + cleanChannelString(cleanCompSciString(courses[index].CODE)) ); }); if (role !== undefined) { @@ -170,7 +175,7 @@ export default { const role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == - cleanChannelString(courses[index].CODE) + cleanChannelString(cleanCompSciString(courses[index].CODE)) ); }); if (role !== undefined) { diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index eb259a2..b9e94ae 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -5,7 +5,6 @@ export function cleanChannelString(s: string): string { return s .toLowerCase() .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace("compsci ", "cs") .replace(/[ (]/gi, "-"); } export function isDupe(name: string): boolean { From 25714bc670406e8e1d08f1f8b55e95010ed66934 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 13 Sep 2022 18:55:57 -0500 Subject: [PATCH 043/146] deepsource --- commands/owner/csCreateChannels.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index ce1d836..a52c086 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -1,5 +1,3 @@ -import { Client, MessageEmbed } from "discord.js"; - import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel } from "../../models/classModel"; From 324907bbf12635dfc11e0b5c85fafe2c013d8b12 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 13 Sep 2022 23:14:44 -0500 Subject: [PATCH 044/146] Add migration command --- commands/owner/migrateDB.ts | 95 +++++++++++++++++++++++++++++++++++++ utils/channelUtils.ts | 7 --- 2 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 commands/owner/migrateDB.ts diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts new file mode 100644 index 0000000..957f846 --- /dev/null +++ b/commands/owner/migrateDB.ts @@ -0,0 +1,95 @@ +import chalk from "chalk"; +import { ICommand } from "wokcommands"; +import { classModel } from "../../models/classModel"; +import { isDupe } from "../../utils/channelUtils"; +import { create_default_embed } from "../../utils/util"; +import { Schema } from "mongoose"; + +function cleanCompSciString(s: string): string { + return s.toLowerCase().replace("compsci ", "cs"); +} + +export default { + name: "migrateDb", + category: "owner", + description: "Migrate Database from an old format to a new format", + slash: true, + testOnly: false, + guildOnly: true, + requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], + ownerOnly: true, + + callback: async ({ client, interaction: msgInt }) => { + if (msgInt.guild === null) { + console.log(chalk.red("No guild")); + return; + } + + await msgInt.deferReply({ ephemeral: true }); + + const courses = await classModel.find({}); + // Add new fields here + const newSchema = new Schema({ + NAME: { type: String, required: true }, + DUPE: { type: Boolean, require: true }, + }); + classModel.schema.add(newSchema); + + for (let index = 0; index < courses.length; index++) { + if (courses[index].get("CODE") != undefined) { + let new_name = courses[index].CODE; + const is_dupe = isDupe(new_name); + // Add field determining if it is a duplicate + if (is_dupe == -1) { + // Not a dupe + courses[index].set("DUPE", "false"); + } else { + // A dupe + courses[index].set("DUPE", "true"); + // Remove the number + new_name = new_name.slice(0, is_dupe); + } + new_name = cleanCompSciString(new_name); + courses[index].set("NAME", new_name); + // Remove UUID + console.log(chalk.yellow(`${courses[index].CODE}\t${new_name}`)); + // Remove CODE + courses[index].set("CODE", undefined); + //TODO: revise else + } + //Remove ROLE_NAME + if (courses[index].get("ROLE_NAME") != undefined) { + courses[index].set("ROLE_NAME", undefined); + } + // REMOVE UUID + if (courses[index].get("UUID") != undefined) { + courses[index].set("UUID", undefined); + } + } + // Turn off validation to delete paths + classModel.schema.set("validateBeforeSave", false); + // Turn off strict to add field + classModel.schema.set("strict", false); + // Save all the docs + await classModel.bulkSave(courses); + + const title = "Migrate Database"; + let description = "Migrated Database"; + + const embed = create_default_embed(client, title, description); + await msgInt.editReply({ embeds: [embed] }); + + console.log(chalk.yellow(description)); + + // Log the command usage + console.log( + chalk.blue( + `${chalk.green(`[COMMAND]`)} ${chalk.yellow( + msgInt.user.tag + )} used the ${chalk.green( + `/csCreateChannels` + )} command in ${chalk.yellow(msgInt.guild?.name)}` + ) + ); + }, +} as ICommand; diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index b9e94ae..3ce56ea 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -7,13 +7,6 @@ export function cleanChannelString(s: string): string { .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") .replace(/[ (]/gi, "-"); } -export function isDupe(name: string): boolean { - if (name.search(/\(\d\)/) == -1) { - return true; - } else { - return false; - } -} export function checkForChannel(guild: Guild, channel_name: string) { return guild.channels.cache.find((channel) => { From ab7aeee70b396d5fc88fd6fc4f56774ea9579a17 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 00:27:43 -0500 Subject: [PATCH 045/146] Update Schema and interfaces to reflect --- commands/owner/migrateDB.ts | 34 ++++++++++++++++++++++++---------- models/classModel.ts | 7 ++----- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 957f846..2d15592 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -1,14 +1,15 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; -import { classModel } from "../../models/classModel"; -import { isDupe } from "../../utils/channelUtils"; +import { classModel, IClass } from "../../models/classModel"; import { create_default_embed } from "../../utils/util"; -import { Schema } from "mongoose"; +import { Schema, Types, Document } from "mongoose"; function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs"); } - +export function isDupe(name: string): number { + return name.search(/\(\d\)/); +} export default { name: "migrateDb", category: "owner", @@ -27,15 +28,28 @@ export default { await msgInt.deferReply({ ephemeral: true }); - const courses = await classModel.find({}); - // Add new fields here - const newSchema = new Schema({ - NAME: { type: String, required: true }, - DUPE: { type: Boolean, require: true }, + interface IOldClass extends IClass { + CODE: string; + UUID: string; + ROLE_NAME: string; + } + const courses = (await classModel.find({})) as (Document< + unknown, + any, + IOldClass + > & + IOldClass & { _id: Types.ObjectId })[]; + + // Add old fields here + const oldSchema = new Schema({ + CODE: { type: String, required: true }, + UUID: { type: Boolean, require: true }, + ROLE_NAME: { type: Boolean, require: true }, }); - classModel.schema.add(newSchema); + classModel.schema.add(oldSchema); for (let index = 0; index < courses.length; index++) { + hi(courses[index]); if (courses[index].get("CODE") != undefined) { let new_name = courses[index].CODE; const is_dupe = isDupe(new_name); diff --git a/models/classModel.ts b/models/classModel.ts index c2f449e..2868d83 100644 --- a/models/classModel.ts +++ b/models/classModel.ts @@ -3,24 +3,21 @@ import { IRole } from "../utils/roleUtils"; export interface IClass extends IRole { id: string; - CODE: string; + NAME: string; TITLE: string; INFO: string; CHANNEL_NAME: string; CHANNEL_ID: string; - UUID: string; } const ClassSchema = new Schema({ id: { type: String }, - CODE: { type: String, required: true }, + NAME: { type: String, required: true }, TITLE: { type: String, required: true }, INFO: { type: String, required: true }, - ROLE_NAME: { type: String, required: true }, ROLE_ID: { type: String, required: true }, CHANNEL_NAME: { type: String }, CHANNEL_ID: { type: String }, - UUID: { type: String, default: "remove" }, }); const name = "class"; From f1e5bbd8954ad922d092154c52430ce42f4f7742 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 00:28:21 -0500 Subject: [PATCH 046/146] remove test function --- commands/owner/migrateDB.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 2d15592..fdb0f70 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -49,7 +49,6 @@ export default { classModel.schema.add(oldSchema); for (let index = 0; index < courses.length; index++) { - hi(courses[index]); if (courses[index].get("CODE") != undefined) { let new_name = courses[index].CODE; const is_dupe = isDupe(new_name); From 4db54ea600080936307de361c774d81b2b27caf3 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 16:16:45 -0500 Subject: [PATCH 047/146] Replace string concatenation with template --- commands/user/view.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/user/view.ts b/commands/user/view.ts index c5eee6e..dcec136 100644 --- a/commands/user/view.ts +++ b/commands/user/view.ts @@ -25,7 +25,7 @@ export default { }); } else { interaction.reply({ - content: "**Your roles:**\n" + list, + content: `**Your roles:**\n${list}`, ephemeral: true, }); } From 639dc668f87a7a64d3f0c0c8309e8957030f6387 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 17:12:27 -0500 Subject: [PATCH 048/146] Update roles and channels from migrated db --- commands/owner/migrateDB.ts | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index fdb0f70..72a37f6 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -3,6 +3,9 @@ import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; import { create_default_embed } from "../../utils/util"; import { Schema, Types, Document } from "mongoose"; +import { getCourseName, cleanChannelString } from "../../utils/channelUtils"; +import { cleanRoleString } from "../../utils/roleUtils"; +import { Role, TextChannel } from "discord.js"; function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs"); @@ -44,10 +47,12 @@ export default { const oldSchema = new Schema({ CODE: { type: String, required: true }, UUID: { type: Boolean, require: true }, - ROLE_NAME: { type: Boolean, require: true }, + ROLE_NAME: { type: String, require: true }, }); classModel.schema.add(oldSchema); + const channel_promises: Promise[] = []; + const role_promises: Promise[] = []; for (let index = 0; index < courses.length; index++) { if (courses[index].get("CODE") != undefined) { let new_name = courses[index].CODE; @@ -78,7 +83,36 @@ export default { if (courses[index].get("UUID") != undefined) { courses[index].set("UUID", undefined); } + + //UPDATE CHANNEL + if (courses[index].CHANNEL_ID) { + const channel = msgInt.guild.channels.cache.get( + courses[index].CHANNEL_ID + ); + if (channel != undefined && channel.type == "GUILD_TEXT") { + channel_promises.push( + channel.setName(cleanChannelString(getCourseName(courses[index]))) + ); + channel_promises.push(channel.setTopic(courses[index].TITLE)); + } + } + + //UPDATE ROLE + if (courses[index].ROLE_ID) { + const role = msgInt.guild.roles.cache.get(courses[index].ROLE_ID); + if (role != undefined) { + role_promises.push( + role.setName(cleanRoleString(getCourseName(courses[index]))) + ); + } + } } + + // Update all channels + await Promise.all(channel_promises); + // Update all roles + await Promise.all(role_promises); + // Turn off validation to delete paths classModel.schema.set("validateBeforeSave", false); // Turn off strict to add field From 9fba8bf0b0278c6c8df3d7c3aa7ba693d3a8eb4c Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 17:12:44 -0500 Subject: [PATCH 049/146] Add Missing DUPE field --- models/classModel.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/models/classModel.ts b/models/classModel.ts index 2868d83..6fcb954 100644 --- a/models/classModel.ts +++ b/models/classModel.ts @@ -6,6 +6,7 @@ export interface IClass extends IRole { NAME: string; TITLE: string; INFO: string; + DUPE: boolean; CHANNEL_NAME: string; CHANNEL_ID: string; } @@ -15,6 +16,7 @@ const ClassSchema = new Schema({ NAME: { type: String, required: true }, TITLE: { type: String, required: true }, INFO: { type: String, required: true }, + DUPE: { type: Boolean, required: true }, ROLE_ID: { type: String, required: true }, CHANNEL_NAME: { type: String }, CHANNEL_ID: { type: String }, From b3fb122c61b52f66c95f7fbe0f039ae8cd77e838 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 17:13:11 -0500 Subject: [PATCH 050/146] get dupe name --- utils/channelUtils.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 3ce56ea..48f3ec8 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -7,6 +7,9 @@ export function cleanChannelString(s: string): string { .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") .replace(/[ (]/gi, "-"); } +export function getCourseName(course: IClass) { + return course.DUPE == true ? `${course.NAME}-${course.TITLE}` : course.NAME; +} export function checkForChannel(guild: Guild, channel_name: string) { return guild.channels.cache.find((channel) => { From 48c33bb7cee72c39f88a68a4129c8dec384664f7 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 17:13:37 -0500 Subject: [PATCH 051/146] Update string cleaning --- utils/channelUtils.ts | 5 +++-- utils/roleUtils.ts | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 48f3ec8..2efe2cb 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,11 +1,12 @@ import { CategoryChannel, Guild, GuildChannel } from "discord.js"; import chalk from "chalk"; +import { classModel, IClass } from "../models/classModel"; export function cleanChannelString(s: string): string { return s .toLowerCase() - .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[ (]/gi, "-"); + .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[ ]/gi, "-"); } export function getCourseName(course: IClass) { return course.DUPE == true ? `${course.NAME}-${course.TITLE}` : course.NAME; diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index 29f7f27..fc1122b 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -13,8 +13,8 @@ export interface IRole { export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() - .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[ (]/gi, "-"); + .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[ ]/gi, "-"); return clean_role_name; } From ff798f78723785f5f5f78362bc5cb9f56ce82bf7 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 14 Sep 2022 17:13:56 -0500 Subject: [PATCH 052/146] Swap from CODE to NAME --- commands/owner/csClassPoll.ts | 10 ++++++---- commands/owner/csCreateChannels.ts | 14 ++++++-------- utils/roleUtils.ts | 10 +--------- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index 447aab3..4a383e2 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -7,8 +7,9 @@ import { import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { checkForRoles } from "../../utils/roleUtils"; +import { checkForRoles, cleanRoleString } from "../../utils/roleUtils"; import { sleep } from "../../utils/util"; +import { getCourseName, cleanChannelString } from "../../utils/channelUtils"; // Splits any size list into lists of at most `max_list_len` function split_list(list: T[], max_list_len: number): T[][] { @@ -21,9 +22,10 @@ function split_list(list: T[], max_list_len: number): T[][] { // consumes a Class and returns Message Selec tOption data function create_option_from_class(_class: IClass): MessageSelectOptionData { + const clean_name = cleanRoleString(getCourseName(_class)); return { - label: _class.CODE, - value: _class.CODE, + label: clean_name, + value: clean_name, description: _class.TITLE, }; } @@ -49,7 +51,7 @@ export default { return; } - const classes = await classModel.find({}).sort({ CODE: 1 }); + const classes = await classModel.find({}).sort({ NAME: 1 }); const class_chunks = split_list(classes, 25); const rows: MessageActionRow[] = []; diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index a52c086..067897f 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -33,14 +33,12 @@ export default { await msgInt.deferReply({ ephemeral: true }); - const courses = await classModel.find({}).sort({ CODE: 1 }); + const courses = await classModel.find({}); //create an array of the courses with cleaned names const cleaned_courses: string[] = []; for (let index = 0; index < courses.length; index++) { - cleaned_courses.push( - cleanChannelString(cleanCompSciString(courses[index].CODE)) - ); + cleaned_courses.push(cleanChannelString(courses[index].NAME)); } // for (let index = 0; index < courses.length; index++) { @@ -90,7 +88,7 @@ export default { // Iterate through courses in db const channel = checkForChannel( msgInt.guild, - cleanChannelString(cleanCompSciString(courses[index].CODE)) + cleanChannelString(courses[index].NAME) ); let category = await ( @@ -127,7 +125,7 @@ export default { if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, - cleanCompSciString(courses[index].CODE), + courses[index].NAME, courses[index].INFO, category ); @@ -142,7 +140,7 @@ export default { const role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == - cleanChannelString(cleanCompSciString(courses[index].CODE)) + cleanChannelString(courses[index].NAME) ); }); if (role !== undefined) { @@ -173,7 +171,7 @@ export default { const role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == - cleanChannelString(cleanCompSciString(courses[index].CODE)) + cleanChannelString(courses[index].NAME) ); }); if (role !== undefined) { diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index fc1122b..b3d03f4 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -71,15 +71,7 @@ export async function addNewRole( id: string ) { // This function is triggered when a user changes their role, it adds the new role to the user - let role; - switch (model.modelName) { - case "class": - //TODO: Rewrite IRole to include name, and replace CODE with name - role = await model.findOne({ CODE: id }); - break; - default: - role = await model.findOne({ NAME: id }); - } + let role = await model.findOne({ NAME: id }); if (role === null) { throw new Error(`No roll found with id: ${id}`); From 5a7cbaa4ba6b15a67eeb239f789a2efb8573340f Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Thu, 15 Sep 2022 22:32:33 +0000 Subject: [PATCH 053/146] Apply auto formatting changes --- commands/owner/migrateDB.ts | 284 ++++++++++++++++++------------------ 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 72a37f6..74a06ef 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -1,142 +1,142 @@ -import chalk from "chalk"; -import { ICommand } from "wokcommands"; -import { classModel, IClass } from "../../models/classModel"; -import { create_default_embed } from "../../utils/util"; -import { Schema, Types, Document } from "mongoose"; -import { getCourseName, cleanChannelString } from "../../utils/channelUtils"; -import { cleanRoleString } from "../../utils/roleUtils"; -import { Role, TextChannel } from "discord.js"; - -function cleanCompSciString(s: string): string { - return s.toLowerCase().replace("compsci ", "cs"); -} -export function isDupe(name: string): number { - return name.search(/\(\d\)/); -} -export default { - name: "migrateDb", - category: "owner", - description: "Migrate Database from an old format to a new format", - slash: true, - testOnly: false, - guildOnly: true, - requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], - ownerOnly: true, - - callback: async ({ client, interaction: msgInt }) => { - if (msgInt.guild === null) { - console.log(chalk.red("No guild")); - return; - } - - await msgInt.deferReply({ ephemeral: true }); - - interface IOldClass extends IClass { - CODE: string; - UUID: string; - ROLE_NAME: string; - } - const courses = (await classModel.find({})) as (Document< - unknown, - any, - IOldClass - > & - IOldClass & { _id: Types.ObjectId })[]; - - // Add old fields here - const oldSchema = new Schema({ - CODE: { type: String, required: true }, - UUID: { type: Boolean, require: true }, - ROLE_NAME: { type: String, require: true }, - }); - classModel.schema.add(oldSchema); - - const channel_promises: Promise[] = []; - const role_promises: Promise[] = []; - for (let index = 0; index < courses.length; index++) { - if (courses[index].get("CODE") != undefined) { - let new_name = courses[index].CODE; - const is_dupe = isDupe(new_name); - // Add field determining if it is a duplicate - if (is_dupe == -1) { - // Not a dupe - courses[index].set("DUPE", "false"); - } else { - // A dupe - courses[index].set("DUPE", "true"); - // Remove the number - new_name = new_name.slice(0, is_dupe); - } - new_name = cleanCompSciString(new_name); - courses[index].set("NAME", new_name); - // Remove UUID - console.log(chalk.yellow(`${courses[index].CODE}\t${new_name}`)); - // Remove CODE - courses[index].set("CODE", undefined); - //TODO: revise else - } - //Remove ROLE_NAME - if (courses[index].get("ROLE_NAME") != undefined) { - courses[index].set("ROLE_NAME", undefined); - } - // REMOVE UUID - if (courses[index].get("UUID") != undefined) { - courses[index].set("UUID", undefined); - } - - //UPDATE CHANNEL - if (courses[index].CHANNEL_ID) { - const channel = msgInt.guild.channels.cache.get( - courses[index].CHANNEL_ID - ); - if (channel != undefined && channel.type == "GUILD_TEXT") { - channel_promises.push( - channel.setName(cleanChannelString(getCourseName(courses[index]))) - ); - channel_promises.push(channel.setTopic(courses[index].TITLE)); - } - } - - //UPDATE ROLE - if (courses[index].ROLE_ID) { - const role = msgInt.guild.roles.cache.get(courses[index].ROLE_ID); - if (role != undefined) { - role_promises.push( - role.setName(cleanRoleString(getCourseName(courses[index]))) - ); - } - } - } - - // Update all channels - await Promise.all(channel_promises); - // Update all roles - await Promise.all(role_promises); - - // Turn off validation to delete paths - classModel.schema.set("validateBeforeSave", false); - // Turn off strict to add field - classModel.schema.set("strict", false); - // Save all the docs - await classModel.bulkSave(courses); - - const title = "Migrate Database"; - let description = "Migrated Database"; - - const embed = create_default_embed(client, title, description); - await msgInt.editReply({ embeds: [embed] }); - - console.log(chalk.yellow(description)); - - // Log the command usage - console.log( - chalk.blue( - `${chalk.green(`[COMMAND]`)} ${chalk.yellow( - msgInt.user.tag - )} used the ${chalk.green( - `/csCreateChannels` - )} command in ${chalk.yellow(msgInt.guild?.name)}` - ) - ); - }, -} as ICommand; +import chalk from "chalk"; +import { ICommand } from "wokcommands"; +import { classModel, IClass } from "../../models/classModel"; +import { create_default_embed } from "../../utils/util"; +import { Schema, Types, Document } from "mongoose"; +import { getCourseName, cleanChannelString } from "../../utils/channelUtils"; +import { cleanRoleString } from "../../utils/roleUtils"; +import { Role, TextChannel } from "discord.js"; + +function cleanCompSciString(s: string): string { + return s.toLowerCase().replace("compsci ", "cs"); +} +export function isDupe(name: string): number { + return name.search(/\(\d\)/); +} +export default { + name: "migrateDb", + category: "owner", + description: "Migrate Database from an old format to a new format", + slash: true, + testOnly: false, + guildOnly: true, + requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], + ownerOnly: true, + + callback: async ({ client, interaction: msgInt }) => { + if (msgInt.guild === null) { + console.log(chalk.red("No guild")); + return; + } + + await msgInt.deferReply({ ephemeral: true }); + + interface IOldClass extends IClass { + CODE: string; + UUID: string; + ROLE_NAME: string; + } + const courses = (await classModel.find({})) as (Document< + unknown, + any, + IOldClass + > & + IOldClass & { _id: Types.ObjectId })[]; + + // Add old fields here + const oldSchema = new Schema({ + CODE: { type: String, required: true }, + UUID: { type: Boolean, require: true }, + ROLE_NAME: { type: String, require: true }, + }); + classModel.schema.add(oldSchema); + + const channel_promises: Promise[] = []; + const role_promises: Promise[] = []; + for (let index = 0; index < courses.length; index++) { + if (courses[index].get("CODE") != undefined) { + let new_name = courses[index].CODE; + const is_dupe = isDupe(new_name); + // Add field determining if it is a duplicate + if (is_dupe == -1) { + // Not a dupe + courses[index].set("DUPE", "false"); + } else { + // A dupe + courses[index].set("DUPE", "true"); + // Remove the number + new_name = new_name.slice(0, is_dupe); + } + new_name = cleanCompSciString(new_name); + courses[index].set("NAME", new_name); + // Remove UUID + console.log(chalk.yellow(`${courses[index].CODE}\t${new_name}`)); + // Remove CODE + courses[index].set("CODE", undefined); + //TODO: revise else + } + //Remove ROLE_NAME + if (courses[index].get("ROLE_NAME") != undefined) { + courses[index].set("ROLE_NAME", undefined); + } + // REMOVE UUID + if (courses[index].get("UUID") != undefined) { + courses[index].set("UUID", undefined); + } + + //UPDATE CHANNEL + if (courses[index].CHANNEL_ID) { + const channel = msgInt.guild.channels.cache.get( + courses[index].CHANNEL_ID + ); + if (channel != undefined && channel.type == "GUILD_TEXT") { + channel_promises.push( + channel.setName(cleanChannelString(getCourseName(courses[index]))) + ); + channel_promises.push(channel.setTopic(courses[index].TITLE)); + } + } + + //UPDATE ROLE + if (courses[index].ROLE_ID) { + const role = msgInt.guild.roles.cache.get(courses[index].ROLE_ID); + if (role != undefined) { + role_promises.push( + role.setName(cleanRoleString(getCourseName(courses[index]))) + ); + } + } + } + + // Update all channels + await Promise.all(channel_promises); + // Update all roles + await Promise.all(role_promises); + + // Turn off validation to delete paths + classModel.schema.set("validateBeforeSave", false); + // Turn off strict to add field + classModel.schema.set("strict", false); + // Save all the docs + await classModel.bulkSave(courses); + + const title = "Migrate Database"; + let description = "Migrated Database"; + + const embed = create_default_embed(client, title, description); + await msgInt.editReply({ embeds: [embed] }); + + console.log(chalk.yellow(description)); + + // Log the command usage + console.log( + chalk.blue( + `${chalk.green(`[COMMAND]`)} ${chalk.yellow( + msgInt.user.tag + )} used the ${chalk.green( + `/csCreateChannels` + )} command in ${chalk.yellow(msgInt.guild?.name)}` + ) + ); + }, +} as ICommand; From 4c8db8f200c61c0e21aa36c3a17cc4e8675842ad Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 15 Sep 2022 21:17:17 -0500 Subject: [PATCH 054/146] Remove export --- commands/owner/migrateDB.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 74a06ef..0068f08 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -10,7 +10,7 @@ import { Role, TextChannel } from "discord.js"; function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs"); } -export function isDupe(name: string): number { +function isDupe(name: string): number { return name.search(/\(\d\)/); } export default { From b7d41e3cdf02c327de481d2a21ac410635b1e343 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 15 Sep 2022 21:17:33 -0500 Subject: [PATCH 055/146] use temp variable for current course in loop add debug statements --- commands/owner/migrateDB.ts | 41 +++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 0068f08..b0d21bb 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -54,55 +54,56 @@ export default { const channel_promises: Promise[] = []; const role_promises: Promise[] = []; for (let index = 0; index < courses.length; index++) { - if (courses[index].get("CODE") != undefined) { - let new_name = courses[index].CODE; + const course = courses[index]; + if (course.get("CODE") != undefined) { + let new_name = course.CODE; const is_dupe = isDupe(new_name); // Add field determining if it is a duplicate if (is_dupe == -1) { // Not a dupe - courses[index].set("DUPE", "false"); + course.set("DUPE", "false"); } else { // A dupe - courses[index].set("DUPE", "true"); + course.set("DUPE", "true"); // Remove the number new_name = new_name.slice(0, is_dupe); } new_name = cleanCompSciString(new_name); - courses[index].set("NAME", new_name); + course.set("NAME", new_name); // Remove UUID - console.log(chalk.yellow(`${courses[index].CODE}\t${new_name}`)); + console.log(chalk.yellow(`${course.CODE}\t${new_name}`)); // Remove CODE - courses[index].set("CODE", undefined); + course.set("CODE", undefined); //TODO: revise else } //Remove ROLE_NAME - if (courses[index].get("ROLE_NAME") != undefined) { - courses[index].set("ROLE_NAME", undefined); + if (course.get("ROLE_NAME") != undefined) { + course.set("ROLE_NAME", undefined); } // REMOVE UUID - if (courses[index].get("UUID") != undefined) { - courses[index].set("UUID", undefined); + if (course.get("UUID") != undefined) { + course.set("UUID", undefined); } //UPDATE CHANNEL - if (courses[index].CHANNEL_ID) { - const channel = msgInt.guild.channels.cache.get( - courses[index].CHANNEL_ID - ); + if (course.CHANNEL_ID) { + const channel = msgInt.guild.channels.cache.get(course.CHANNEL_ID); if (channel != undefined && channel.type == "GUILD_TEXT") { + console.log(chalk.yellow(`Updated channel: ${channel.name}`)); channel_promises.push( - channel.setName(cleanChannelString(getCourseName(courses[index]))) + channel.setName(cleanChannelString(getCourseName(course))) ); - channel_promises.push(channel.setTopic(courses[index].TITLE)); + channel_promises.push(channel.setTopic(course.TITLE)); } } //UPDATE ROLE - if (courses[index].ROLE_ID) { - const role = msgInt.guild.roles.cache.get(courses[index].ROLE_ID); + if (course.ROLE_ID) { + const role = msgInt.guild.roles.cache.get(course.ROLE_ID); if (role != undefined) { + console.log(chalk.yellow(`Updated role: ${role.name}`)); role_promises.push( - role.setName(cleanRoleString(getCourseName(courses[index]))) + role.setName(cleanRoleString(getCourseName(course))) ); } } From 59bb8a78c629413acf6f5c91a1fad0b76d95ab21 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 15 Sep 2022 21:36:03 -0500 Subject: [PATCH 056/146] Bugfix: replace continuous hunks of whitespace with a dash --- utils/channelUtils.ts | 2 +- utils/roleUtils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 2efe2cb..f6bb8a9 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -6,7 +6,7 @@ export function cleanChannelString(s: string): string { return s .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[ ]/gi, "-"); + .replace(/[\s+]/gi, "-"); // replace 1 or more whitespace characters with a dash. Channels can ony have one dash in a row } export function getCourseName(course: IClass) { return course.DUPE == true ? `${course.NAME}-${course.TITLE}` : course.NAME; diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index b3d03f4..5cfcb47 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -14,7 +14,7 @@ export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[ ]/gi, "-"); + .replace(/[\s+]/gi, "-"); // replace 1 or more whitespace characters with a dash. Roles can ony have one dash in a row return clean_role_name; } From 5d2a6d3914412452dcf18104ef17205d3e2a3317 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 15 Sep 2022 22:01:53 -0500 Subject: [PATCH 057/146] remove multiple -'s --- utils/channelUtils.ts | 7 +++++-- utils/roleUtils.ts | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index f6bb8a9..d7e5b95 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -3,10 +3,13 @@ import chalk from "chalk"; import { classModel, IClass } from "../models/classModel"; export function cleanChannelString(s: string): string { - return s + const s_new = s .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[\s+]/gi, "-"); // replace 1 or more whitespace characters with a dash. Channels can ony have one dash in a row + .replace(/[\s+]/gi, "-") + .replace(/[-{2,}]/gi, "-"); + console.log(`${s}\t:\t${s_new}`); + return s_new; } export function getCourseName(course: IClass) { return course.DUPE == true ? `${course.NAME}-${course.TITLE}` : course.NAME; diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index 5cfcb47..db6aa8a 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -14,7 +14,8 @@ export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[\s+]/gi, "-"); // replace 1 or more whitespace characters with a dash. Roles can ony have one dash in a row + .replace(/[\s+]/gi, "-") + .replace(/[-{2,}]/gi, "-"); return clean_role_name; } From 08379557aa5c9e1746e7084e4594f49d4fbc982b Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 15 Sep 2022 22:28:17 -0500 Subject: [PATCH 058/146] remove brackets that match singular items --- utils/channelUtils.ts | 4 ++-- utils/roleUtils.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index d7e5b95..5cf72c6 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -6,8 +6,8 @@ export function cleanChannelString(s: string): string { const s_new = s .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[\s+]/gi, "-") - .replace(/[-{2,}]/gi, "-"); + .replace(/\s+/gi, "-") + .replace(/-{2,}/gi, "-"); console.log(`${s}\t:\t${s_new}`); return s_new; } diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index db6aa8a..1e0b419 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -14,8 +14,8 @@ export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") - .replace(/[\s+]/gi, "-") - .replace(/[-{2,}]/gi, "-"); + .replace(/\s+/gi, "-") + .replace(/-{2,}/gi, "-"); return clean_role_name; } From d60803a95ffd31ef21b801a33aa71b3f7f9f9923 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 15 Sep 2022 22:29:46 -0500 Subject: [PATCH 059/146] group contiguous characters --- utils/channelUtils.ts | 2 +- utils/roleUtils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 5cf72c6..01d3752 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -5,7 +5,7 @@ import { classModel, IClass } from "../models/classModel"; export function cleanChannelString(s: string): string { const s_new = s .toLowerCase() - .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]+/gi, "") .replace(/\s+/gi, "-") .replace(/-{2,}/gi, "-"); console.log(`${s}\t:\t${s_new}`); diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index 1e0b419..6c6e4bd 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -13,7 +13,7 @@ export interface IRole { export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() - .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]+/gi, "") .replace(/\s+/gi, "-") .replace(/-{2,}/gi, "-"); return clean_role_name; From e243cf1e74985633f7810ef1fc6c1bf81adbbd02 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 15 Sep 2022 22:33:51 -0500 Subject: [PATCH 060/146] catch newlines --- utils/channelUtils.ts | 2 +- utils/roleUtils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 01d3752..0223020 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -5,7 +5,7 @@ import { classModel, IClass } from "../models/classModel"; export function cleanChannelString(s: string): string { const s_new = s .toLowerCase() - .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]+/gi, "") + .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/\n]+/gi, "") .replace(/\s+/gi, "-") .replace(/-{2,}/gi, "-"); console.log(`${s}\t:\t${s_new}`); diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index 6c6e4bd..b4ba9ab 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -13,7 +13,7 @@ export interface IRole { export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() - .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/]+/gi, "") + .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/\n]+/gi, "") .replace(/\s+/gi, "-") .replace(/-{2,}/gi, "-"); return clean_role_name; From d78e189f974908916932ed6d41e5c65c4a3877dd Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 00:18:17 -0500 Subject: [PATCH 061/146] use rate limiter --- commands/owner/migrateDB.ts | 76 ++++++++++++++++++++++++++++--------- package-lock.json | 11 ++++++ package.json | 1 + utils/channelUtils.ts | 1 - 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index b0d21bb..931d1e8 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -1,15 +1,21 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { create_default_embed } from "../../utils/util"; +import { create_default_embed, sleep } from "../../utils/util"; import { Schema, Types, Document } from "mongoose"; import { getCourseName, cleanChannelString } from "../../utils/channelUtils"; import { cleanRoleString } from "../../utils/roleUtils"; import { Role, TextChannel } from "discord.js"; +import Bottleneck from "bottleneck"; function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs"); } +function cleanCompSciTitle(s: string): string { + return s + .toLowerCase() + .replace(/(advanced )?topics in computer science:/gim, ""); +} function isDupe(name: string): number { return name.search(/\(\d\)/); } @@ -51,12 +57,17 @@ export default { }); classModel.schema.add(oldSchema); - const channel_promises: Promise[] = []; - const role_promises: Promise[] = []; + // Bottleneck to 50 calls per second to the discord api + const limiter = new Bottleneck({ minTime: 1000 / 50 }); + + const promises: (Promise | Promise)[] = []; for (let index = 0; index < courses.length; index++) { const course = courses[index]; - if (course.get("CODE") != undefined) { - let new_name = course.CODE; + // Remove CODE and replace with NAME + const code = course.get("CODE"); + if (code != undefined) { + let new_name = code; + console.log(`Name: ${code}`); const is_dupe = isDupe(new_name); // Add field determining if it is a duplicate if (is_dupe == -1) { @@ -71,11 +82,14 @@ export default { new_name = cleanCompSciString(new_name); course.set("NAME", new_name); // Remove UUID - console.log(chalk.yellow(`${course.CODE}\t${new_name}`)); + console.log(chalk.yellow(`${code}\t${new_name}`)); // Remove CODE course.set("CODE", undefined); //TODO: revise else } + //Clean TITLE + course.TITLE = cleanCompSciTitle(course.TITLE); + //Remove ROLE_NAME if (course.get("ROLE_NAME") != undefined) { course.set("ROLE_NAME", undefined); @@ -89,11 +103,25 @@ export default { if (course.CHANNEL_ID) { const channel = msgInt.guild.channels.cache.get(course.CHANNEL_ID); if (channel != undefined && channel.type == "GUILD_TEXT") { - console.log(chalk.yellow(`Updated channel: ${channel.name}`)); - channel_promises.push( - channel.setName(cleanChannelString(getCourseName(course))) - ); - channel_promises.push(channel.setTopic(course.TITLE)); + console.log(chalk.blue(`Old channel name: ${channel.name}`)); + const course_name = getCourseName(course); + const new_name = cleanChannelString(getCourseName(course)); + if (new_name != channel.name) { + console.log(chalk.yellow(`Course name: ${course_name}`)); + console.log(chalk.yellow(`Channel name: ${new_name}`)); + promises.push(limiter.schedule(() => channel.setName(new_name))); + // await channel.setName(new_name); + console.log(chalk.yellow(`Updated channel: ${channel.name}`)); + } + if (channel.topic != course.TITLE) { + promises.push( + limiter.schedule(() => channel.setTopic(course.TITLE)) + ); + // await channel.setTopic(course.TITLE); + console.log( + chalk.yellow(`Updated channel topic: ${channel.topic}`) + ); + } } } @@ -101,24 +129,36 @@ export default { if (course.ROLE_ID) { const role = msgInt.guild.roles.cache.get(course.ROLE_ID); if (role != undefined) { + const new_name = cleanRoleString(getCourseName(course)); + if (role.name != new_name) { + promises.push(limiter.schedule(() => role.setName(new_name))); + } + // await role.setName(new_name); console.log(chalk.yellow(`Updated role: ${role.name}`)); - role_promises.push( - role.setName(cleanRoleString(getCourseName(course))) - ); } } } - // Update all channels - await Promise.all(channel_promises); - // Update all roles - await Promise.all(role_promises); + console.log("Running all promises"); + // limiter.on("debug", function (message, data) { + // console.log(message); + // console.log(data); + // }); + + // Run all promises + await Promise.all(promises); + + // // Update all channels + // await Promise.all(channel_promises); + // // Update all roles + // await Promise.all(role_promises); // Turn off validation to delete paths classModel.schema.set("validateBeforeSave", false); // Turn off strict to add field classModel.schema.set("strict", false); // Save all the docs + console.log("Saving DB"); await classModel.bulkSave(courses); const title = "Migrate Database"; diff --git a/package-lock.json b/package-lock.json index 0e45260..53efd86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "axios": "^0.27.2", + "bottleneck": "^2.19.5", "chalk": "4.1.2", "discord.js": "^13.9.2", "mongoose": "^6.6.0", @@ -248,6 +249,11 @@ } ] }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, "node_modules/bson": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", @@ -1051,6 +1057,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, "bson": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", diff --git a/package.json b/package.json index a7cbbda..6eeae06 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "homepage": "https://github.com/Antares-Network/CSSC-Bot#readme", "dependencies": { "axios": "^0.27.2", + "bottleneck": "^2.19.5", "chalk": "4.1.2", "discord.js": "^13.9.2", "mongoose": "^6.6.0", diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 0223020..db008e8 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -8,7 +8,6 @@ export function cleanChannelString(s: string): string { .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/\n]+/gi, "") .replace(/\s+/gi, "-") .replace(/-{2,}/gi, "-"); - console.log(`${s}\t:\t${s_new}`); return s_new; } export function getCourseName(course: IClass) { From f2c39eb69fb731b1d5c83c08acc2b70d99cfad11 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 00:27:56 -0500 Subject: [PATCH 062/146] Don't drop ROLE_NAME --- commands/owner/migrateDB.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 931d1e8..429d08b 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -91,9 +91,9 @@ export default { course.TITLE = cleanCompSciTitle(course.TITLE); //Remove ROLE_NAME - if (course.get("ROLE_NAME") != undefined) { - course.set("ROLE_NAME", undefined); - } + // if (course.get("ROLE_NAME") != undefined) { + // course.set("ROLE_NAME", undefined); + // } // REMOVE UUID if (course.get("UUID") != undefined) { course.set("UUID", undefined); From 4ca6a21199f9459216af78e5cd1d810095741ce0 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 00:28:09 -0500 Subject: [PATCH 063/146] Create correct course name --- commands/owner/csCreateChannels.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 067897f..5abbea2 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -11,6 +11,7 @@ import { } from "../../utils/channelUtils"; import { create_default_embed } from "../../utils/util"; import { cleanRoleString } from "../../utils/roleUtils"; +import { getCourseName } from "../../utils/channelUtils"; function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs"); @@ -38,7 +39,7 @@ export default { //create an array of the courses with cleaned names const cleaned_courses: string[] = []; for (let index = 0; index < courses.length; index++) { - cleaned_courses.push(cleanChannelString(courses[index].NAME)); + cleaned_courses.push(cleanChannelString(getCourseName(courses[index]))); } // for (let index = 0; index < courses.length; index++) { @@ -88,7 +89,7 @@ export default { // Iterate through courses in db const channel = checkForChannel( msgInt.guild, - cleanChannelString(courses[index].NAME) + cleanChannelString(getCourseName(courses[index])) ); let category = await ( @@ -125,7 +126,7 @@ export default { if (channel === undefined || channel.type !== "GUILD_TEXT") { const new_channel = await createTextChannel( msgInt.guild, - courses[index].NAME, + getCourseName(courses[index]), courses[index].INFO, category ); @@ -140,7 +141,7 @@ export default { const role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == - cleanChannelString(courses[index].NAME) + cleanChannelString(getCourseName(courses[index])) ); }); if (role !== undefined) { @@ -171,7 +172,7 @@ export default { const role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == - cleanChannelString(courses[index].NAME) + cleanChannelString(getCourseName(courses[index])) ); }); if (role !== undefined) { From e83e57d59b25e2286dba0b104da986f9e0c096b9 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 00:52:37 -0500 Subject: [PATCH 064/146] limit names to 100 characters --- utils/channelUtils.ts | 3 ++- utils/roleUtils.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index db008e8..8ea4df9 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -7,7 +7,8 @@ export function cleanChannelString(s: string): string { .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/\n]+/gi, "") .replace(/\s+/gi, "-") - .replace(/-{2,}/gi, "-"); + .replace(/-{2,}/gi, "-") + .slice(0, 100); return s_new; } export function getCourseName(course: IClass) { diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index b4ba9ab..8a838be 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -15,7 +15,8 @@ export function cleanRoleString(role_name: string): string { .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/\n]+/gi, "") .replace(/\s+/gi, "-") - .replace(/-{2,}/gi, "-"); + .replace(/-{2,}/gi, "-") + .slice(0, 100); return clean_role_name; } From 363a6b1bdff1c7f13203e41c6e92832fba1ce4a5 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 01:29:56 -0500 Subject: [PATCH 065/146] Create channels with both title and info --- commands/owner/csCreateChannels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 5abbea2..ecd95a1 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -127,7 +127,7 @@ export default { const new_channel = await createTextChannel( msgInt.guild, getCourseName(courses[index]), - courses[index].INFO, + `${courses[index].TITLE} | ${courses[index].INFO}`, category ); From 1a3e70780d6d83000cff16a69f091fba7337cd93 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 01:30:10 -0500 Subject: [PATCH 066/146] Use limiter --- commands/owner/migrateDB.ts | 73 ++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 429d08b..6cd2ac4 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -9,12 +9,10 @@ import { Role, TextChannel } from "discord.js"; import Bottleneck from "bottleneck"; function cleanCompSciString(s: string): string { - return s.toLowerCase().replace("compsci ", "cs"); + return s.toLowerCase().replace("compsci ", "cs").trim(); } function cleanCompSciTitle(s: string): string { - return s - .toLowerCase() - .replace(/(advanced )?topics in computer science:/gim, ""); + return s.replace(/(advanced )?topics in computer science:/gim, "").trim(); } function isDupe(name: string): number { return name.search(/\(\d\)/); @@ -60,7 +58,6 @@ export default { // Bottleneck to 50 calls per second to the discord api const limiter = new Bottleneck({ minTime: 1000 / 50 }); - const promises: (Promise | Promise)[] = []; for (let index = 0; index < courses.length; index++) { const course = courses[index]; // Remove CODE and replace with NAME @@ -94,6 +91,10 @@ export default { // if (course.get("ROLE_NAME") != undefined) { // course.set("ROLE_NAME", undefined); // } + + // Udate ROLE_NAME + course.ROLE_NAME = cleanRoleString(getCourseName(course)); + // REMOVE UUID if (course.get("UUID") != undefined) { course.set("UUID", undefined); @@ -103,24 +104,31 @@ export default { if (course.CHANNEL_ID) { const channel = msgInt.guild.channels.cache.get(course.CHANNEL_ID); if (channel != undefined && channel.type == "GUILD_TEXT") { - console.log(chalk.blue(`Old channel name: ${channel.name}`)); - const course_name = getCourseName(course); const new_name = cleanChannelString(getCourseName(course)); + //Update Channel Name if (new_name != channel.name) { - console.log(chalk.yellow(`Course name: ${course_name}`)); - console.log(chalk.yellow(`Channel name: ${new_name}`)); - promises.push(limiter.schedule(() => channel.setName(new_name))); - // await channel.setName(new_name); - console.log(chalk.yellow(`Updated channel: ${channel.name}`)); + console.log(chalk.yellow(`Old channel name: ${channel.name}`)); + await limiter + .schedule(() => channel.setName(new_name)) + .then((newChannel) => + console.log( + chalk.blue(`Channel's new name: ${newChannel.name}`) + ) + ) + .catch(console.error); } - if (channel.topic != course.TITLE) { - promises.push( - limiter.schedule(() => channel.setTopic(course.TITLE)) - ); - // await channel.setTopic(course.TITLE); - console.log( - chalk.yellow(`Updated channel topic: ${channel.topic}`) - ); + //Update Channel Topic + const new_topic = `${courses[index].TITLE} | ${courses[index].INFO}`; + if (`${channel.topic}` != new_topic) { + console.log(chalk.yellow(`Channel's old topic: ${channel.topic}`)); + await limiter + .schedule(() => channel.setTopic(new_topic)) + .then((channel) => { + console.log( + chalk.blue(`Channel's new topic: ${channel.topic}`) + ); + }) + .catch(console.error); } } } @@ -131,28 +139,19 @@ export default { if (role != undefined) { const new_name = cleanRoleString(getCourseName(course)); if (role.name != new_name) { - promises.push(limiter.schedule(() => role.setName(new_name))); + console.log(chalk.yellow(`Role's old name: ${role.name}`)); + await limiter + .schedule(() => role.setName(new_name)) + .then((role) => { + console.log(chalk.blue(`Role's new name: ${role.name}`)); + }) + .catch(console.error); + await role.setName(new_name); } - // await role.setName(new_name); - console.log(chalk.yellow(`Updated role: ${role.name}`)); } } } - console.log("Running all promises"); - // limiter.on("debug", function (message, data) { - // console.log(message); - // console.log(data); - // }); - - // Run all promises - await Promise.all(promises); - - // // Update all channels - // await Promise.all(channel_promises); - // // Update all roles - // await Promise.all(role_promises); - // Turn off validation to delete paths classModel.schema.set("validateBeforeSave", false); // Turn off strict to add field From cec4660b5b325a3c703859ce446f27aa484f3750 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 01:35:15 -0500 Subject: [PATCH 067/146] Add get Topic function --- commands/owner/csCreateChannels.ts | 4 ++-- commands/owner/migrateDB.ts | 8 ++++++-- utils/channelUtils.ts | 3 +++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index ecd95a1..53ab276 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -11,7 +11,7 @@ import { } from "../../utils/channelUtils"; import { create_default_embed } from "../../utils/util"; import { cleanRoleString } from "../../utils/roleUtils"; -import { getCourseName } from "../../utils/channelUtils"; +import { getCourseName, getTopic } from "../../utils/channelUtils"; function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs"); @@ -127,7 +127,7 @@ export default { const new_channel = await createTextChannel( msgInt.guild, getCourseName(courses[index]), - `${courses[index].TITLE} | ${courses[index].INFO}`, + getTopic(courses[index]), category ); diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 6cd2ac4..4cb58fa 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -3,7 +3,11 @@ import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; import { create_default_embed, sleep } from "../../utils/util"; import { Schema, Types, Document } from "mongoose"; -import { getCourseName, cleanChannelString } from "../../utils/channelUtils"; +import { + getCourseName, + cleanChannelString, + getTopic, +} from "../../utils/channelUtils"; import { cleanRoleString } from "../../utils/roleUtils"; import { Role, TextChannel } from "discord.js"; import Bottleneck from "bottleneck"; @@ -118,7 +122,7 @@ export default { .catch(console.error); } //Update Channel Topic - const new_topic = `${courses[index].TITLE} | ${courses[index].INFO}`; + const new_topic = getTopic(courses[index]); if (`${channel.topic}` != new_topic) { console.log(chalk.yellow(`Channel's old topic: ${channel.topic}`)); await limiter diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index 8ea4df9..dee5edf 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -11,6 +11,9 @@ export function cleanChannelString(s: string): string { .slice(0, 100); return s_new; } +export function getTopic(course: IClass) { + return `${course.TITLE} | ${course.INFO}`.slice(1024); +} export function getCourseName(course: IClass) { return course.DUPE == true ? `${course.NAME}-${course.TITLE}` : course.NAME; } From 1c997ed8a040cd8d0b61c1925f84795aeb431191 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 01:50:22 -0500 Subject: [PATCH 068/146] Deepsource --- commands/owner/csClassPoll.ts | 2 +- commands/owner/csCreateChannels.ts | 3 --- commands/owner/migrateDB.ts | 16 +++------------- utils/channelUtils.ts | 2 +- utils/roleUtils.ts | 2 +- 5 files changed, 6 insertions(+), 19 deletions(-) diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index 4a383e2..b2ed6e7 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -9,7 +9,7 @@ import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; import { checkForRoles, cleanRoleString } from "../../utils/roleUtils"; import { sleep } from "../../utils/util"; -import { getCourseName, cleanChannelString } from "../../utils/channelUtils"; +import { getCourseName } from "../../utils/channelUtils"; // Splits any size list into lists of at most `max_list_len` function split_list(list: T[], max_list_len: number): T[][] { diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 53ab276..d99f71d 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -13,9 +13,6 @@ import { create_default_embed } from "../../utils/util"; import { cleanRoleString } from "../../utils/roleUtils"; import { getCourseName, getTopic } from "../../utils/channelUtils"; -function cleanCompSciString(s: string): string { - return s.toLowerCase().replace("compsci ", "cs"); -} export default { name: "csCreateChannels", category: "owner", diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 4cb58fa..283bc2e 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { create_default_embed, sleep } from "../../utils/util"; +import { create_default_embed } from "../../utils/util"; import { Schema, Types, Document } from "mongoose"; import { getCourseName, @@ -9,7 +9,6 @@ import { getTopic, } from "../../utils/channelUtils"; import { cleanRoleString } from "../../utils/roleUtils"; -import { Role, TextChannel } from "discord.js"; import Bottleneck from "bottleneck"; function cleanCompSciString(s: string): string { @@ -44,11 +43,7 @@ export default { UUID: string; ROLE_NAME: string; } - const courses = (await classModel.find({})) as (Document< - unknown, - any, - IOldClass - > & + const courses = (await classModel.find({})) as (Document & IOldClass & { _id: Types.ObjectId })[]; // Add old fields here @@ -91,11 +86,6 @@ export default { //Clean TITLE course.TITLE = cleanCompSciTitle(course.TITLE); - //Remove ROLE_NAME - // if (course.get("ROLE_NAME") != undefined) { - // course.set("ROLE_NAME", undefined); - // } - // Udate ROLE_NAME course.ROLE_NAME = cleanRoleString(getCourseName(course)); @@ -165,7 +155,7 @@ export default { await classModel.bulkSave(courses); const title = "Migrate Database"; - let description = "Migrated Database"; + const description = "Migrated Database"; const embed = create_default_embed(client, title, description); await msgInt.editReply({ embeds: [embed] }); diff --git a/utils/channelUtils.ts b/utils/channelUtils.ts index dee5edf..b566c31 100644 --- a/utils/channelUtils.ts +++ b/utils/channelUtils.ts @@ -1,6 +1,6 @@ import { CategoryChannel, Guild, GuildChannel } from "discord.js"; import chalk from "chalk"; -import { classModel, IClass } from "../models/classModel"; +import { IClass } from "../models/classModel"; export function cleanChannelString(s: string): string { const s_new = s diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index 8a838be..d96087e 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -73,7 +73,7 @@ export async function addNewRole( id: string ) { // This function is triggered when a user changes their role, it adds the new role to the user - let role = await model.findOne({ NAME: id }); + const role = await model.findOne({ NAME: id }); if (role === null) { throw new Error(`No roll found with id: ${id}`); From c148db841129a9f26e524fe978225fbfcf01a4d1 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:07:13 -0500 Subject: [PATCH 069/146] Clean course and rewrite createRoles --- utils/roleUtils.ts | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index d96087e..3a72c9e 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -95,28 +95,35 @@ export async function createRoles( guild: Guild, model: Model ): Promise { - const list = await model.find({}); + const role_docs = await model.find({}); - list?.forEach(async (element) => { - if (!guild.roles.cache.find((r) => r.name === element.ROLE_NAME)) { + for (let index = 0; index < role_docs.length; index++) { + const role_doc = role_docs[index]; + if ( + guild.roles.cache.find((r) => r.name === role_doc.ROLE_NAME) == undefined + ) { // Create the role - const role = await guild.roles.create({ name: element.ROLE_NAME }); - element.ROLE_ID = role.id; - element.save(); + const role = await guild.roles.create({ + name: cleanRoleString(role_doc.ROLE_NAME), + }); + role_doc.ROLE_ID = role.id; + await role_doc.save(); + // Print the role id to the console - console.log(chalk.yellow(`${element}: ${role?.id}`)); + console.log(chalk.yellow(`Created role: ${role.name}\tid: ${role?.id}`)); } else { // If the role already exists, print the id to the console - const id = guild.roles.cache.find( - (r) => r.name === element.ROLE_NAME - )?.id; - if (id !== undefined) { - element.ROLE_ID = id; + const role = guild.roles.cache.find((r) => r.name === role_doc.ROLE_NAME); + if (role == undefined) { + continue; } - element.save(); - console.log(chalk.yellow(`${element}: ${id}`)); + const id = role.id; + role_doc.ROLE_ID = id; + await role_doc.save(); + + console.log(chalk.yellow(`Role exists: ${role.name}\tid: ${id}`)); } - }); + } } export async function checkForRoles(guild: Guild): Promise { From 3b1f9fe0101168f67a368cbb4061ef0bb9128bbb Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:11:09 -0500 Subject: [PATCH 070/146] Fix message --- commands/owner/migrateDB.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 283bc2e..989a770 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -167,9 +167,9 @@ export default { chalk.blue( `${chalk.green(`[COMMAND]`)} ${chalk.yellow( msgInt.user.tag - )} used the ${chalk.green( - `/csCreateChannels` - )} command in ${chalk.yellow(msgInt.guild?.name)}` + )} used the ${chalk.green(`/migrateDB`)} command in ${chalk.yellow( + msgInt.guild?.name + )}` ) ); }, From 582073983eacb2bbff921f4658190470384b98c7 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:18:46 -0500 Subject: [PATCH 071/146] Fix Schema --- commands/owner/migrateDB.ts | 2 -- models/classModel.ts | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 989a770..54ca62a 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -41,7 +41,6 @@ export default { interface IOldClass extends IClass { CODE: string; UUID: string; - ROLE_NAME: string; } const courses = (await classModel.find({})) as (Document & IOldClass & { _id: Types.ObjectId })[]; @@ -50,7 +49,6 @@ export default { const oldSchema = new Schema({ CODE: { type: String, required: true }, UUID: { type: Boolean, require: true }, - ROLE_NAME: { type: String, require: true }, }); classModel.schema.add(oldSchema); diff --git a/models/classModel.ts b/models/classModel.ts index 6fcb954..966cf79 100644 --- a/models/classModel.ts +++ b/models/classModel.ts @@ -7,7 +7,8 @@ export interface IClass extends IRole { TITLE: string; INFO: string; DUPE: boolean; - CHANNEL_NAME: string; + ROLE_NAME: string; + ROLE_ID: string; CHANNEL_ID: string; } @@ -17,8 +18,8 @@ const ClassSchema = new Schema({ TITLE: { type: String, required: true }, INFO: { type: String, required: true }, DUPE: { type: Boolean, required: true }, + ROLE_NAME: { type: String, required: true }, ROLE_ID: { type: String, required: true }, - CHANNEL_NAME: { type: String }, CHANNEL_ID: { type: String }, }); From e68ae4346ef659c700a877c61fd2cb3188fc1c60 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:28:49 -0500 Subject: [PATCH 072/146] use defered reply --- commands/owner/createRoles.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index 17115d0..d2fcb2a 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -15,30 +15,31 @@ export default { requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], ownerOnly: true, - callback: async ({ interaction }) => { + callback: async ({ client, interaction: msgInt }) => { console.log(chalk.green("Creating roles...")); console.log( chalk.red("------------------------------------------------------") ); - if (interaction.guild === null) { + if (msgInt.guild === null) { return; } + await msgInt.deferReply({ ephemeral: true }); + // Create the roles - await createRoles(interaction.guild, classModel); - await createRoles(interaction.guild, staffModel); - await createRoles(interaction.guild, yearModel); - interaction.reply({ + await createRoles(msgInt.guild, classModel); + await createRoles(msgInt.guild, staffModel); + await createRoles(msgInt.guild, yearModel); + msgInt.editReply({ content: "Roles created!", - ephemeral: true, }); // Log the command usage console.log( chalk.blue( `${chalk.green(`[COMMAND]`)} ${chalk.yellow( - interaction.user.tag - )} used the ${chalk.green(`/yearPoll`)} command in ${chalk.yellow( - interaction.guild?.name + msgInt.user.tag + )} used the ${chalk.green(`/createRoles`)} command in ${chalk.yellow( + msgInt.guild?.name )}` ) ); From 7c07cb0e250d13ef395325c58f41f98e4f5eb0be Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:34:28 -0500 Subject: [PATCH 073/146] Only reply if the role is actually assigned --- features/interactionCreate.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/features/interactionCreate.ts b/features/interactionCreate.ts index 25a51b6..467fa38 100644 --- a/features/interactionCreate.ts +++ b/features/interactionCreate.ts @@ -68,6 +68,7 @@ export default (client: Client): void => { // Assign the new role to the user await addNewRole(member, staffModel, interaction.values[0]); } else if (interaction.customId.startsWith("csClassPoll+")) { + await addNewRole(member, classModel, interaction.values[0]); // Set the embed title const title = "CS Class Poll"; // Create and send the embed object @@ -82,8 +83,6 @@ export default (client: Client): void => { ephemeral: true, }); // Assign the new role to the user - - await addNewRole(member, classModel, interaction.values[0]); } }); }; From e491d497da031661de7706249050dd4c12525d41 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:36:29 -0500 Subject: [PATCH 074/146] Filter on ROLE_NAME rather than NAME --- utils/roleUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/roleUtils.ts b/utils/roleUtils.ts index 3a72c9e..8fc5be5 100644 --- a/utils/roleUtils.ts +++ b/utils/roleUtils.ts @@ -73,7 +73,7 @@ export async function addNewRole( id: string ) { // This function is triggered when a user changes their role, it adds the new role to the user - const role = await model.findOne({ NAME: id }); + const role = await model.findOne({ ROLE_NAME: id }); if (role === null) { throw new Error(`No roll found with id: ${id}`); From ce714f93adaececef75ca376efdc70da722340af Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:28:49 -0500 Subject: [PATCH 075/146] use defered reply --- commands/owner/createRoles.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index 17115d0..d2fcb2a 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -15,30 +15,31 @@ export default { requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], ownerOnly: true, - callback: async ({ interaction }) => { + callback: async ({ client, interaction: msgInt }) => { console.log(chalk.green("Creating roles...")); console.log( chalk.red("------------------------------------------------------") ); - if (interaction.guild === null) { + if (msgInt.guild === null) { return; } + await msgInt.deferReply({ ephemeral: true }); + // Create the roles - await createRoles(interaction.guild, classModel); - await createRoles(interaction.guild, staffModel); - await createRoles(interaction.guild, yearModel); - interaction.reply({ + await createRoles(msgInt.guild, classModel); + await createRoles(msgInt.guild, staffModel); + await createRoles(msgInt.guild, yearModel); + msgInt.editReply({ content: "Roles created!", - ephemeral: true, }); // Log the command usage console.log( chalk.blue( `${chalk.green(`[COMMAND]`)} ${chalk.yellow( - interaction.user.tag - )} used the ${chalk.green(`/yearPoll`)} command in ${chalk.yellow( - interaction.guild?.name + msgInt.user.tag + )} used the ${chalk.green(`/createRoles`)} command in ${chalk.yellow( + msgInt.guild?.name )}` ) ); From 7c6981bd5e8356c7ae3c325f2cfff77c45be56ad Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 16 Sep 2022 02:28:49 -0500 Subject: [PATCH 076/146] Revert "use defered reply" This reverts commit e68ae4346ef659c700a877c61fd2cb3188fc1c60. --- commands/owner/createRoles.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index d2fcb2a..17115d0 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -15,31 +15,30 @@ export default { requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], ownerOnly: true, - callback: async ({ client, interaction: msgInt }) => { + callback: async ({ interaction }) => { console.log(chalk.green("Creating roles...")); console.log( chalk.red("------------------------------------------------------") ); - if (msgInt.guild === null) { + if (interaction.guild === null) { return; } - await msgInt.deferReply({ ephemeral: true }); - // Create the roles - await createRoles(msgInt.guild, classModel); - await createRoles(msgInt.guild, staffModel); - await createRoles(msgInt.guild, yearModel); - msgInt.editReply({ + await createRoles(interaction.guild, classModel); + await createRoles(interaction.guild, staffModel); + await createRoles(interaction.guild, yearModel); + interaction.reply({ content: "Roles created!", + ephemeral: true, }); // Log the command usage console.log( chalk.blue( `${chalk.green(`[COMMAND]`)} ${chalk.yellow( - msgInt.user.tag - )} used the ${chalk.green(`/createRoles`)} command in ${chalk.yellow( - msgInt.guild?.name + interaction.user.tag + )} used the ${chalk.green(`/yearPoll`)} command in ${chalk.yellow( + interaction.guild?.name )}` ) ); From b2f12bf0ee199747cbc1a7caf141869af1a38d26 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 26 Dec 2022 19:50:09 -0600 Subject: [PATCH 077/146] only add new role if class poll is picked --- features/interactionCreate.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/features/interactionCreate.ts b/features/interactionCreate.ts index 25a51b6..89793b9 100644 --- a/features/interactionCreate.ts +++ b/features/interactionCreate.ts @@ -68,6 +68,8 @@ export default (client: Client): void => { // Assign the new role to the user await addNewRole(member, staffModel, interaction.values[0]); } else if (interaction.customId.startsWith("csClassPoll+")) { + // Assign the new role to the user + await addNewRole(member, classModel, interaction.values[0]); // Set the embed title const title = "CS Class Poll"; // Create and send the embed object @@ -81,9 +83,6 @@ export default (client: Client): void => { ], ephemeral: true, }); - // Assign the new role to the user - - await addNewRole(member, classModel, interaction.values[0]); } }); }; From 2bb9fb93824547dbb0c4d1457c16391aba73fcac Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 26 Dec 2022 19:52:07 -0600 Subject: [PATCH 078/146] revert --- features/interactionCreate.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/interactionCreate.ts b/features/interactionCreate.ts index 467fa38..25a51b6 100644 --- a/features/interactionCreate.ts +++ b/features/interactionCreate.ts @@ -68,7 +68,6 @@ export default (client: Client): void => { // Assign the new role to the user await addNewRole(member, staffModel, interaction.values[0]); } else if (interaction.customId.startsWith("csClassPoll+")) { - await addNewRole(member, classModel, interaction.values[0]); // Set the embed title const title = "CS Class Poll"; // Create and send the embed object @@ -83,6 +82,8 @@ export default (client: Client): void => { ephemeral: true, }); // Assign the new role to the user + + await addNewRole(member, classModel, interaction.values[0]); } }); }; From 5037366e1178c7bc5c070b22b99afb9ac389b700 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 26 Dec 2022 20:17:48 -0600 Subject: [PATCH 079/146] reword embed utils --- commands/owner/csCreateChannels.ts | 2 +- commands/owner/migrateDB.ts | 2 +- utils/embeds.ts | 21 +++++++++++++++++++++ utils/util.ts | 21 --------------------- 4 files changed, 23 insertions(+), 23 deletions(-) create mode 100644 utils/embeds.ts diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index d99f71d..2fd78d7 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -9,7 +9,7 @@ import { moveChannel, concatCategoryName, } from "../../utils/channelUtils"; -import { create_default_embed } from "../../utils/util"; +import { create_default_embed } from "../../utils/embeds"; import { cleanRoleString } from "../../utils/roleUtils"; import { getCourseName, getTopic } from "../../utils/channelUtils"; diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 54ca62a..c314196 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { create_default_embed } from "../../utils/util"; +import { create_default_embed } from "../../utils/embeds"; import { Schema, Types, Document } from "mongoose"; import { getCourseName, diff --git a/utils/embeds.ts b/utils/embeds.ts new file mode 100644 index 0000000..ac2a7ed --- /dev/null +++ b/utils/embeds.ts @@ -0,0 +1,21 @@ +import { Client, MessageEmbed } from "discord.js"; +export function create_default_embed( + client: Client, + title: string, + description: string +) { + const color = "#0099ff"; + const thumbnail = + "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + return embed; +} \ No newline at end of file diff --git a/utils/util.ts b/utils/util.ts index 84448ce..f456e7e 100644 --- a/utils/util.ts +++ b/utils/util.ts @@ -1,26 +1,5 @@ -import { Client, MessageEmbed } from "discord.js"; import fs from "node:fs"; -export function create_default_embed( - client: Client, - title: string, - description: string -) { - const color = "#0099ff"; - const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; - const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; - - // Embed construction - const embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); - return embed; -} export function sleep(ms: number) { // Create new promise that resolves itself after a delay of From cfe4100be75f47a384949946d2d06077c45dcc38 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 26 Dec 2022 20:18:14 -0600 Subject: [PATCH 080/146] renamed channel utils --- commands/owner/csClassPoll.ts | 2 +- commands/owner/csCreateChannels.ts | 4 ++-- commands/owner/migrateDB.ts | 2 +- utils/{channelUtils.ts => channels.ts} | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename utils/{channelUtils.ts => channels.ts} (100%) diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index b2ed6e7..f24a0a0 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -9,7 +9,7 @@ import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; import { checkForRoles, cleanRoleString } from "../../utils/roleUtils"; import { sleep } from "../../utils/util"; -import { getCourseName } from "../../utils/channelUtils"; +import { getCourseName } from "../../utils/channels"; // Splits any size list into lists of at most `max_list_len` function split_list(list: T[], max_list_len: number): T[][] { diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 2fd78d7..bdf94fc 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -8,10 +8,10 @@ import { findCategory, moveChannel, concatCategoryName, -} from "../../utils/channelUtils"; +} from "../../utils/channels"; import { create_default_embed } from "../../utils/embeds"; import { cleanRoleString } from "../../utils/roleUtils"; -import { getCourseName, getTopic } from "../../utils/channelUtils"; +import { getCourseName, getTopic } from "../../utils/channels"; export default { name: "csCreateChannels", diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index c314196..773c5e7 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -7,7 +7,7 @@ import { getCourseName, cleanChannelString, getTopic, -} from "../../utils/channelUtils"; +} from "../../utils/channels"; import { cleanRoleString } from "../../utils/roleUtils"; import Bottleneck from "bottleneck"; diff --git a/utils/channelUtils.ts b/utils/channels.ts similarity index 100% rename from utils/channelUtils.ts rename to utils/channels.ts From 7d924a1d2dca87dd74aa5d3e677f348491498fd6 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 26 Dec 2022 20:18:29 -0600 Subject: [PATCH 081/146] renamed role utils --- commands/owner/createRoles.ts | 2 +- commands/owner/csClassPoll.ts | 2 +- commands/owner/csCreateChannels.ts | 2 +- commands/owner/migrateDB.ts | 2 +- commands/owner/staffPoll.ts | 2 +- commands/owner/yearPoll.ts | 2 +- commands/user/clear.ts | 2 +- commands/user/view.ts | 2 +- features/interactionCreate.ts | 2 +- index.ts | 2 +- models/classModel.ts | 2 +- models/staffModel.ts | 2 +- models/yearModel.ts | 2 +- utils/{roleUtils.ts => roles.ts} | 0 14 files changed, 13 insertions(+), 13 deletions(-) rename utils/{roleUtils.ts => roles.ts} (100%) diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index 17115d0..6cefc7a 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -1,5 +1,5 @@ import { ICommand } from "wokcommands"; -import { createRoles } from "../../utils/roleUtils"; +import { createRoles } from "../../utils/roles"; import chalk from "chalk"; import { classModel } from "../../models/classModel"; import { staffModel } from "../../models/staffModel"; diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index f24a0a0..f6b0d7c 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -7,7 +7,7 @@ import { import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { checkForRoles, cleanRoleString } from "../../utils/roleUtils"; +import { checkForRoles, cleanRoleString } from "../../utils/roles"; import { sleep } from "../../utils/util"; import { getCourseName } from "../../utils/channels"; diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index bdf94fc..429878e 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -10,7 +10,7 @@ import { concatCategoryName, } from "../../utils/channels"; import { create_default_embed } from "../../utils/embeds"; -import { cleanRoleString } from "../../utils/roleUtils"; +import { cleanRoleString } from "../../utils/roles"; import { getCourseName, getTopic } from "../../utils/channels"; export default { diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 773c5e7..a8fc3fb 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -8,7 +8,7 @@ import { cleanChannelString, getTopic, } from "../../utils/channels"; -import { cleanRoleString } from "../../utils/roleUtils"; +import { cleanRoleString } from "../../utils/roles"; import Bottleneck from "bottleneck"; function cleanCompSciString(s: string): string { diff --git a/commands/owner/staffPoll.ts b/commands/owner/staffPoll.ts index 2a010a3..b334279 100644 --- a/commands/owner/staffPoll.ts +++ b/commands/owner/staffPoll.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { MessageEmbed, MessageActionRow, MessageSelectMenu } from "discord.js"; import { ICommand } from "wokcommands"; -import { checkForRoles } from "../../utils/roleUtils"; +import { checkForRoles } from "../../utils/roles"; export default { name: "staffPoll", diff --git a/commands/owner/yearPoll.ts b/commands/owner/yearPoll.ts index 1f434c0..bf9a862 100644 --- a/commands/owner/yearPoll.ts +++ b/commands/owner/yearPoll.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { MessageEmbed, MessageActionRow, MessageSelectMenu } from "discord.js"; import { ICommand } from "wokcommands"; -import { checkForRoles } from "../../utils/roleUtils"; +import { checkForRoles } from "../../utils/roles"; export default { name: "yearPoll", diff --git a/commands/user/clear.ts b/commands/user/clear.ts index 7c90193..d36684a 100644 --- a/commands/user/clear.ts +++ b/commands/user/clear.ts @@ -4,7 +4,7 @@ import { ICommand } from "wokcommands"; import { classModel } from "../../models/classModel"; import { staffModel } from "../../models/staffModel"; import { yearModel } from "../../models/yearModel"; -import { removeRole } from "../../utils/roleUtils"; +import { removeRole } from "../../utils/roles"; export default { name: "clear", diff --git a/commands/user/view.ts b/commands/user/view.ts index dcec136..2daa7dd 100644 --- a/commands/user/view.ts +++ b/commands/user/view.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { GuildMember } from "discord.js"; import { ICommand } from "wokcommands"; -import { getUsersRoles } from "../../utils/roleUtils"; +import { getUsersRoles } from "../../utils/roles"; export default { name: "view", diff --git a/features/interactionCreate.ts b/features/interactionCreate.ts index 25a51b6..b39543a 100644 --- a/features/interactionCreate.ts +++ b/features/interactionCreate.ts @@ -1,6 +1,6 @@ import { Client, MessageEmbed, GuildMember } from "discord.js"; import { yearModel } from "../models/yearModel"; -import { removeRole, addNewRole } from "../utils/roleUtils"; +import { removeRole, addNewRole } from "../utils/roles"; import { staffModel } from "../models/staffModel"; import { classModel } from "../models/classModel"; diff --git a/index.ts b/index.ts index be57762..f9f046c 100644 --- a/index.ts +++ b/index.ts @@ -7,7 +7,7 @@ import dotenv from "dotenv"; import { isDocker } from "./utils/util"; // import custom modules -import { checkForRoles, checkIfCollectionsExist } from "./utils/roleUtils"; +import { checkForRoles, checkIfCollectionsExist } from "./utils/roles"; import { classModel } from "./models/classModel"; import { staffModel } from "./models/staffModel"; import { yearModel } from "./models/yearModel"; diff --git a/models/classModel.ts b/models/classModel.ts index 966cf79..e97bde3 100644 --- a/models/classModel.ts +++ b/models/classModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../utils/roleUtils"; +import { IRole } from "../utils/roles"; export interface IClass extends IRole { id: string; diff --git a/models/staffModel.ts b/models/staffModel.ts index c6b0822..962ee04 100644 --- a/models/staffModel.ts +++ b/models/staffModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../utils/roleUtils"; +import { IRole } from "../utils/roles"; export interface IStaff extends IRole { id: string; diff --git a/models/yearModel.ts b/models/yearModel.ts index dc6463b..56af792 100644 --- a/models/yearModel.ts +++ b/models/yearModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../utils/roleUtils"; +import { IRole } from "../utils/roles"; export interface IYear extends IRole { id: string; diff --git a/utils/roleUtils.ts b/utils/roles.ts similarity index 100% rename from utils/roleUtils.ts rename to utils/roles.ts From d1a02968a3d05a122fdf787d7a2cbf9cc5eeabbc Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Tue, 27 Dec 2022 02:18:39 +0000 Subject: [PATCH 082/146] Apply auto formatting changes --- utils/embeds.ts | 42 +++++++++++++++++++++--------------------- utils/util.ts | 1 - 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/utils/embeds.ts b/utils/embeds.ts index ac2a7ed..0069e98 100644 --- a/utils/embeds.ts +++ b/utils/embeds.ts @@ -1,21 +1,21 @@ -import { Client, MessageEmbed } from "discord.js"; -export function create_default_embed( - client: Client, - title: string, - description: string -) { - const color = "#0099ff"; - const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; - const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; - - // Embed construction - const embed = new MessageEmbed() - .setColor(color) - .setTitle(title) - .setThumbnail(thumbnail) - .setDescription(description) - .setFooter({ text: footer, iconURL: footerIcon }); - return embed; -} \ No newline at end of file +import { Client, MessageEmbed } from "discord.js"; +export function create_default_embed( + client: Client, + title: string, + description: string +) { + const color = "#0099ff"; + const thumbnail = + "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; + const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + + // Embed construction + const embed = new MessageEmbed() + .setColor(color) + .setTitle(title) + .setThumbnail(thumbnail) + .setDescription(description) + .setFooter({ text: footer, iconURL: footerIcon }); + return embed; +} diff --git a/utils/util.ts b/utils/util.ts index f456e7e..3edc1fe 100644 --- a/utils/util.ts +++ b/utils/util.ts @@ -1,6 +1,5 @@ import fs from "node:fs"; - export function sleep(ms: number) { // Create new promise that resolves itself after a delay of return new Promise((resolve: (args: void) => void) => From 10ce1e0168343b5b631e01f4573688a02f7e8f0b Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 26 Dec 2022 20:19:32 -0600 Subject: [PATCH 083/146] Auto stash before merge of "feature/schiltz3/db-migrate" and "origin/feature/schiltz3/db-migrate" --- commands/owner/csClassPoll.ts | 2 +- features/statuspage.ts | 2 +- index.ts | 2 +- utils/{util.ts => docker.ts} | 7 ------- utils/sleep.ts | 7 +++++++ 5 files changed, 10 insertions(+), 10 deletions(-) rename utils/{util.ts => docker.ts} (77%) create mode 100644 utils/sleep.ts diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index f6b0d7c..46b07a1 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -8,7 +8,7 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; import { checkForRoles, cleanRoleString } from "../../utils/roles"; -import { sleep } from "../../utils/util"; +import { sleep } from "../../utils/docker"; import { getCourseName } from "../../utils/channels"; // Splits any size list into lists of at most `max_list_len` diff --git a/features/statuspage.ts b/features/statuspage.ts index 2bd8b1a..299f149 100644 --- a/features/statuspage.ts +++ b/features/statuspage.ts @@ -1,6 +1,6 @@ import axios from "axios"; import { Client } from "discord.js"; -import { isDocker } from "../utils/util"; +import { isDocker } from "../utils/docker"; export default (client: Client): void => { // Check if the bot is running in a docker container by checking if the env variable UPTIME_KUMA_CONTAINERIZED is true diff --git a/index.ts b/index.ts index f9f046c..f0a03fb 100644 --- a/index.ts +++ b/index.ts @@ -4,7 +4,7 @@ import WOKCommands from "wokcommands"; import path from "path"; import chalk from "chalk"; import dotenv from "dotenv"; -import { isDocker } from "./utils/util"; +import { isDocker } from "./utils/docker"; // import custom modules import { checkForRoles, checkIfCollectionsExist } from "./utils/roles"; diff --git a/utils/util.ts b/utils/docker.ts similarity index 77% rename from utils/util.ts rename to utils/docker.ts index 3edc1fe..bf0af35 100644 --- a/utils/util.ts +++ b/utils/docker.ts @@ -1,12 +1,5 @@ import fs from "node:fs"; -export function sleep(ms: number) { - // Create new promise that resolves itself after a delay of - return new Promise((resolve: (args: void) => void) => - setTimeout(resolve, ms) - ); -} - //! This code was taken from the package `is-docker` and modified to work here with esm //! Original repository: https://github.com/sindresorhus/is-docker let isDockerCached: boolean; diff --git a/utils/sleep.ts b/utils/sleep.ts new file mode 100644 index 0000000..dcceaff --- /dev/null +++ b/utils/sleep.ts @@ -0,0 +1,7 @@ + +export function sleep(ms: number) { + // Create new promise that resolves itself after a delay of + return new Promise((resolve: (args: void) => void) => + setTimeout(resolve, ms) + ); +} \ No newline at end of file From 5f238104bf6b3ac36d2bd3883d0d495860590eae Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Tue, 27 Dec 2022 02:19:58 +0000 Subject: [PATCH 084/146] Apply auto formatting changes --- utils/sleep.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/utils/sleep.ts b/utils/sleep.ts index dcceaff..6d492e6 100644 --- a/utils/sleep.ts +++ b/utils/sleep.ts @@ -1,7 +1,6 @@ - -export function sleep(ms: number) { - // Create new promise that resolves itself after a delay of - return new Promise((resolve: (args: void) => void) => - setTimeout(resolve, ms) - ); -} \ No newline at end of file +export function sleep(ms: number) { + // Create new promise that resolves itself after a delay of + return new Promise((resolve: (args: void) => void) => + setTimeout(resolve, ms) + ); +} From 6a4a3fc476cd31d293dcc46515437d4033802dcb Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 26 Dec 2022 20:28:06 -0600 Subject: [PATCH 085/146] break out utils into separate files --- commands/owner/createRoles.ts | 2 +- commands/owner/csClassPoll.ts | 4 +- commands/owner/csCreateChannels.ts | 2 +- commands/owner/staffPoll.ts | 2 +- commands/owner/yearPoll.ts | 2 +- commands/user/clear.ts | 2 +- commands/user/view.ts | 2 +- features/interactionCreate.ts | 2 +- features/statuspage.ts | 2 +- index.ts | 4 +- models/classModel.ts | 2 +- models/staffModel.ts | 2 +- models/yearModel.ts | 2 +- utils/{channelUtils.ts => channels.ts} | 0 utils/{util.ts => docker.ts} | 68 ++++++++++++-------------- utils/{roleUtils.ts => roles.ts} | 0 utils/sleep.ts | 7 +++ 17 files changed, 53 insertions(+), 52 deletions(-) rename utils/{channelUtils.ts => channels.ts} (100%) rename utils/{util.ts => docker.ts} (77%) rename utils/{roleUtils.ts => roles.ts} (100%) create mode 100644 utils/sleep.ts diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index 17115d0..6cefc7a 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -1,5 +1,5 @@ import { ICommand } from "wokcommands"; -import { createRoles } from "../../utils/roleUtils"; +import { createRoles } from "../../utils/roles"; import chalk from "chalk"; import { classModel } from "../../models/classModel"; import { staffModel } from "../../models/staffModel"; diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index 447aab3..a234e30 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -7,8 +7,8 @@ import { import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { checkForRoles } from "../../utils/roleUtils"; -import { sleep } from "../../utils/util"; +import { checkForRoles } from "../../utils/roles"; +import { sleep } from "../../utils/sleep"; // Splits any size list into lists of at most `max_list_len` function split_list(list: T[], max_list_len: number): T[][] { diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index c1977fe..efc7d97 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -10,7 +10,7 @@ import { findCategory, moveChannel, concatCategoryName, -} from "../../utils/channelUtils"; +} from "../../utils/channels"; function create_default_embed( client: Client, diff --git a/commands/owner/staffPoll.ts b/commands/owner/staffPoll.ts index 2a010a3..b334279 100644 --- a/commands/owner/staffPoll.ts +++ b/commands/owner/staffPoll.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { MessageEmbed, MessageActionRow, MessageSelectMenu } from "discord.js"; import { ICommand } from "wokcommands"; -import { checkForRoles } from "../../utils/roleUtils"; +import { checkForRoles } from "../../utils/roles"; export default { name: "staffPoll", diff --git a/commands/owner/yearPoll.ts b/commands/owner/yearPoll.ts index 1f434c0..bf9a862 100644 --- a/commands/owner/yearPoll.ts +++ b/commands/owner/yearPoll.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { MessageEmbed, MessageActionRow, MessageSelectMenu } from "discord.js"; import { ICommand } from "wokcommands"; -import { checkForRoles } from "../../utils/roleUtils"; +import { checkForRoles } from "../../utils/roles"; export default { name: "yearPoll", diff --git a/commands/user/clear.ts b/commands/user/clear.ts index 7c90193..d36684a 100644 --- a/commands/user/clear.ts +++ b/commands/user/clear.ts @@ -4,7 +4,7 @@ import { ICommand } from "wokcommands"; import { classModel } from "../../models/classModel"; import { staffModel } from "../../models/staffModel"; import { yearModel } from "../../models/yearModel"; -import { removeRole } from "../../utils/roleUtils"; +import { removeRole } from "../../utils/roles"; export default { name: "clear", diff --git a/commands/user/view.ts b/commands/user/view.ts index dcec136..2daa7dd 100644 --- a/commands/user/view.ts +++ b/commands/user/view.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { GuildMember } from "discord.js"; import { ICommand } from "wokcommands"; -import { getUsersRoles } from "../../utils/roleUtils"; +import { getUsersRoles } from "../../utils/roles"; export default { name: "view", diff --git a/features/interactionCreate.ts b/features/interactionCreate.ts index 25a51b6..b39543a 100644 --- a/features/interactionCreate.ts +++ b/features/interactionCreate.ts @@ -1,6 +1,6 @@ import { Client, MessageEmbed, GuildMember } from "discord.js"; import { yearModel } from "../models/yearModel"; -import { removeRole, addNewRole } from "../utils/roleUtils"; +import { removeRole, addNewRole } from "../utils/roles"; import { staffModel } from "../models/staffModel"; import { classModel } from "../models/classModel"; diff --git a/features/statuspage.ts b/features/statuspage.ts index 2bd8b1a..299f149 100644 --- a/features/statuspage.ts +++ b/features/statuspage.ts @@ -1,6 +1,6 @@ import axios from "axios"; import { Client } from "discord.js"; -import { isDocker } from "../utils/util"; +import { isDocker } from "../utils/docker"; export default (client: Client): void => { // Check if the bot is running in a docker container by checking if the env variable UPTIME_KUMA_CONTAINERIZED is true diff --git a/index.ts b/index.ts index be57762..f0a03fb 100644 --- a/index.ts +++ b/index.ts @@ -4,10 +4,10 @@ import WOKCommands from "wokcommands"; import path from "path"; import chalk from "chalk"; import dotenv from "dotenv"; -import { isDocker } from "./utils/util"; +import { isDocker } from "./utils/docker"; // import custom modules -import { checkForRoles, checkIfCollectionsExist } from "./utils/roleUtils"; +import { checkForRoles, checkIfCollectionsExist } from "./utils/roles"; import { classModel } from "./models/classModel"; import { staffModel } from "./models/staffModel"; import { yearModel } from "./models/yearModel"; diff --git a/models/classModel.ts b/models/classModel.ts index c2f449e..ab0dd75 100644 --- a/models/classModel.ts +++ b/models/classModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../utils/roleUtils"; +import { IRole } from "../utils/roles"; export interface IClass extends IRole { id: string; diff --git a/models/staffModel.ts b/models/staffModel.ts index c6b0822..962ee04 100644 --- a/models/staffModel.ts +++ b/models/staffModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../utils/roleUtils"; +import { IRole } from "../utils/roles"; export interface IStaff extends IRole { id: string; diff --git a/models/yearModel.ts b/models/yearModel.ts index dc6463b..56af792 100644 --- a/models/yearModel.ts +++ b/models/yearModel.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IRole } from "../utils/roleUtils"; +import { IRole } from "../utils/roles"; export interface IYear extends IRole { id: string; diff --git a/utils/channelUtils.ts b/utils/channels.ts similarity index 100% rename from utils/channelUtils.ts rename to utils/channels.ts diff --git a/utils/util.ts b/utils/docker.ts similarity index 77% rename from utils/util.ts rename to utils/docker.ts index a781494..accae05 100644 --- a/utils/util.ts +++ b/utils/docker.ts @@ -1,37 +1,31 @@ -import fs from "node:fs"; -export function sleep(ms: number) { - // Create new promise that resolves itself after a delay of - return new Promise((resolve: (args: void) => void) => - setTimeout(resolve, ms) - ); -} - -//! This code was taken from the package `is-docker` and modified to work here with esm -//! Original repository: https://github.com/sindresorhus/is-docker -let isDockerCached: boolean; - -function hasDockerEnv() { - try { - fs.statSync("/.dockerenv"); - return true; - } catch { - return false; - } -} - -function hasDockerCGroup() { - try { - return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); - } catch { - return false; - } -} - -export function isDocker() { - // TODO: Use `??=` when targeting Node.js 16. - if (isDockerCached === undefined) { - isDockerCached = hasDockerEnv() || hasDockerCGroup(); - } - - return isDockerCached; -} +import fs from "node:fs"; + +//! This code was taken from the package `is-docker` and modified to work here with esm +//! Original repository: https://github.com/sindresorhus/is-docker +let isDockerCached: boolean; + +function hasDockerEnv() { + try { + fs.statSync("/.dockerenv"); + return true; + } catch { + return false; + } +} + +function hasDockerCGroup() { + try { + return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); + } catch { + return false; + } +} + +export function isDocker() { + // TODO: Use `??=` when targeting Node.js 16. + if (isDockerCached === undefined) { + isDockerCached = hasDockerEnv() || hasDockerCGroup(); + } + + return isDockerCached; +} \ No newline at end of file diff --git a/utils/roleUtils.ts b/utils/roles.ts similarity index 100% rename from utils/roleUtils.ts rename to utils/roles.ts diff --git a/utils/sleep.ts b/utils/sleep.ts new file mode 100644 index 0000000..11e6011 --- /dev/null +++ b/utils/sleep.ts @@ -0,0 +1,7 @@ +export function sleep(ms: number) { + // Create new promise that resolves itself after a delay of + return new Promise((resolve: (args: void) => void) => + setTimeout(resolve, ms) + ); +} + From df1d6a0c93655d650ed63d76f107194cc6fdad1f Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Tue, 27 Dec 2022 02:31:44 +0000 Subject: [PATCH 086/146] Apply auto formatting changes --- utils/docker.ts | 62 ++++++++++++++++++++++++------------------------- utils/sleep.ts | 1 - 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/utils/docker.ts b/utils/docker.ts index accae05..bf0af35 100644 --- a/utils/docker.ts +++ b/utils/docker.ts @@ -1,31 +1,31 @@ -import fs from "node:fs"; - -//! This code was taken from the package `is-docker` and modified to work here with esm -//! Original repository: https://github.com/sindresorhus/is-docker -let isDockerCached: boolean; - -function hasDockerEnv() { - try { - fs.statSync("/.dockerenv"); - return true; - } catch { - return false; - } -} - -function hasDockerCGroup() { - try { - return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); - } catch { - return false; - } -} - -export function isDocker() { - // TODO: Use `??=` when targeting Node.js 16. - if (isDockerCached === undefined) { - isDockerCached = hasDockerEnv() || hasDockerCGroup(); - } - - return isDockerCached; -} \ No newline at end of file +import fs from "node:fs"; + +//! This code was taken from the package `is-docker` and modified to work here with esm +//! Original repository: https://github.com/sindresorhus/is-docker +let isDockerCached: boolean; + +function hasDockerEnv() { + try { + fs.statSync("/.dockerenv"); + return true; + } catch { + return false; + } +} + +function hasDockerCGroup() { + try { + return fs.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); + } catch { + return false; + } +} + +export function isDocker() { + // TODO: Use `??=` when targeting Node.js 16. + if (isDockerCached === undefined) { + isDockerCached = hasDockerEnv() || hasDockerCGroup(); + } + + return isDockerCached; +} diff --git a/utils/sleep.ts b/utils/sleep.ts index 11e6011..6d492e6 100644 --- a/utils/sleep.ts +++ b/utils/sleep.ts @@ -4,4 +4,3 @@ export function sleep(ms: number) { setTimeout(resolve, ms) ); } - From db672eed3b4e139da18fdc8156d638b0516fdd9e Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 22:42:27 -0600 Subject: [PATCH 087/146] Ingore specific dev commands not allowed on prod --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6ca9203..f740b4e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,8 @@ *.env node_modules unused-commands -d.py/ \ No newline at end of file +d.py/ + +# Ignore specific dev commands not allowed in production +commands/owner/deleteChannels.ts +commands/owner/deleteRoles.ts From e55af2bf96341c972c00a01c63cf5af98c962cb5 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 22:47:20 -0600 Subject: [PATCH 088/146] fix merge issue --- commands/owner/csClassPoll.ts | 3 ++- commands/owner/csCreateChannels.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index 9bea123..4dca363 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -7,7 +7,7 @@ import { import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { checkForRoles } from "../../utils/roles"; +import { checkForRoles, cleanRoleString } from "../../utils/roles"; import { sleep } from "../../utils/sleep"; import { getCourseName } from "../../utils/channels"; @@ -105,3 +105,4 @@ export default { ); }, } as ICommand; + diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 429878e..97684a1 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -211,3 +211,4 @@ export default { ); }, } as ICommand; + From 28a198db94ecba067f59ccef2e7dec27bfb7c253 Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Thu, 29 Dec 2022 04:47:44 +0000 Subject: [PATCH 089/146] Apply auto formatting changes --- commands/owner/csClassPoll.ts | 1 - commands/owner/csCreateChannels.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index 4dca363..788291b 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -105,4 +105,3 @@ export default { ); }, } as ICommand; - diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 97684a1..429878e 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -211,4 +211,3 @@ export default { ); }, } as ICommand; - From 2d9a79e388898dd31bf9ec817227bd824b57896f Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 22:59:58 -0600 Subject: [PATCH 090/146] unused variable --- commands/owner/createRoles.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index fef06b2..c1b0e2a 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -15,7 +15,7 @@ export default { requiredPermissions: ["MANAGE_GUILD", "MANAGE_ROLES"], ownerOnly: true, - callback: async ({ client, interaction: msgInt }) => { + callback: async ({ interaction: msgInt }) => { console.log(chalk.green("Creating roles...")); console.log( chalk.red("------------------------------------------------------") @@ -45,3 +45,4 @@ export default { ); }, } as ICommand; + From 065d0735f57b3c8fa63b75e3a7fcda644dea1c2f Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 23:02:12 -0600 Subject: [PATCH 091/146] used == where should have used === --- utils/channels.ts | 7 ++++--- utils/roles.ts | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/utils/channels.ts b/utils/channels.ts index 7766d4d..1f94ccc 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -17,7 +17,7 @@ export function checkForChannel(guild: Guild, channel_name: string) { export async function findCategory(guild: Guild, category_name: string) { let category = guild.channels.cache.find((category) => { - return category.name == category_name; + return category.name === category_name; }); if (category === undefined || category.type !== "GUILD_CATEGORY") { @@ -62,7 +62,7 @@ export async function moveChannel( if ( channel.parent === null || channel.parent === undefined || - channel.parent?.name != category_name + channel.parent?.name !== category_name ) { const category = await findCategory(guild, category_name); channel.setParent(category); @@ -81,7 +81,8 @@ export function concatCategoryName( category_name: string, category_number: number ) { - return category_number == 0 + return category_number === 0 ? category_name : `${category_name} ${category_number}`; } + diff --git a/utils/roles.ts b/utils/roles.ts index 509d012..f2b674a 100644 --- a/utils/roles.ts +++ b/utils/roles.ts @@ -128,7 +128,7 @@ export async function checkForRoles(guild: Guild): Promise { const name = guild.roles.cache.find((r) => r.name === element.ROLE_NAME); const id = guild.roles.cache.find((r) => r.id === element.ROLE_ID); - if (name == undefined && id == undefined) { + if (name === undefined && id === undefined) { console.log( chalk.red.bold( `Role ${element.ROLE_NAME} does not exist in ${guild.name}, Please run the /createRoles command in that server.` @@ -145,3 +145,4 @@ export async function checkForRoles(guild: Guild): Promise { return true; } } + From 4e47906f09f6c99f87c6d610b3c6e23cf20408c8 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 23:04:11 -0600 Subject: [PATCH 092/146] avoid improper shadowing --- commands/owner/csCreateChannels.ts | 17 +++++++++++------ utils/channels.ts | 11 +++++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index efc7d97..b7be262 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -163,15 +163,17 @@ export default { courses[index].save(); // Ping members who have this role - const role = msgInt.guild.roles.cache.find((role) => { + const found_role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == cleanChannelString(courses[index].CODE) ); }); - if (role !== undefined) { + if (found_role !== undefined) { //Ping member - new_channel.send(`Hey! <@&${role.id}> here is a channel for you!`); + new_channel.send( + `Hey! <@&${found_role.id}> here is a channel for you!` + ); } } else if ( channel.parent !== null && @@ -194,15 +196,17 @@ export default { courses[index].CHANNEL_ID = channel.id; courses[index].save(); // Ping members who have this role - const role = msgInt.guild.roles.cache.find((role) => { + const found_role = msgInt.guild.roles.cache.find((role) => { return ( cleanRoleString(role.name) == cleanChannelString(courses[index].CODE) ); }); - if (role !== undefined) { + if (found_role !== undefined) { //Ping member - channel.send(`Hey! <@&${role.id}> here is the channel for you!`); + channel.send( + `Hey! <@&${found_role.id}> here is the channel for you!` + ); } } else if ( channel.parent !== null && @@ -239,3 +243,4 @@ export default { ); }, } as ICommand; + diff --git a/utils/channels.ts b/utils/channels.ts index 1f94ccc..7768398 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -16,17 +16,20 @@ export function checkForChannel(guild: Guild, channel_name: string) { } export async function findCategory(guild: Guild, category_name: string) { - let category = guild.channels.cache.find((category) => { + let found_category = guild.channels.cache.find((category) => { return category.name === category_name; }); - if (category === undefined || category.type !== "GUILD_CATEGORY") { - category = await guild.channels.create(category_name, { + if ( + found_category === undefined || + found_category.type !== "GUILD_CATEGORY" + ) { + found_category = await guild.channels.create(category_name, { type: "GUILD_CATEGORY", }); } - return category; + return found_category; } export async function createTextChannel( guild: Guild, From 6ad2cc09b9d5eb296faa102b7c4025f643b78181 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 23:13:30 -0600 Subject: [PATCH 093/146] use object literal shorthand. property name is variable name --- utils/channels.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/utils/channels.ts b/utils/channels.ts index 7768398..0669c9c 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -39,11 +39,11 @@ export async function createTextChannel( category_name?: string ) { //Determine which arg to use - let channel_parent: CategoryChannel | undefined; + let parent: CategoryChannel | undefined; if (category !== undefined) { - channel_parent = category; + parent = category; } else if (category_name !== undefined) { - channel_parent = await findCategory(guild, category_name); + parent = await findCategory(guild, category_name); } else { throw Error( "Must specify either channel_category or channel_category_name" @@ -52,8 +52,8 @@ export async function createTextChannel( return guild.channels.create(cleanChannelString(name), { type: "GUILD_TEXT", - topic: topic, - parent: channel_parent, + topic, + parent, }); } From 870f727c12b33a788b11d6f3453aea98b7f1e05e Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 23:17:48 -0600 Subject: [PATCH 094/146] Ignore, no need to return from map --- index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.ts b/index.ts index f0a03fb..93499a2 100644 --- a/index.ts +++ b/index.ts @@ -38,7 +38,7 @@ client.on("ready", async () => { await Promise.all( client.guilds.cache.map((guild) => { - checkForRoles(guild); + checkForRoles(guild); // skipcq JS-0042 }) ); } @@ -95,3 +95,4 @@ process.on("exit", (code) => { console.log("Now exiting..."); console.log(`Exited with status code: ${code}`); }); + From 006d0491d3fbacf54f535217f46b0ffd388792b8 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 28 Dec 2022 23:20:20 -0600 Subject: [PATCH 095/146] remove unnecessary escape characters --- commands/owner/csCreateChannels.ts | 2 +- utils/channels.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index b7be262..5095518 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -36,7 +36,7 @@ function create_default_embed( function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() - .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[`~!@#$%^&*))|+=?;:'",.<>{}[\]\\/]/gi, "") .replace(/[ (]/gi, "-"); return clean_role_name; } diff --git a/utils/channels.ts b/utils/channels.ts index 0669c9c..57cd0c7 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -4,7 +4,7 @@ import chalk from "chalk"; export function cleanChannelString(s: string): string { return s .toLowerCase() - .replace(/[`~!@#$%^&*))|+=?;:'",.<>\{\}\[\]\\\/]/gi, "") + .replace(/[`~!@#$%^&*))|+=?;:'",.<>{}[\]\\/]/gi, "") .replace("compsci ", "cs") .replace(/[ (]/gi, "-"); } From 7df1e41b072e8a282461ef20b7a4782fd3b4aebf Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Thu, 29 Dec 2022 05:29:57 +0000 Subject: [PATCH 096/146] Apply auto formatting changes --- commands/owner/createRoles.ts | 1 - commands/owner/csCreateChannels.ts | 1 - index.ts | 1 - utils/channels.ts | 1 - utils/roles.ts | 1 - 5 files changed, 5 deletions(-) diff --git a/commands/owner/createRoles.ts b/commands/owner/createRoles.ts index c1b0e2a..2eec208 100644 --- a/commands/owner/createRoles.ts +++ b/commands/owner/createRoles.ts @@ -45,4 +45,3 @@ export default { ); }, } as ICommand; - diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 5095518..edbac0a 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -243,4 +243,3 @@ export default { ); }, } as ICommand; - diff --git a/index.ts b/index.ts index 93499a2..977d847 100644 --- a/index.ts +++ b/index.ts @@ -95,4 +95,3 @@ process.on("exit", (code) => { console.log("Now exiting..."); console.log(`Exited with status code: ${code}`); }); - diff --git a/utils/channels.ts b/utils/channels.ts index 57cd0c7..2f4e672 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -88,4 +88,3 @@ export function concatCategoryName( ? category_name : `${category_name} ${category_number}`; } - diff --git a/utils/roles.ts b/utils/roles.ts index f2b674a..c447a08 100644 --- a/utils/roles.ts +++ b/utils/roles.ts @@ -145,4 +145,3 @@ export async function checkForRoles(guild: Guild): Promise { return true; } } - From f12b06fe7ed2f793d3a3076006c2e24a5ae858a5 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 3 Jan 2023 21:32:23 -0600 Subject: [PATCH 097/146] Add jest to the project --- jest.config.js | 5 + package-lock.json | 6808 ++++++++++++++++++++++++++++++++++++++++++--- package.json | 10 +- 3 files changed, 6426 insertions(+), 397 deletions(-) create mode 100644 jest.config.js diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..b413e10 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0e45260..d8e1b07 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,293 +19,1677 @@ "typescript": "^4.8.3", "wokcommands": "^1.5.3" }, + "devDependencies": { + "@jest/globals": "^29.3.1", + "jest": "^29.3.1", + "ts-jest": "^29.0.3" + }, "engines": { "node": "17.x" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@discordjs/builders": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", - "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", - "deprecated": "no longer supported", + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, "dependencies": { - "@sapphire/shapeshift": "^3.5.1", - "discord-api-types": "^0.36.2", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.1", - "tslib": "^2.4.0" + "@babel/highlight": "^7.18.6" }, "engines": { - "node": ">=16.9.0" + "node": ">=6.9.0" } }, - "node_modules/@discordjs/builders/node_modules/discord-api-types": { - "version": "0.36.3", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", - "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" - }, - "node_modules/@discordjs/collection": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", - "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==", - "deprecated": "no longer supported", + "node_modules/@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true, "engines": { - "node": ">=16.9.0" + "node": ">=6.9.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@babel/core": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", + "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.7", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@sapphire/async-queue": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", - "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" + "node": ">=6.0.0" } }, - "node_modules/@sapphire/shapeshift": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz", - "integrity": "sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash.uniqwith": "^4.5.0" + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" }, "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" - }, - "node_modules/@types/node": { - "version": "18.7.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz", - "integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/node-fetch/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==", + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" } }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, "dependencies": { - "@types/node": "*" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.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==", - "bin": { - "acorn": "bin/acorn" + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/types": "^7.20.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "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/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/bson": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", - "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", - "dependencies": { - "buffer": "^5.6.0" - }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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.1.13" + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/helpers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", + "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@discordjs/builders": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", + "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", + "deprecated": "no longer supported", + "dependencies": { + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.36.2", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "node_modules/@discordjs/collection": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", + "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==", + "deprecated": "no longer supported", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "dependencies": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz", + "integrity": "sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + }, + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" + }, + "node_modules/@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "18.7.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz", + "integrity": "sha512-XnjpaI8Bgc3eBag2Aw4t2Uj/49lLBSStHWfqKvIuXD7FIrZyMLWp8KuAFHAqxMZYTF9l08N1ctUn9YNybZJVmQ==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", + "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "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==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "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-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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 + }, + "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/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { @@ -313,195 +1697,1434 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "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" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + }, + "node_modules/discord.js": { + "version": "13.10.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.10.3.tgz", + "integrity": "sha512-cIARuxfpQDeqA9Zw3fz4IL20xAhtMsjwJIf7/K82R3n2xROG9/fAx+7qjX8ysp9BfflYqMu2ZskyWq1EAmL5BA==", + "dependencies": { + "@discordjs/builders": "^0.16.0", + "@discordjs/collection": "^0.7.0", + "@sapphire/async-queue": "^1.5.0", + "@types/node-fetch": "^2.6.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "ws": "^8.8.1" + }, + "engines": { + "node": ">=16.6.0", + "npm": ">=7.0.0" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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 + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "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/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "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/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/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">= 0.8" + "node": ">=8" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=6.0" + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "dev": true, + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "node-notifier": { "optional": true } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, "engines": { - "node": ">=0.4.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.3.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.3.1" + }, "engines": { - "node": ">=0.10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" - }, - "node_modules/discord.js": { - "version": "13.10.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.10.3.tgz", - "integrity": "sha512-cIARuxfpQDeqA9Zw3fz4IL20xAhtMsjwJIf7/K82R3n2xROG9/fAx+7qjX8ysp9BfflYqMu2ZskyWq1EAmL5BA==", + "node_modules/jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "dev": true, "dependencies": { - "@discordjs/builders": "^0.16.0", - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.5.0", - "@types/node-fetch": "^2.6.2", - "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "ws": "^8.8.1" + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" }, "engines": { - "node": ">=16.6.0", - "npm": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "node_modules/jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==" - }, - "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/form-data": { + "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">= 6" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, "node_modules/kareem": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "node_modules/lodash.uniqwith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "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/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -521,6 +3144,27 @@ "node": ">= 0.6" } }, + "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/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mongodb": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", @@ -592,6 +3236,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -621,22 +3271,220 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true + }, + "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": "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "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/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "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", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/prettier": { @@ -653,6 +3501,32 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -661,6 +3535,19 @@ "node": ">= 0.6.0" } }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -669,6 +3556,68 @@ "node": ">=6" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", @@ -681,11 +3630,62 @@ "node": ">=6" } }, + "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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/sift": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" }, + "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/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -708,6 +3708,25 @@ "npm": ">= 3.0.0" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -717,6 +3736,93 @@ "memory-pager": "^1.0.2" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -728,6 +3834,59 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", @@ -739,6 +3898,82 @@ "node": ">=12" } }, + "node_modules/ts-jest": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/ts-mixer": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", @@ -791,6 +4026,27 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/typescript": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", @@ -803,6 +4059,32 @@ "node": ">=4.2.0" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -816,6 +4098,45 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -836,14 +4157,65 @@ "node": ">=12" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wokcommands": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/wokcommands/-/wokcommands-1.5.3.tgz", "integrity": "sha512-oBb7ujov8zJ1DYSLz3G7OW9DJK+0l35t/ds5j/2nJ+4DwfzLU7w4i2yXGZOidSHkkygSegiNuaWKfZTP2okJOw==", "dependencies": { - "discord.js": "^13.1.0", - "dotenv": "^8.2.0", - "mongoose": "^6.0.10" + "discord.js": "^13.1.0", + "dotenv": "^8.2.0", + "mongoose": "^6.0.10" + } + }, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/ws": { @@ -866,6 +4238,48 @@ } } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -873,9 +4287,464 @@ "engines": { "node": ">=6" } + }, + "node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true + }, + "@babel/core": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", + "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.7", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz", + "integrity": "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -908,11 +4777,302 @@ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==" }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/reporters": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.2.0", + "jest-config": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-resolve-dependencies": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "jest-watcher": "^29.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + } + }, + "@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "requires": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + } + }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/fake-timers": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + } + }, + "@jest/reporters": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + } + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + } + } + }, + "@jest/test-result": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "dev": true, + "requires": { + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.3.1", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.1" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + } + } + }, + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -941,6 +5101,30 @@ "lodash.uniqwith": "^4.5.0" } }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -961,6 +5145,80 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, + "@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "@types/node": { "version": "18.7.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.15.tgz", @@ -987,6 +5245,18 @@ } } }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, "@types/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -1006,9 +5276,24 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "requires": { - "@types/node": "*" + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", + "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" } }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, "acorn": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", @@ -1019,6 +5304,21 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, + "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" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1027,11 +5327,30 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1046,11 +5365,136 @@ "form-data": "^4.0.0" } }, + "babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "dev": true, + "requires": { + "@jest/transform": "^29.3.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.2.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.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 + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, "bson": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", @@ -1068,6 +5512,30 @@ "ieee754": "^1.1.13" } }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "dev": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1077,6 +5545,47 @@ "supports-color": "^7.1.0" } }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1098,11 +5607,34 @@ "delayed-stream": "~1.0.0" } }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1118,6 +5650,18 @@ } } }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1128,11 +5672,23 @@ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true + }, "discord-api-types": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", @@ -1143,83 +5699,975 @@ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.10.3.tgz", "integrity": "sha512-cIARuxfpQDeqA9Zw3fz4IL20xAhtMsjwJIf7/K82R3n2xROG9/fAx+7qjX8ysp9BfflYqMu2ZskyWq1EAmL5BA==", "requires": { - "@discordjs/builders": "^0.16.0", - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.5.0", - "@types/node-fetch": "^2.6.2", - "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "ws": "^8.8.1" + "@discordjs/builders": "^0.16.0", + "@discordjs/collection": "^0.7.0", + "@sapphire/async-queue": "^1.5.0", + "@types/node-fetch": "^2.6.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "ws": "^8.8.1" + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "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 + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "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==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + }, + "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" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "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 + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "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 + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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 + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "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 + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "dev": true, + "requires": { + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" + } + }, + "jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "p-limit": "^3.1.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dev": true, + "requires": { + "@jest/core": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + } + }, + "jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.3.1", + "@jest/types": "^29.3.1", + "babel-jest": "^29.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.3.1", + "jest-environment-node": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-runner": "^29.3.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" + } + }, + "jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.2.0", + "jest-util": "^29.3.1", + "jest-worker": "^29.3.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true + }, + "jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "dev": true, + "requires": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + } + }, + "jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "dev": true, + "requires": { + "@jest/console": "^29.3.1", + "@jest/environment": "^29.3.1", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.2.0", + "jest-environment-node": "^29.3.1", + "jest-haste-map": "^29.3.1", + "jest-leak-detector": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-resolve": "^29.3.1", + "jest-runtime": "^29.3.1", + "jest-util": "^29.3.1", + "jest-watcher": "^29.3.1", + "jest-worker": "^29.3.1", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + } + }, + "jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "dev": true, + "requires": { + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/globals": "^29.3.1", + "@jest/source-map": "^29.2.0", + "@jest/test-result": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-regex-util": "^29.2.0", + "jest-resolve": "^29.3.1", + "jest-snapshot": "^29.3.1", + "jest-util": "^29.3.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.3.1", + "@jest/transform": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-haste-map": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1", + "natural-compare": "^1.4.0", + "pretty-format": "^29.3.1", + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } }, - "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==" + "jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.2.0", + "leven": "^3.1.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "dev": true, + "requires": { + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.3.1", + "string-length": "^4.0.1" + } }, - "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==", + "jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "has-flag": { + "js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "kareem": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.4.1.tgz", "integrity": "sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==" }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "lodash.uniqwith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, "memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", "optional": true }, + "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 + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1233,6 +6681,21 @@ "mime-db": "1.52.0" } }, + "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 + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "mongodb": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.9.1.tgz", @@ -1286,6 +6749,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -1315,6 +6784,98 @@ } } }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true + }, + "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": "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" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "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" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "path": { "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", @@ -1324,21 +6885,145 @@ "util": "^0.10.3" } }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "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", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, "prettier": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==" }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, "saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", @@ -1348,11 +7033,50 @@ "sparse-bitfield": "^3.0.3" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "sift": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" }, + "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 + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -1367,6 +7091,22 @@ "smart-buffer": "^4.2.0" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -1376,6 +7116,69 @@ "memory-pager": "^1.0.2" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.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" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "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 + }, + "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 + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1384,6 +7187,44 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", @@ -1392,6 +7233,48 @@ "punycode": "^2.1.1" } }, + "ts-jest": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "ts-mixer": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", @@ -1422,11 +7305,33 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "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 + }, "typescript": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==" }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -1440,6 +7345,44 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + } + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -1454,6 +7397,15 @@ "webidl-conversions": "^7.0.0" } }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, "wokcommands": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/wokcommands/-/wokcommands-1.5.3.tgz", @@ -1464,16 +7416,82 @@ "mongoose": "^6.0.10" } }, + "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" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, "ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "requires": {} }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + }, + "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 } } } diff --git a/package.json b/package.json index a7cbbda..34d7017 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "main": "index.ts", "scripts": { "run": "ts-node index.ts", - "format": "prettier --write ." + "format": "prettier --write .", + "test": "jest" }, "repository": { "type": "git", @@ -30,5 +31,10 @@ "ts-node": "^10.5.0", "typescript": "^4.8.3", "wokcommands": "^1.5.3" + }, + "devDependencies": { + "@jest/globals": "^29.3.1", + "jest": "^29.3.1", + "ts-jest": "^29.0.3" } -} +} \ No newline at end of file From 51bf1342fd0fb6ea91814146dd95050cf7945584 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 3 Jan 2023 21:32:39 -0600 Subject: [PATCH 098/146] Add tests for cleanChannelString --- __tests__/utils/channels.tests.ts | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 __tests__/utils/channels.tests.ts diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts new file mode 100644 index 0000000..a62c05a --- /dev/null +++ b/__tests__/utils/channels.tests.ts @@ -0,0 +1,33 @@ +import { cleanChannelString } from "../../utils/channels"; +import { test, expect, describe, it } from "@jest/globals"; + +//cleanChannelString + +describe("cleanChannelString", () => { + it("should lowercase the string", () => { + expect(cleanChannelString("ABCD")).toEqual("abcd"); + }); + + it("should remove special characters", () => { + expect(cleanChannelString("a!b@c#d$")).toEqual("abcd"); + }); + + it('should replace "compsci " with "cs"', () => { + expect(cleanChannelString("compsci")).toEqual("cs"); + }); + + it("should replace spaces and parentheses with hyphens", () => { + expect(cleanChannelString("a b (c)")).toEqual("a-b-c"); + }); + it("should return an empty string for an empty input", () => { + expect(cleanChannelString("")).toBe(""); + }); + + it("cleanChannelString should return an empty string for a string with only special characters", () => { + expect(cleanChannelString("!@#$%^&*")).toBe(""); + }); + + it("should handle a mix of all transformations", () => { + expect(cleanChannelString("Compsci 123!")).toEqual("cs-123"); + }); +}); From ca8e24f0fcc695769728916d82a62fbf6430b19d Mon Sep 17 00:00:00 2001 From: Nate Goldsborough Date: Wed, 4 Jan 2023 12:28:12 -0600 Subject: [PATCH 099/146] Prevent error when statuspage env vars are not set --- features/statuspage.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/features/statuspage.ts b/features/statuspage.ts index 299f149..e67631f 100644 --- a/features/statuspage.ts +++ b/features/statuspage.ts @@ -5,6 +5,7 @@ import { isDocker } from "../utils/docker"; export default (client: Client): void => { // Check if the bot is running in a docker container by checking if the env variable UPTIME_KUMA_CONTAINERIZED is true if (isDocker()) return; + if (!process.env.UPTIME_KUMA_MONITOR_DOMAIN || !process.env.UPTIME_KUMA_MONITOR_ID) return; const updateStatus = async () => { // This function is called every 1 minutes and pings the network status page for uptime monitoring await axios.get( From c00be5e31045ee2c4870c71cda15ed2a1db866d2 Mon Sep 17 00:00:00 2001 From: nathen418 Date: Wed, 4 Jan 2023 18:48:02 +0000 Subject: [PATCH 100/146] Apply auto formatting changes --- features/statuspage.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/features/statuspage.ts b/features/statuspage.ts index e67631f..3663611 100644 --- a/features/statuspage.ts +++ b/features/statuspage.ts @@ -5,7 +5,11 @@ import { isDocker } from "../utils/docker"; export default (client: Client): void => { // Check if the bot is running in a docker container by checking if the env variable UPTIME_KUMA_CONTAINERIZED is true if (isDocker()) return; - if (!process.env.UPTIME_KUMA_MONITOR_DOMAIN || !process.env.UPTIME_KUMA_MONITOR_ID) return; + if ( + !process.env.UPTIME_KUMA_MONITOR_DOMAIN || + !process.env.UPTIME_KUMA_MONITOR_ID + ) + return; const updateStatus = async () => { // This function is called every 1 minutes and pings the network status page for uptime monitoring await axios.get( From 63463bda5e623a8bf6edc8b7becde8be53db3927 Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Wed, 4 Jan 2023 20:00:14 +0000 Subject: [PATCH 101/146] Apply auto formatting changes --- __tests__/utils/channels.tests.ts | 66 +++++++++++++++---------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index a62c05a..32abb02 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -1,33 +1,33 @@ -import { cleanChannelString } from "../../utils/channels"; -import { test, expect, describe, it } from "@jest/globals"; - -//cleanChannelString - -describe("cleanChannelString", () => { - it("should lowercase the string", () => { - expect(cleanChannelString("ABCD")).toEqual("abcd"); - }); - - it("should remove special characters", () => { - expect(cleanChannelString("a!b@c#d$")).toEqual("abcd"); - }); - - it('should replace "compsci " with "cs"', () => { - expect(cleanChannelString("compsci")).toEqual("cs"); - }); - - it("should replace spaces and parentheses with hyphens", () => { - expect(cleanChannelString("a b (c)")).toEqual("a-b-c"); - }); - it("should return an empty string for an empty input", () => { - expect(cleanChannelString("")).toBe(""); - }); - - it("cleanChannelString should return an empty string for a string with only special characters", () => { - expect(cleanChannelString("!@#$%^&*")).toBe(""); - }); - - it("should handle a mix of all transformations", () => { - expect(cleanChannelString("Compsci 123!")).toEqual("cs-123"); - }); -}); +import { cleanChannelString } from "../../utils/channels"; +import { test, expect, describe, it } from "@jest/globals"; + +//cleanChannelString + +describe("cleanChannelString", () => { + it("should lowercase the string", () => { + expect(cleanChannelString("ABCD")).toEqual("abcd"); + }); + + it("should remove special characters", () => { + expect(cleanChannelString("a!b@c#d$")).toEqual("abcd"); + }); + + it('should replace "compsci " with "cs"', () => { + expect(cleanChannelString("compsci")).toEqual("cs"); + }); + + it("should replace spaces and parentheses with hyphens", () => { + expect(cleanChannelString("a b (c)")).toEqual("a-b-c"); + }); + it("should return an empty string for an empty input", () => { + expect(cleanChannelString("")).toBe(""); + }); + + it("cleanChannelString should return an empty string for a string with only special characters", () => { + expect(cleanChannelString("!@#$%^&*")).toBe(""); + }); + + it("should handle a mix of all transformations", () => { + expect(cleanChannelString("Compsci 123!")).toEqual("cs-123"); + }); +}); From 3b95e711583b9eedc5379b36784e79c84a5d6c93 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 4 Jan 2023 22:56:23 -0600 Subject: [PATCH 102/146] update tests to reflect cleanChannelString --- __tests__/utils/channels.tests.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index 32abb02..c71a90b 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -1,5 +1,5 @@ import { cleanChannelString } from "../../utils/channels"; -import { test, expect, describe, it } from "@jest/globals"; +import { expect, describe, it } from "@jest/globals"; //cleanChannelString @@ -13,7 +13,7 @@ describe("cleanChannelString", () => { }); it('should replace "compsci " with "cs"', () => { - expect(cleanChannelString("compsci")).toEqual("cs"); + expect(cleanChannelString("compsci ")).toEqual("cs"); }); it("should replace spaces and parentheses with hyphens", () => { @@ -28,6 +28,7 @@ describe("cleanChannelString", () => { }); it("should handle a mix of all transformations", () => { - expect(cleanChannelString("Compsci 123!")).toEqual("cs-123"); + expect(cleanChannelString("Compsci a%$ 123!")).toEqual("csa-123"); }); }); + From 545b98c76a640c446e962ef1e6183367049021b1 Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Thu, 5 Jan 2023 04:57:05 +0000 Subject: [PATCH 103/146] Apply auto formatting changes --- __tests__/utils/channels.tests.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index c71a90b..ad1eb7f 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -31,4 +31,3 @@ describe("cleanChannelString", () => { expect(cleanChannelString("Compsci a%$ 123!")).toEqual("csa-123"); }); }); - From 4f8280c2384df6c99778d8a5a88ff0c05238feb1 Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Thu, 5 Jan 2023 05:02:47 +0000 Subject: [PATCH 104/146] Apply auto formatting changes --- utils/channels.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/channels.ts b/utils/channels.ts index 7aa610f..b6b8eda 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -97,4 +97,3 @@ export function concatCategoryName( ? category_name : `${category_name} ${category_number}`; } - From 5fd5bcb25ab0a2058625fc3c5424c526297fe774 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 4 Jan 2023 23:15:38 -0600 Subject: [PATCH 105/146] remove incorrect tests , fix broken ones, and add new tests to reflect updates --- __tests__/utils/channels.tests.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index ad1eb7f..a1d747d 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -12,13 +12,14 @@ describe("cleanChannelString", () => { expect(cleanChannelString("a!b@c#d$")).toEqual("abcd"); }); - it('should replace "compsci " with "cs"', () => { - expect(cleanChannelString("compsci ")).toEqual("cs"); + it("should replace whitespace with a hyphen", () => { + expect(cleanChannelString("a b c")).toEqual("a-b-c"); }); - it("should replace spaces and parentheses with hyphens", () => { - expect(cleanChannelString("a b (c)")).toEqual("a-b-c"); + it("should remove consecutive hyphens", () => { + expect(cleanChannelString("a--b--c")).toBe("a-b-c"); }); + it("should return an empty string for an empty input", () => { expect(cleanChannelString("")).toBe(""); }); @@ -27,7 +28,8 @@ describe("cleanChannelString", () => { expect(cleanChannelString("!@#$%^&*")).toBe(""); }); - it("should handle a mix of all transformations", () => { - expect(cleanChannelString("Compsci a%$ 123!")).toEqual("csa-123"); + it("should truncate the string to 100 characters", () => { + expect(cleanChannelString("a".repeat(200))).toHaveLength(100); }); }); + From 89fe7080494c49048ed271bdd5b0bad82baad7d9 Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Thu, 5 Jan 2023 05:16:06 +0000 Subject: [PATCH 106/146] Apply auto formatting changes --- __tests__/utils/channels.tests.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index a1d747d..d67565f 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -32,4 +32,3 @@ describe("cleanChannelString", () => { expect(cleanChannelString("a".repeat(200))).toHaveLength(100); }); }); - From cf098085227e4774f6caa740f9e571df81c17482 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Wed, 4 Jan 2023 23:32:06 -0600 Subject: [PATCH 107/146] deepsource --- commands/owner/migrateDB.ts | 18 +++++++++--------- utils/channels.ts | 2 +- utils/roles.ts | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index a8fc3fb..141b68a 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -15,7 +15,7 @@ function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs").trim(); } function cleanCompSciTitle(s: string): string { - return s.replace(/(advanced )?topics in computer science:/gim, "").trim(); + return s.replace(/(?<>advanced )?topics in computer science:/gim, "").trim(); } function isDupe(name: string): number { return name.search(/\(\d\)/); @@ -59,12 +59,12 @@ export default { const course = courses[index]; // Remove CODE and replace with NAME const code = course.get("CODE"); - if (code != undefined) { + if (code !== undefined) { let new_name = code; console.log(`Name: ${code}`); const is_dupe = isDupe(new_name); // Add field determining if it is a duplicate - if (is_dupe == -1) { + if (is_dupe === -1) { // Not a dupe course.set("DUPE", "false"); } else { @@ -88,17 +88,17 @@ export default { course.ROLE_NAME = cleanRoleString(getCourseName(course)); // REMOVE UUID - if (course.get("UUID") != undefined) { + if (course.get("UUID") !== undefined) { course.set("UUID", undefined); } //UPDATE CHANNEL if (course.CHANNEL_ID) { const channel = msgInt.guild.channels.cache.get(course.CHANNEL_ID); - if (channel != undefined && channel.type == "GUILD_TEXT") { + if (channel !== undefined && channel.type === "GUILD_TEXT") { const new_name = cleanChannelString(getCourseName(course)); //Update Channel Name - if (new_name != channel.name) { + if (new_name !== channel.name) { console.log(chalk.yellow(`Old channel name: ${channel.name}`)); await limiter .schedule(() => channel.setName(new_name)) @@ -111,7 +111,7 @@ export default { } //Update Channel Topic const new_topic = getTopic(courses[index]); - if (`${channel.topic}` != new_topic) { + if (`${channel.topic}` !== new_topic) { console.log(chalk.yellow(`Channel's old topic: ${channel.topic}`)); await limiter .schedule(() => channel.setTopic(new_topic)) @@ -128,9 +128,9 @@ export default { //UPDATE ROLE if (course.ROLE_ID) { const role = msgInt.guild.roles.cache.get(course.ROLE_ID); - if (role != undefined) { + if (role !== undefined) { const new_name = cleanRoleString(getCourseName(course)); - if (role.name != new_name) { + if (role.name !== new_name) { console.log(chalk.yellow(`Role's old name: ${role.name}`)); await limiter .schedule(() => role.setName(new_name)) diff --git a/utils/channels.ts b/utils/channels.ts index b6b8eda..15be053 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -15,7 +15,7 @@ export function getTopic(course: IClass) { return `${course.TITLE} | ${course.INFO}`.slice(1024); } export function getCourseName(course: IClass) { - return course.DUPE == true ? `${course.NAME}-${course.TITLE}` : course.NAME; + return course.DUPE === true ? `${course.NAME}-${course.TITLE}` : course.NAME; } export function checkForChannel(guild: Guild, channel_name: string) { diff --git a/utils/roles.ts b/utils/roles.ts index 2f6fd56..5e30b23 100644 --- a/utils/roles.ts +++ b/utils/roles.ts @@ -13,7 +13,7 @@ export interface IRole { export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() - .replace(/[`~!@#$%^&*()|+=?;:'",.<>\{\}\[\]\\\/\n]+/gi, "") + .replace(/[`~!@#$%^&*()|+=?;:'",.<>{}[\]\\/\n]+/gi, "") .replace(/\s+/gi, "-") .replace(/-{2,}/gi, "-") .slice(0, 100); @@ -100,7 +100,7 @@ export async function createRoles( for (let index = 0; index < role_docs.length; index++) { const role_doc = role_docs[index]; if ( - guild.roles.cache.find((r) => r.name === role_doc.ROLE_NAME) == undefined + guild.roles.cache.find((r) => r.name === role_doc.ROLE_NAME) === undefined ) { // Create the role const role = await guild.roles.create({ @@ -114,7 +114,7 @@ export async function createRoles( } else { // If the role already exists, print the id to the console const role = guild.roles.cache.find((r) => r.name === role_doc.ROLE_NAME); - if (role == undefined) { + if (role === undefined) { continue; } const id = role.id; From 6f82202bce82601259e28697be9e6f8fbfc54f9d Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 5 Jan 2023 12:05:08 -0600 Subject: [PATCH 108/146] Deepsource --- commands/owner/migrateDB.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/commands/owner/migrateDB.ts b/commands/owner/migrateDB.ts index 141b68a..7d81a6c 100644 --- a/commands/owner/migrateDB.ts +++ b/commands/owner/migrateDB.ts @@ -115,9 +115,9 @@ export default { console.log(chalk.yellow(`Channel's old topic: ${channel.topic}`)); await limiter .schedule(() => channel.setTopic(new_topic)) - .then((channel) => { + .then((print_channel) => { console.log( - chalk.blue(`Channel's new topic: ${channel.topic}`) + chalk.blue(`Channel's new topic: ${print_channel.topic}`) ); }) .catch(console.error); @@ -134,8 +134,8 @@ export default { console.log(chalk.yellow(`Role's old name: ${role.name}`)); await limiter .schedule(() => role.setName(new_name)) - .then((role) => { - console.log(chalk.blue(`Role's new name: ${role.name}`)); + .then((print_role) => { + console.log(chalk.blue(`Role's new name: ${print_role.name}`)); }) .catch(console.error); await role.setName(new_name); From ab130520ac7f7044c261d8a253c02c06c0d099bc Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 5 Jan 2023 12:48:11 -0600 Subject: [PATCH 109/146] use === instead of == --- commands/owner/csCreateChannels.ts | 8 ++++---- utils/channels.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index edbac0a..e2b3fe9 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -93,9 +93,9 @@ export default { const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { const match = cleaned_courses.find((course) => { - return course == children[index].name; + return course === children[index].name; }); - if (match != undefined) { + if (match !== undefined) { continue; } console.log(`Moving: ${children[index]} to: ${cs_past_category_name}`); @@ -165,7 +165,7 @@ export default { // Ping members who have this role const found_role = msgInt.guild.roles.cache.find((role) => { return ( - cleanRoleString(role.name) == + cleanRoleString(role.name) === cleanChannelString(courses[index].CODE) ); }); @@ -198,7 +198,7 @@ export default { // Ping members who have this role const found_role = msgInt.guild.roles.cache.find((role) => { return ( - cleanRoleString(role.name) == + cleanRoleString(role.name) === cleanChannelString(courses[index].CODE) ); }); diff --git a/utils/channels.ts b/utils/channels.ts index 2f4e672..922954e 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -11,7 +11,7 @@ export function cleanChannelString(s: string): string { export function checkForChannel(guild: Guild, channel_name: string) { return guild.channels.cache.find((channel) => { - return channel.name == channel_name; + return channel.name === channel_name; }); } From cfb8b86cb45188c2921167cedd550c5d18923f32 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Thu, 5 Jan 2023 12:48:29 -0600 Subject: [PATCH 110/146] Move ignore comment --- index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.ts b/index.ts index 977d847..938ae0d 100644 --- a/index.ts +++ b/index.ts @@ -37,8 +37,9 @@ client.on("ready", async () => { console.log("Checking if all roles exist in servers."); await Promise.all( + // skipcq JS-0042 client.guilds.cache.map((guild) => { - checkForRoles(guild); // skipcq JS-0042 + checkForRoles(guild); }) ); } From d103b7c111743344431ff0a5fbc3d96f9e604a2f Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 6 Jan 2023 19:24:36 -0600 Subject: [PATCH 111/146] rename and add jsdoc --- commands/owner/csClassPoll.ts | 1 + commands/owner/csCreateChannels.ts | 6 +-- utils/channels.ts | 63 ++++++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/commands/owner/csClassPoll.ts b/commands/owner/csClassPoll.ts index 788291b..65fbe4b 100644 --- a/commands/owner/csClassPoll.ts +++ b/commands/owner/csClassPoll.ts @@ -12,6 +12,7 @@ import { sleep } from "../../utils/sleep"; import { getCourseName } from "../../utils/channels"; // Splits any size list into lists of at most `max_list_len` +/** */ function split_list(list: T[], max_list_len: number): T[][] { const class_chunks: T[][] = []; for (let i = 0; i < list.length; i += max_list_len) { diff --git a/commands/owner/csCreateChannels.ts b/commands/owner/csCreateChannels.ts index 95e2449..5592933 100644 --- a/commands/owner/csCreateChannels.ts +++ b/commands/owner/csCreateChannels.ts @@ -5,7 +5,7 @@ import { checkForChannel, cleanChannelString, createTextChannel, - findCategory, + getCategory, moveChannel, concatCategoryName, } from "../../utils/channels"; @@ -90,7 +90,7 @@ export default { ); let category = await ( - await findCategory( + await getCategory( msgInt.guild, concatCategoryName(category_name, category_number) ) @@ -100,7 +100,7 @@ export default { if (category.children.size >= max_category_size - 1) { ++category_number; category = await ( - await findCategory( + await getCategory( msgInt.guild, concatCategoryName(category_name, category_number) ) diff --git a/utils/channels.ts b/utils/channels.ts index 3e445a7..910c9a2 100644 --- a/utils/channels.ts +++ b/utils/channels.ts @@ -11,20 +11,50 @@ export function cleanChannelString(s: string): string { .slice(0, 100); return s_new; } +/** + * @description + * @author John Schiltz + * @export + * @param course + * @return {*} + */ export function getTopic(course: IClass) { return `${course.TITLE} | ${course.INFO}`.slice(1024); } +/** + * @description - Gets the course name, if it is a duplicate, it adds the title to the end of the name + * @author John Schiltz + * @export + * @param course + * @return - The course name + */ export function getCourseName(course: IClass) { return course.DUPE === true ? `${course.NAME}-${course.TITLE}` : course.NAME; } +/** + * @description - Checks if a channel exists in the guild + * @author John Schiltz + * @export + * @param guild + * @param channel_name + * @return - The channel if it exists, undefined if it doesn't + */ export function checkForChannel(guild: Guild, channel_name: string) { return guild.channels.cache.find((channel) => { return channel.name === channel_name; }); } -export async function findCategory(guild: Guild, category_name: string) { +/** + * @description Gets a category from the guild, if it doesn't exist, it creates it + * @auther John Schiltz` + * @export + * @param guild + * @param category_name + * @return - The category channel + */ +export async function getCategory(guild: Guild, category_name: string) { let found_category = guild.channels.cache.find((category) => { return category.name === category_name; }); @@ -40,6 +70,17 @@ export async function findCategory(guild: Guild, category_name: string) { return found_category; } + +/** + * @description Creates and returns a new text channel + * @auther John Schiltz + * @param guild + * @param name + * @param topic + * @param category + * @param category_name - Will create new channel if it doesn't exist + * @returns - The newly created channel + */ export async function createTextChannel( guild: Guild, name: string, @@ -52,7 +93,7 @@ export async function createTextChannel( if (category !== undefined) { parent = category; } else if (category_name !== undefined) { - parent = await findCategory(guild, category_name); + parent = await getCategory(guild, category_name); } else { throw Error( "Must specify either channel_category or channel_category_name" @@ -66,6 +107,14 @@ export async function createTextChannel( }); } +/** + * @description - Moves a channel to a category, if it is already in the category, it does nothing + * @author John Schiltz + * @param guild + * @param channel + * @param category_name + * @returns 1 if channel was moved, 0 if it was already in the correct category + */ export async function moveChannel( guild: Guild, channel: GuildChannel, @@ -76,7 +125,7 @@ export async function moveChannel( channel.parent === undefined || channel.parent?.name !== category_name ) { - const category = await findCategory(guild, category_name); + const category = await getCategory(guild, category_name); channel.setParent(category); console.log( @@ -89,6 +138,14 @@ export async function moveChannel( return 0; } +/** + * @description - Concatenates the category name with the category number + * @author John Schiltz + * @export + * @param category_name + * @param category_number + * @return - The concatenated category name + */ export function concatCategoryName( category_name: string, category_number: number From a9fc2259e86c5dc21a3f629c0acd2cd321f79ff8 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sun, 8 Jan 2023 00:20:10 -0600 Subject: [PATCH 112/146] move all files to src --- __tests__/utils/channels.tests.ts | 2 +- {commands => src/commands}/owner/createRoles.ts | 0 {commands => src/commands}/owner/csClassPoll.ts | 0 {commands => src/commands}/owner/csCreateChannels.ts | 0 {commands => src/commands}/owner/say.ts | 0 {commands => src/commands}/owner/staffPoll.ts | 0 {commands => src/commands}/owner/yearPoll.ts | 0 {commands => src/commands}/user/clear.ts | 0 {commands => src/commands}/user/github.ts | 0 {commands => src/commands}/user/help.ts | 0 {commands => src/commands}/user/ping.ts | 0 {commands => src/commands}/user/status.ts | 0 {commands => src/commands}/user/uptime.ts | 0 {commands => src/commands}/user/version.ts | 0 {commands => src/commands}/user/view.ts | 0 {features => src/features}/interactionCreate.ts | 0 {features => src/features}/status-changer.ts | 0 {features => src/features}/statuspage.ts | 0 index.ts => src/index.ts | 0 {models => src/models}/classModel.ts | 0 {models => src/models}/staffModel.ts | 0 {models => src/models}/yearModel.ts | 0 {utils => src/utils}/channels.ts | 0 {utils => src/utils}/docker.ts | 0 {utils => src/utils}/roles.ts | 0 {utils => src/utils}/sleep.ts | 0 26 files changed, 1 insertion(+), 1 deletion(-) rename {commands => src/commands}/owner/createRoles.ts (100%) rename {commands => src/commands}/owner/csClassPoll.ts (100%) rename {commands => src/commands}/owner/csCreateChannels.ts (100%) rename {commands => src/commands}/owner/say.ts (100%) rename {commands => src/commands}/owner/staffPoll.ts (100%) rename {commands => src/commands}/owner/yearPoll.ts (100%) rename {commands => src/commands}/user/clear.ts (100%) rename {commands => src/commands}/user/github.ts (100%) rename {commands => src/commands}/user/help.ts (100%) rename {commands => src/commands}/user/ping.ts (100%) rename {commands => src/commands}/user/status.ts (100%) rename {commands => src/commands}/user/uptime.ts (100%) rename {commands => src/commands}/user/version.ts (100%) rename {commands => src/commands}/user/view.ts (100%) rename {features => src/features}/interactionCreate.ts (100%) rename {features => src/features}/status-changer.ts (100%) rename {features => src/features}/statuspage.ts (100%) rename index.ts => src/index.ts (100%) rename {models => src/models}/classModel.ts (100%) rename {models => src/models}/staffModel.ts (100%) rename {models => src/models}/yearModel.ts (100%) rename {utils => src/utils}/channels.ts (100%) rename {utils => src/utils}/docker.ts (100%) rename {utils => src/utils}/roles.ts (100%) rename {utils => src/utils}/sleep.ts (100%) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index ad1eb7f..d2ec44d 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -1,4 +1,4 @@ -import { cleanChannelString } from "../../utils/channels"; +import { cleanChannelString } from "../../src/utils/channels"; import { expect, describe, it } from "@jest/globals"; //cleanChannelString diff --git a/commands/owner/createRoles.ts b/src/commands/owner/createRoles.ts similarity index 100% rename from commands/owner/createRoles.ts rename to src/commands/owner/createRoles.ts diff --git a/commands/owner/csClassPoll.ts b/src/commands/owner/csClassPoll.ts similarity index 100% rename from commands/owner/csClassPoll.ts rename to src/commands/owner/csClassPoll.ts diff --git a/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts similarity index 100% rename from commands/owner/csCreateChannels.ts rename to src/commands/owner/csCreateChannels.ts diff --git a/commands/owner/say.ts b/src/commands/owner/say.ts similarity index 100% rename from commands/owner/say.ts rename to src/commands/owner/say.ts diff --git a/commands/owner/staffPoll.ts b/src/commands/owner/staffPoll.ts similarity index 100% rename from commands/owner/staffPoll.ts rename to src/commands/owner/staffPoll.ts diff --git a/commands/owner/yearPoll.ts b/src/commands/owner/yearPoll.ts similarity index 100% rename from commands/owner/yearPoll.ts rename to src/commands/owner/yearPoll.ts diff --git a/commands/user/clear.ts b/src/commands/user/clear.ts similarity index 100% rename from commands/user/clear.ts rename to src/commands/user/clear.ts diff --git a/commands/user/github.ts b/src/commands/user/github.ts similarity index 100% rename from commands/user/github.ts rename to src/commands/user/github.ts diff --git a/commands/user/help.ts b/src/commands/user/help.ts similarity index 100% rename from commands/user/help.ts rename to src/commands/user/help.ts diff --git a/commands/user/ping.ts b/src/commands/user/ping.ts similarity index 100% rename from commands/user/ping.ts rename to src/commands/user/ping.ts diff --git a/commands/user/status.ts b/src/commands/user/status.ts similarity index 100% rename from commands/user/status.ts rename to src/commands/user/status.ts diff --git a/commands/user/uptime.ts b/src/commands/user/uptime.ts similarity index 100% rename from commands/user/uptime.ts rename to src/commands/user/uptime.ts diff --git a/commands/user/version.ts b/src/commands/user/version.ts similarity index 100% rename from commands/user/version.ts rename to src/commands/user/version.ts diff --git a/commands/user/view.ts b/src/commands/user/view.ts similarity index 100% rename from commands/user/view.ts rename to src/commands/user/view.ts diff --git a/features/interactionCreate.ts b/src/features/interactionCreate.ts similarity index 100% rename from features/interactionCreate.ts rename to src/features/interactionCreate.ts diff --git a/features/status-changer.ts b/src/features/status-changer.ts similarity index 100% rename from features/status-changer.ts rename to src/features/status-changer.ts diff --git a/features/statuspage.ts b/src/features/statuspage.ts similarity index 100% rename from features/statuspage.ts rename to src/features/statuspage.ts diff --git a/index.ts b/src/index.ts similarity index 100% rename from index.ts rename to src/index.ts diff --git a/models/classModel.ts b/src/models/classModel.ts similarity index 100% rename from models/classModel.ts rename to src/models/classModel.ts diff --git a/models/staffModel.ts b/src/models/staffModel.ts similarity index 100% rename from models/staffModel.ts rename to src/models/staffModel.ts diff --git a/models/yearModel.ts b/src/models/yearModel.ts similarity index 100% rename from models/yearModel.ts rename to src/models/yearModel.ts diff --git a/utils/channels.ts b/src/utils/channels.ts similarity index 100% rename from utils/channels.ts rename to src/utils/channels.ts diff --git a/utils/docker.ts b/src/utils/docker.ts similarity index 100% rename from utils/docker.ts rename to src/utils/docker.ts diff --git a/utils/roles.ts b/src/utils/roles.ts similarity index 100% rename from utils/roles.ts rename to src/utils/roles.ts diff --git a/utils/sleep.ts b/src/utils/sleep.ts similarity index 100% rename from utils/sleep.ts rename to src/utils/sleep.ts From f88849de06926184cf613b9f5d777d11aab4e822 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sun, 8 Jan 2023 00:28:03 -0600 Subject: [PATCH 113/146] point to index --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5864e01..2aabb4a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,6 @@ COPY . . RUN npm install -g typescript ts-node -CMD [ "ts-node", "index.ts" ] +CMD [ "ts-node", "src/index.ts" ] LABEL org.opencontainers.image.source="https://github.com/Antares-Network/CSSC-Bot" \ No newline at end of file From 9761ccf31abdd52db16c075180f5398961830c41 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Mon, 9 Jan 2023 02:16:41 -0600 Subject: [PATCH 114/146] update run command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 34d7017..6963f43 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "description": "", "main": "index.ts", "scripts": { - "run": "ts-node index.ts", + "run": "ts-node src/index.ts", "format": "prettier --write .", "test": "jest" }, From aaf5b575568f644032df3579c51a08966ba7e6f4 Mon Sep 17 00:00:00 2001 From: John Schiltz <45466247+schiltz3@users.noreply.github.com> Date: Mon, 9 Jan 2023 23:30:56 -0600 Subject: [PATCH 115/146] fix typo --- src/utils/channels.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/channels.ts b/src/utils/channels.ts index 910c9a2..7b45a9b 100644 --- a/src/utils/channels.ts +++ b/src/utils/channels.ts @@ -48,7 +48,7 @@ export function checkForChannel(guild: Guild, channel_name: string) { /** * @description Gets a category from the guild, if it doesn't exist, it creates it - * @auther John Schiltz` + * @author John Schiltz * @export * @param guild * @param category_name @@ -73,7 +73,7 @@ export async function getCategory(guild: Guild, category_name: string) { /** * @description Creates and returns a new text channel - * @auther John Schiltz + * @author John Schiltz * @param guild * @param name * @param topic From 2b7632ec43ba07b3f141b1358337ec435226864b Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 10 Jan 2023 01:31:29 -0600 Subject: [PATCH 116/146] fix getTopic --- src/utils/channels.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/channels.ts b/src/utils/channels.ts index 7b45a9b..eae8e92 100644 --- a/src/utils/channels.ts +++ b/src/utils/channels.ts @@ -18,8 +18,8 @@ export function cleanChannelString(s: string): string { * @param course * @return {*} */ -export function getTopic(course: IClass) { - return `${course.TITLE} | ${course.INFO}`.slice(1024); +export function getTopic(course: IClass): string { + return `${course.TITLE} | ${course.INFO}`.slice(0, 1024); } /** * @description - Gets the course name, if it is a duplicate, it adds the title to the end of the name From e7a660ef62a72589127efd2681f4581d40396c02 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 10 Jan 2023 01:31:43 -0600 Subject: [PATCH 117/146] Add tests --- __tests__/utils/channels.tests.ts | 121 +++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 3 deletions(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index 9a3fadc..2c34af8 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -1,8 +1,15 @@ -import { cleanChannelString } from "../../src/utils/channels"; -import { expect, describe, it } from "@jest/globals"; +import { + cleanChannelString, + concatCategoryName, + moveChannel, + getCourseName, + getTopic, +} from "../../src/utils/channels"; +import { expect, describe, it, beforeEach } from "@jest/globals"; +import { Guild, GuildChannel } from "discord.js"; +import { IClass } from "../../src/models/classModel"; //cleanChannelString - describe("cleanChannelString", () => { it("should lowercase the string", () => { expect(cleanChannelString("ABCD")).toEqual("abcd"); @@ -32,3 +39,111 @@ describe("cleanChannelString", () => { expect(cleanChannelString("a".repeat(200))).toHaveLength(100); }); }); + +describe("getTopic", () => { + const default_string = "This is a test"; + let course: IClass = { + TITLE: default_string, + INFO: default_string, + id: default_string, + NAME: default_string, + DUPE: false, + ROLE_NAME: default_string, + ROLE_ID: default_string, + CHANNEL_ID: default_string, + }; + const extra_characters: number = 3; + beforeEach(() => { + course = { + TITLE: default_string, + INFO: default_string, + id: default_string, + NAME: default_string, + DUPE: false, + ROLE_NAME: default_string, + ROLE_ID: default_string, + CHANNEL_ID: default_string, + }; + }); + + it("should return a truncated string of the concatenated title and info", () => { + course.TITLE = "Introduction to Mathematics"; + expect(getTopic(course)).toHaveLength( + course.TITLE.length + course.INFO.length + extra_characters + ); + }); + + it("should not return a string longer than 1024 characters", () => { + course.TITLE = "a".repeat(600); + course.INFO = "b".repeat(600); + expect(getTopic(course)).toHaveLength(1024); + }); + + it("should return a string of length 1024 if TITLE is 1025 characters", () => { + course.TITLE = "a".repeat(1025); + course.INFO = ""; + expect(getTopic(course)).toHaveLength(1024); + }); + + it("should return a string of length 1024 if INFO is 1025 characters", () => { + course.TITLE = ""; + course.INFO = "b".repeat(1025); + expect(getTopic(course)).toHaveLength(1024); + }); +}); + +// getCourseName +describe("getCourseName", () => { + const default_string = "This is a test"; + it("should return the course name if DUPE is false", () => { + const course: IClass = { + id: default_string, + NAME: "Math 101", + TITLE: "Introduction to Mathematics", + INFO: default_string, + DUPE: false, + ROLE_NAME: default_string, + ROLE_ID: default_string, + CHANNEL_ID: default_string, + }; + expect(getCourseName(course)).toBe("Math 101"); + }); + + it("should return the concatenated course name and title if DUPE is true", () => { + const course: IClass = { + id: default_string, + NAME: "Math 101", + TITLE: "Introduction to Mathematics", + INFO: default_string, + DUPE: true, + ROLE_NAME: default_string, + ROLE_ID: default_string, + CHANNEL_ID: default_string, + }; + expect(getCourseName(course)).toBe("Math 101-Introduction to Mathematics"); + }); +}); + +//concatCategoryName +describe("concatCategoryName", () => { + it("should return the category name if the category number is 0", () => { + expect(concatCategoryName("abcd", 0)).toBe("abcd"); + }); + + it("should return the category name and number if the category number is not 0", () => { + expect(concatCategoryName("abcd", 1)).toBe("abcd 1"); + }); +}); + +//moveChannel +// Can only test pure functionality +describe("moveChannel", () => { + it("should not move the channel if it is already in the specified category", async () => { + // Set up the test so that the channel is already in the specified category + const guild = {} as Guild; + const category_name = "abcd"; + const channel = { parent: { name: category_name } } as GuildChannel; + // Ensure that the channel was not moved + expect(await moveChannel(guild, channel, category_name)).toBe(0); + }); +}); From e5f8073b2d0ffa2ba7e3b26a3c79e85a1eceac1d Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 10 Jan 2023 01:35:25 -0600 Subject: [PATCH 118/146] move migrateDB to the new folder --- {commands => src/commands}/owner/migrateDB.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {commands => src/commands}/owner/migrateDB.ts (98%) diff --git a/commands/owner/migrateDB.ts b/src/commands/owner/migrateDB.ts similarity index 98% rename from commands/owner/migrateDB.ts rename to src/commands/owner/migrateDB.ts index 7d81a6c..a2532f2 100644 --- a/commands/owner/migrateDB.ts +++ b/src/commands/owner/migrateDB.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { create_default_embed } from "../../utils/embeds"; +import { create_default_embed } from "../../../utils/embeds"; import { Schema, Types, Document } from "mongoose"; import { getCourseName, From 3d35a4c65bf32e368edcf585a0bec01493bd6690 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 13 Jan 2023 12:10:58 -0600 Subject: [PATCH 119/146] move embeds --- src/commands/owner/migrateDB.ts | 2 +- {utils => src/utils}/embeds.ts | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {utils => src/utils}/embeds.ts (100%) diff --git a/src/commands/owner/migrateDB.ts b/src/commands/owner/migrateDB.ts index a2532f2..b3508ef 100644 --- a/src/commands/owner/migrateDB.ts +++ b/src/commands/owner/migrateDB.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { create_default_embed } from "../../../utils/embeds"; +import { create_default_embed } from "../../utils/embeds/embeds"; import { Schema, Types, Document } from "mongoose"; import { getCourseName, diff --git a/utils/embeds.ts b/src/utils/embeds.ts similarity index 100% rename from utils/embeds.ts rename to src/utils/embeds.ts From ce465027dd0c6a95c5db6a100d8bc846caff07d0 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 13 Jan 2023 16:03:17 -0600 Subject: [PATCH 120/146] rework regex for cleaning strings --- src/utils/channels.ts | 17 ++++++++++++----- src/utils/roles.ts | 3 +-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/utils/channels.ts b/src/utils/channels.ts index eae8e92..fce06ba 100644 --- a/src/utils/channels.ts +++ b/src/utils/channels.ts @@ -2,14 +2,21 @@ import { CategoryChannel, Guild, GuildChannel } from "discord.js"; import chalk from "chalk"; import { IClass } from "../models/classModel"; -export function cleanChannelString(s: string): string { - const s_new = s +/** + * @description Returns a new string with whitespace and special characters removed from the string + * and truncated to 100 characters + * @author John Schiltz + * @export + * @param name - Dirty channel name + * @return - Cleaned channel name + */ +export function cleanChannelString(name: string): string { + const cleaned_name = name .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>{}[\]\\/]/gi, "") - .replace(/\s+/gi, "-") - .replace(/-{2,}/gi, "-") + .replace(/(?:\s[\s-]*|-[\s-]+|-+)/gm, "-") .slice(0, 100); - return s_new; + return cleaned_name; } /** * @description diff --git a/src/utils/roles.ts b/src/utils/roles.ts index 5e30b23..349eaed 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -14,8 +14,7 @@ export function cleanRoleString(role_name: string): string { const clean_role_name: string = role_name .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>{}[\]\\/\n]+/gi, "") - .replace(/\s+/gi, "-") - .replace(/-{2,}/gi, "-") + .replace(/(?:\s[\s-]*|-[\s-]+|-+)/gm, "-") .slice(0, 100); return clean_role_name; } From 55d394aa7b43b2ff73a57d964d9bd403a0d4a832 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 13 Jan 2023 23:14:19 -0600 Subject: [PATCH 121/146] allow to match contiguous special characters --- src/utils/channels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/channels.ts b/src/utils/channels.ts index fce06ba..ff31bba 100644 --- a/src/utils/channels.ts +++ b/src/utils/channels.ts @@ -13,7 +13,7 @@ import { IClass } from "../models/classModel"; export function cleanChannelString(name: string): string { const cleaned_name = name .toLowerCase() - .replace(/[`~!@#$%^&*()|+=?;:'",.<>{}[\]\\/]/gi, "") + .replace(/[`~!@#$%^&*()|+=?;:'",.<>{}[\]\\/]+/gi, "") .replace(/(?:\s[\s-]*|-[\s-]+|-+)/gm, "-") .slice(0, 100); return cleaned_name; From 5c7df0e352f8c7b28af0cef9181dc091d5b410c5 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 13 Jan 2023 23:14:48 -0600 Subject: [PATCH 122/146] fix import --- src/commands/owner/migrateDB.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/owner/migrateDB.ts b/src/commands/owner/migrateDB.ts index b3508ef..7d81a6c 100644 --- a/src/commands/owner/migrateDB.ts +++ b/src/commands/owner/migrateDB.ts @@ -1,7 +1,7 @@ import chalk from "chalk"; import { ICommand } from "wokcommands"; import { classModel, IClass } from "../../models/classModel"; -import { create_default_embed } from "../../utils/embeds/embeds"; +import { create_default_embed } from "../../utils/embeds"; import { Schema, Types, Document } from "mongoose"; import { getCourseName, From 7d3cb66ae7e891b9fd4d1ae4a22e36a953c37ba9 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 13 Jan 2023 23:16:17 -0600 Subject: [PATCH 123/146] keep tests in order --- __tests__/utils/channels.tests.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index 2c34af8..d0a365b 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -124,17 +124,6 @@ describe("getCourseName", () => { }); }); -//concatCategoryName -describe("concatCategoryName", () => { - it("should return the category name if the category number is 0", () => { - expect(concatCategoryName("abcd", 0)).toBe("abcd"); - }); - - it("should return the category name and number if the category number is not 0", () => { - expect(concatCategoryName("abcd", 1)).toBe("abcd 1"); - }); -}); - //moveChannel // Can only test pure functionality describe("moveChannel", () => { @@ -147,3 +136,14 @@ describe("moveChannel", () => { expect(await moveChannel(guild, channel, category_name)).toBe(0); }); }); + +//concatCategoryName +describe("concatCategoryName", () => { + it("should return the category name if the category number is 0", () => { + expect(concatCategoryName("abcd", 0)).toBe("abcd"); + }); + + it("should return the category name and number if the category number is not 0", () => { + expect(concatCategoryName("abcd", 1)).toBe("abcd 1"); + }); +}); From 53faf2f739b6f85a6df99960f1956f407600a475 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Fri, 13 Jan 2023 23:34:17 -0600 Subject: [PATCH 124/146] cleanRoleString tests --- __tests__/utils/roles.tests.ts | 40 ++++++++++++++++++++++++++++++++++ src/utils/roles.ts | 6 ++--- 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 __tests__/utils/roles.tests.ts diff --git a/__tests__/utils/roles.tests.ts b/__tests__/utils/roles.tests.ts new file mode 100644 index 0000000..7e1177e --- /dev/null +++ b/__tests__/utils/roles.tests.ts @@ -0,0 +1,40 @@ +import { expect, describe, it, beforeEach } from "@jest/globals"; +import { cleanRoleString } from "../../src/utils/roles"; + +//cleanRoleString +describe("cleanRoleString", () => { + it("should lowercase the string", () => { + expect(cleanRoleString("ABCD")).toEqual("abcd"); + }); + + it("should remove special characters", () => { + expect(cleanRoleString("a!b@c#d$")).toEqual("abcd"); + }); + + it("should remove newlines", () => { + expect(cleanRoleString("\na\n")).toEqual("a"); + }); + + it("should replace whitespace with a hyphen", () => { + expect(cleanRoleString("a b c")).toEqual("a-b-c"); + }); + + it("should remove consecutive hyphens", () => { + expect(cleanRoleString("a--b--c")).toBe("a-b-c"); + }); + + it("should return an empty string for an empty input", () => { + expect(cleanRoleString("")).toBe(""); + }); + + it("cleanRoleString should return an empty string for a string with only special characters", () => { + expect(cleanRoleString("!@#$%^&*")).toBe(""); + }); + + it("should truncate the string to 100 characters", () => { + expect(cleanRoleString("a".repeat(200))).toHaveLength(100); + }); + it("should be able to handle a comboination of everything", () => { + expect(cleanRoleString("a! -- b@c\n#d$e%")).toEqual("a-bcde"); + }); +}); diff --git a/src/utils/roles.ts b/src/utils/roles.ts index 349eaed..15b52ab 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -10,13 +10,13 @@ export interface IRole { ROLE_ID: string; } -export function cleanRoleString(role_name: string): string { - const clean_role_name: string = role_name +export function cleanRoleString(name: string): string { + const clean_name: string = name .toLowerCase() .replace(/[`~!@#$%^&*()|+=?;:'",.<>{}[\]\\/\n]+/gi, "") .replace(/(?:\s[\s-]*|-[\s-]+|-+)/gm, "-") .slice(0, 100); - return clean_role_name; + return clean_name; } export async function checkIfCollectionsExist(model: Model) { From cb6ace29bb87b0c1601fc9c29a8284852e3f6760 Mon Sep 17 00:00:00 2001 From: schiltz3 Date: Sat, 14 Jan 2023 05:34:44 +0000 Subject: [PATCH 125/146] Apply auto formatting changes --- __tests__/utils/roles.tests.ts | 80 +++++++++++++++++----------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/__tests__/utils/roles.tests.ts b/__tests__/utils/roles.tests.ts index 7e1177e..4339921 100644 --- a/__tests__/utils/roles.tests.ts +++ b/__tests__/utils/roles.tests.ts @@ -1,40 +1,40 @@ -import { expect, describe, it, beforeEach } from "@jest/globals"; -import { cleanRoleString } from "../../src/utils/roles"; - -//cleanRoleString -describe("cleanRoleString", () => { - it("should lowercase the string", () => { - expect(cleanRoleString("ABCD")).toEqual("abcd"); - }); - - it("should remove special characters", () => { - expect(cleanRoleString("a!b@c#d$")).toEqual("abcd"); - }); - - it("should remove newlines", () => { - expect(cleanRoleString("\na\n")).toEqual("a"); - }); - - it("should replace whitespace with a hyphen", () => { - expect(cleanRoleString("a b c")).toEqual("a-b-c"); - }); - - it("should remove consecutive hyphens", () => { - expect(cleanRoleString("a--b--c")).toBe("a-b-c"); - }); - - it("should return an empty string for an empty input", () => { - expect(cleanRoleString("")).toBe(""); - }); - - it("cleanRoleString should return an empty string for a string with only special characters", () => { - expect(cleanRoleString("!@#$%^&*")).toBe(""); - }); - - it("should truncate the string to 100 characters", () => { - expect(cleanRoleString("a".repeat(200))).toHaveLength(100); - }); - it("should be able to handle a comboination of everything", () => { - expect(cleanRoleString("a! -- b@c\n#d$e%")).toEqual("a-bcde"); - }); -}); +import { expect, describe, it, beforeEach } from "@jest/globals"; +import { cleanRoleString } from "../../src/utils/roles"; + +//cleanRoleString +describe("cleanRoleString", () => { + it("should lowercase the string", () => { + expect(cleanRoleString("ABCD")).toEqual("abcd"); + }); + + it("should remove special characters", () => { + expect(cleanRoleString("a!b@c#d$")).toEqual("abcd"); + }); + + it("should remove newlines", () => { + expect(cleanRoleString("\na\n")).toEqual("a"); + }); + + it("should replace whitespace with a hyphen", () => { + expect(cleanRoleString("a b c")).toEqual("a-b-c"); + }); + + it("should remove consecutive hyphens", () => { + expect(cleanRoleString("a--b--c")).toBe("a-b-c"); + }); + + it("should return an empty string for an empty input", () => { + expect(cleanRoleString("")).toBe(""); + }); + + it("cleanRoleString should return an empty string for a string with only special characters", () => { + expect(cleanRoleString("!@#$%^&*")).toBe(""); + }); + + it("should truncate the string to 100 characters", () => { + expect(cleanRoleString("a".repeat(200))).toHaveLength(100); + }); + it("should be able to handle a comboination of everything", () => { + expect(cleanRoleString("a! -- b@c\n#d$e%")).toEqual("a-bcde"); + }); +}); From e3f9ac9c14199c55d4176f8730178c351395d52f Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 17:21:14 -0600 Subject: [PATCH 126/146] start mocking discord.js --- __tests__/utils/roles.tests.ts | 76 +++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/__tests__/utils/roles.tests.ts b/__tests__/utils/roles.tests.ts index 4339921..bdd8942 100644 --- a/__tests__/utils/roles.tests.ts +++ b/__tests__/utils/roles.tests.ts @@ -1,4 +1,4 @@ -import { expect, describe, it, beforeEach } from "@jest/globals"; +import { expect, describe, it, beforeEach, jest } from "@jest/globals"; import { cleanRoleString } from "../../src/utils/roles"; //cleanRoleString @@ -38,3 +38,77 @@ describe("cleanRoleString", () => { expect(cleanRoleString("a! -- b@c\n#d$e%")).toEqual("a-bcde"); }); }); + +jest.mock("discord.js", () => { + return { + GuildMember: jest.fn().mockImplementation(() => { + return { + roles: { + cache: { + has: jest.fn().mockReturnValue(true), + get: jest.fn().mockReturnValue("mockedRole"), + remove: jest.fn().mockImplementation(() => Promise.resolve()), + }, + }, + user: { + tag: jest.fn().mockReturnValue("mockedUser"), + }, + }; + }), + Role: jest.fn().mockImplementation(() => { + return { + ROLE_ID: jest.fn().mockReturnValue("mockedRoleId"), + ROLE_NAME: jest.fn().mockReturnValue("mockedRoleName"), + }; + }), + }; +}); + +jest.mock("mongoose", () => { + return { + Model: jest.fn().mockImplementation(() => { + return { + find: jest + .fn() + .mockImplementation(() => + Promise.resolve([{ ROLE_ID: "mockedRoleId" }]) + ), + }; + }), + }; +}); + +jest.mock("chalk", () => { + return { + green: jest.fn().mockReturnValue("mockedGreen"), + yellow: jest.fn().mockReturnValue("mockedYellow"), + }; +}); + +console.log = jest.fn(); + +describe("removeRole", () => { + let removeRole: any; + let member: any; + let model: any; + + beforeEach(() => { + jest.resetModules(); + removeRole = require("./removeRole").removeRole; + member = new (require("discord.js").GuildMember)(); + model = new (require("mongoose").Model)(); + }); + + it("should remove role from member", async () => { + await removeRole(member, model); + expect(member.roles.cache.remove).toHaveBeenCalledWith("mockedRoleId"); + expect(console.log).toHaveBeenCalledWith( + "mockedGreenRemoved role mockedGreenmockedRoleId from mockedYellowmockedUser" + ); + }); + + it("should return a promise that resolves to undefined", async () => { + const result = await removeRole(member, model); + expect(result).toBeUndefined(); + }); +}); From e896a0dd217cee401c1ebe868d811980e4a8c473 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 20:01:27 -0600 Subject: [PATCH 127/146] remove mocks --- __tests__/utils/roles.tests.ts | 74 ---------------------------------- 1 file changed, 74 deletions(-) diff --git a/__tests__/utils/roles.tests.ts b/__tests__/utils/roles.tests.ts index bdd8942..683510e 100644 --- a/__tests__/utils/roles.tests.ts +++ b/__tests__/utils/roles.tests.ts @@ -38,77 +38,3 @@ describe("cleanRoleString", () => { expect(cleanRoleString("a! -- b@c\n#d$e%")).toEqual("a-bcde"); }); }); - -jest.mock("discord.js", () => { - return { - GuildMember: jest.fn().mockImplementation(() => { - return { - roles: { - cache: { - has: jest.fn().mockReturnValue(true), - get: jest.fn().mockReturnValue("mockedRole"), - remove: jest.fn().mockImplementation(() => Promise.resolve()), - }, - }, - user: { - tag: jest.fn().mockReturnValue("mockedUser"), - }, - }; - }), - Role: jest.fn().mockImplementation(() => { - return { - ROLE_ID: jest.fn().mockReturnValue("mockedRoleId"), - ROLE_NAME: jest.fn().mockReturnValue("mockedRoleName"), - }; - }), - }; -}); - -jest.mock("mongoose", () => { - return { - Model: jest.fn().mockImplementation(() => { - return { - find: jest - .fn() - .mockImplementation(() => - Promise.resolve([{ ROLE_ID: "mockedRoleId" }]) - ), - }; - }), - }; -}); - -jest.mock("chalk", () => { - return { - green: jest.fn().mockReturnValue("mockedGreen"), - yellow: jest.fn().mockReturnValue("mockedYellow"), - }; -}); - -console.log = jest.fn(); - -describe("removeRole", () => { - let removeRole: any; - let member: any; - let model: any; - - beforeEach(() => { - jest.resetModules(); - removeRole = require("./removeRole").removeRole; - member = new (require("discord.js").GuildMember)(); - model = new (require("mongoose").Model)(); - }); - - it("should remove role from member", async () => { - await removeRole(member, model); - expect(member.roles.cache.remove).toHaveBeenCalledWith("mockedRoleId"); - expect(console.log).toHaveBeenCalledWith( - "mockedGreenRemoved role mockedGreenmockedRoleId from mockedYellowmockedUser" - ); - }); - - it("should return a promise that resolves to undefined", async () => { - const result = await removeRole(member, model); - expect(result).toBeUndefined(); - }); -}); From 1ab5f0596f88d543db3d501d721954f9746982f5 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 21:09:57 -0600 Subject: [PATCH 128/146] fix regex --- src/commands/owner/migrateDB.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/owner/migrateDB.ts b/src/commands/owner/migrateDB.ts index 7d81a6c..6e5e617 100644 --- a/src/commands/owner/migrateDB.ts +++ b/src/commands/owner/migrateDB.ts @@ -15,7 +15,7 @@ function cleanCompSciString(s: string): string { return s.toLowerCase().replace("compsci ", "cs").trim(); } function cleanCompSciTitle(s: string): string { - return s.replace(/(?<>advanced )?topics in computer science:/gim, "").trim(); + return s.replace(/(?:advanced )?topics in computer science:/gim, "").trim(); } function isDupe(name: string): number { return name.search(/\(\d\)/); From 0311a5b9ae66a50a6f091d0562c9fbc77e57c8c9 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 21:10:09 -0600 Subject: [PATCH 129/146] add active flag --- __tests__/utils/channels.tests.ts | 4 ++++ src/commands/owner/migrateDB.ts | 7 +++++-- src/models/classModel.ts | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index d0a365b..75c87d7 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -48,6 +48,7 @@ describe("getTopic", () => { id: default_string, NAME: default_string, DUPE: false, + ACTIVE: true, ROLE_NAME: default_string, ROLE_ID: default_string, CHANNEL_ID: default_string, @@ -60,6 +61,7 @@ describe("getTopic", () => { id: default_string, NAME: default_string, DUPE: false, + ACTIVE: true, ROLE_NAME: default_string, ROLE_ID: default_string, CHANNEL_ID: default_string, @@ -102,6 +104,7 @@ describe("getCourseName", () => { TITLE: "Introduction to Mathematics", INFO: default_string, DUPE: false, + ACTIVE: true, ROLE_NAME: default_string, ROLE_ID: default_string, CHANNEL_ID: default_string, @@ -116,6 +119,7 @@ describe("getCourseName", () => { TITLE: "Introduction to Mathematics", INFO: default_string, DUPE: true, + ACTIVE: true, ROLE_NAME: default_string, ROLE_ID: default_string, CHANNEL_ID: default_string, diff --git a/src/commands/owner/migrateDB.ts b/src/commands/owner/migrateDB.ts index 6e5e617..d4a9884 100644 --- a/src/commands/owner/migrateDB.ts +++ b/src/commands/owner/migrateDB.ts @@ -32,7 +32,7 @@ export default { callback: async ({ client, interaction: msgInt }) => { if (msgInt.guild === null) { - console.log(chalk.red("No guild")); + console.log(chalk.red("No guild related to message")); return; } @@ -57,6 +57,9 @@ export default { for (let index = 0; index < courses.length; index++) { const course = courses[index]; + // Label as active + course.set("ACTIVE", true); + // Remove CODE and replace with NAME const code = course.get("CODE"); if (code !== undefined) { @@ -84,7 +87,7 @@ export default { //Clean TITLE course.TITLE = cleanCompSciTitle(course.TITLE); - // Udate ROLE_NAME + // Update ROLE_NAME course.ROLE_NAME = cleanRoleString(getCourseName(course)); // REMOVE UUID diff --git a/src/models/classModel.ts b/src/models/classModel.ts index e97bde3..3163a5f 100644 --- a/src/models/classModel.ts +++ b/src/models/classModel.ts @@ -7,6 +7,7 @@ export interface IClass extends IRole { TITLE: string; INFO: string; DUPE: boolean; + ACTIVE: boolean; ROLE_NAME: string; ROLE_ID: string; CHANNEL_ID: string; @@ -18,6 +19,7 @@ const ClassSchema = new Schema({ TITLE: { type: String, required: true }, INFO: { type: String, required: true }, DUPE: { type: Boolean, required: true }, + ACTIVE: { type: Boolean, required: true }, ROLE_NAME: { type: String, required: true }, ROLE_ID: { type: String, required: true }, CHANNEL_ID: { type: String }, From 9b11092b57c714f97046710dfd61544992710197 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 21:24:29 -0600 Subject: [PATCH 130/146] deepsource --- __tests__/utils/channels.tests.ts | 2 +- __tests__/utils/roles.tests.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/__tests__/utils/channels.tests.ts b/__tests__/utils/channels.tests.ts index 75c87d7..5cf18d1 100644 --- a/__tests__/utils/channels.tests.ts +++ b/__tests__/utils/channels.tests.ts @@ -53,7 +53,7 @@ describe("getTopic", () => { ROLE_ID: default_string, CHANNEL_ID: default_string, }; - const extra_characters: number = 3; + const extra_characters = 3; beforeEach(() => { course = { TITLE: default_string, diff --git a/__tests__/utils/roles.tests.ts b/__tests__/utils/roles.tests.ts index 683510e..ede2d20 100644 --- a/__tests__/utils/roles.tests.ts +++ b/__tests__/utils/roles.tests.ts @@ -1,4 +1,4 @@ -import { expect, describe, it, beforeEach, jest } from "@jest/globals"; +import { expect, describe, it } from "@jest/globals"; import { cleanRoleString } from "../../src/utils/roles"; //cleanRoleString From 62fac090f453357b3afc932c9efefa03a29a462b Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 22:00:23 -0600 Subject: [PATCH 131/146] document --- src/utils/embeds.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/utils/embeds.ts b/src/utils/embeds.ts index 0069e98..2828f26 100644 --- a/src/utils/embeds.ts +++ b/src/utils/embeds.ts @@ -1,4 +1,13 @@ import { Client, MessageEmbed } from "discord.js"; +/** + * @description Creates a default embed for bot messages + * @author John Schiltz + * @export + * @param client - Discord Client + * @param title - Title of embed + * @param description - Description of embed + * @return {*} - MessageEmbed + */ export function create_default_embed( client: Client, title: string, From dbc4c2b1a9bcb15ed046ff8c84fcb631c47f1cfb Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 22:05:58 -0600 Subject: [PATCH 132/146] fix spelling --- src/utils/roles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/roles.ts b/src/utils/roles.ts index 15b52ab..4ffe066 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -75,7 +75,7 @@ export async function addNewRole( const role = await model.findOne({ ROLE_NAME: id }); if (role === null) { - throw new Error(`No roll found with id: ${id}`); + throw new Error(`No role found with id: ${id}`); } if (!member.roles.cache.has(role.ROLE_ID)) { From 6743ddbf81121876248697548879e5fab7cb57c0 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 22:39:16 -0600 Subject: [PATCH 133/146] prefer Channel ID's over channel names --- src/commands/owner/csCreateChannels.ts | 11 +++++++--- src/utils/channels.ts | 29 +++++++++++++++++++++----- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts index 5592933..5180183 100644 --- a/src/commands/owner/csCreateChannels.ts +++ b/src/commands/owner/csCreateChannels.ts @@ -55,6 +55,7 @@ export default { `category name: ${concatCategoryName(category_name, category_number)}` ); //Move classes no longer in the db to cs_past_category_name + let cs_category = checkForChannel( msgInt.guild, concatCategoryName(category_name, category_number) @@ -64,10 +65,13 @@ export default { while (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { - const match = cleaned_courses.find((course) => { - return course === children[index].name; + const match = courses.find((course) => { + return course.CHANNEL_ID == children[index].id; }); if (match !== undefined) { + console.log( + `Channel ${children[index]}'s COURSE_ID matches ${match.NAME}` + ); continue; } console.log(`Moving: ${children[index]} to: ${cs_past_category_name}`); @@ -86,7 +90,8 @@ export default { // Iterate through courses in db const channel = checkForChannel( msgInt.guild, - cleanChannelString(getCourseName(courses[index])) + cleanChannelString(getCourseName(courses[index])), + courses[index].CHANNEL_ID ); let category = await ( diff --git a/src/utils/channels.ts b/src/utils/channels.ts index ff31bba..9bd0cf5 100644 --- a/src/utils/channels.ts +++ b/src/utils/channels.ts @@ -40,17 +40,36 @@ export function getCourseName(course: IClass) { } /** - * @description - Checks if a channel exists in the guild + * @description - Checks if a channel exists in the guild first by id, then by name * @author John Schiltz * @export * @param guild * @param channel_name + * @param channel_id * @return - The channel if it exists, undefined if it doesn't */ -export function checkForChannel(guild: Guild, channel_name: string) { - return guild.channels.cache.find((channel) => { - return channel.name === channel_name; - }); +export function checkForChannel( + guild: Guild, + channel_name?: string, + channel_id?: string +) { + if (channel_id !== undefined) { + const found_channel = guild.channels.cache.find((channel) => { + return channel.id === channel_id; + }); + if (found_channel !== undefined) { + return found_channel; + } + } + if (channel_name !== undefined) { + const found_channel = guild.channels.cache.find((channel) => { + return channel.name === channel_name; + }); + if (found_channel !== undefined) { + return found_channel; + } + } + return undefined; } /** From 1e11a675a8a4043edc511441252306938aceb304 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 22:40:57 -0600 Subject: [PATCH 134/146] use === instead of == --- src/commands/owner/csCreateChannels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts index 5180183..de9f7e3 100644 --- a/src/commands/owner/csCreateChannels.ts +++ b/src/commands/owner/csCreateChannels.ts @@ -66,7 +66,7 @@ export default { const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { const match = courses.find((course) => { - return course.CHANNEL_ID == children[index].id; + return course.CHANNEL_ID === children[index].id; }); if (match !== undefined) { console.log( From 3c866ab714105b1cf0c58c42ad2d69d5ebe9fe19 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 14 Jan 2023 23:12:20 -0600 Subject: [PATCH 135/146] replace playantares with antaresnetwork --- README.md | 4 ++-- src/commands/owner/csClassPoll.ts | 2 +- src/commands/owner/staffPoll.ts | 2 +- src/commands/owner/yearPoll.ts | 2 +- src/commands/user/github.ts | 4 ++-- src/commands/user/help.ts | 4 ++-- src/commands/user/ping.ts | 2 +- src/commands/user/status.ts | 6 +++--- src/commands/user/uptime.ts | 2 +- src/commands/user/version.ts | 2 +- src/features/interactionCreate.ts | 2 +- src/features/status-changer.ts | 6 +++--- src/utils/embeds.ts | 4 ++-- 13 files changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 9445864..8a35244 100644 --- a/README.md +++ b/README.md @@ -118,8 +118,8 @@ The bot should become responsive. You can check for errors in the console. - [Discord.js Docs](https://discord.js.org/#/docs) - [Discord.js Guide](https://discordjs.guide/) - [WOKcommands Docs](https://docs.wornoffkeys.com/) -- [AntaresBot Codebase](https://playantares.com/antaresbot) -- [Antares Status Tracking](https://status.playantares.com/) +- [AntaresBot Codebase](https://antaresnetwork.com/antaresbot) +- [Antares Status Tracking](https://status.antaresnetwork.com/) ## Credits diff --git a/src/commands/owner/csClassPoll.ts b/src/commands/owner/csClassPoll.ts index 65fbe4b..a3a7165 100644 --- a/src/commands/owner/csClassPoll.ts +++ b/src/commands/owner/csClassPoll.ts @@ -83,7 +83,7 @@ export default { ) .setFooter({ text: `Delivered in: ${client.ws.ping}ms | CSSC-Bot | ${process.env.VERSION}`, - iconURL: "https://playantares.com/resources/CSSC-bot/icon.jpg", + iconURL: "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg", }); msgInt.reply({ embeds: [infoEmbed], components: row_chunks[index] }); diff --git a/src/commands/owner/staffPoll.ts b/src/commands/owner/staffPoll.ts index b334279..671d896 100644 --- a/src/commands/owner/staffPoll.ts +++ b/src/commands/owner/staffPoll.ts @@ -21,7 +21,7 @@ export default { .setDescription("Select the option with your current occupation at UWM.") .setFooter({ text: `Delivered in: ${client.ws.ping}ms | CSSC-Bot | ${process.env.VERSION}`, - iconURL: "https://playantares.com/resources/CSSC-bot/icon.jpg", + iconURL: "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg", }); // Create row one of the buttons for the poll diff --git a/src/commands/owner/yearPoll.ts b/src/commands/owner/yearPoll.ts index bf9a862..e11ac10 100644 --- a/src/commands/owner/yearPoll.ts +++ b/src/commands/owner/yearPoll.ts @@ -21,7 +21,7 @@ export default { .setDescription("Select the button with your current college year.") .setFooter({ text: `Delivered in: ${client.ws.ping}ms | CSSC-Bot | ${process.env.VERSION}`, - iconURL: "https://playantares.com/resources/CSSC-bot/icon.jpg", + iconURL: "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg", }); // Create row one of the buttons for the poll diff --git a/src/commands/user/github.ts b/src/commands/user/github.ts index f94f6d0..0d659b9 100644 --- a/src/commands/user/github.ts +++ b/src/commands/user/github.ts @@ -15,12 +15,12 @@ export default { // Embed values const color = "#0099ff"; const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + "https://antaresnetwork.com/resources/CSSC-bot/cssc-server-icon.png"; const title = "Github"; const description = "Click here to go to the CSSC-bot repo: \n https://github.com/Antares-Network/CSSC-Bot"; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; // Embed construction const Embed = new MessageEmbed() diff --git a/src/commands/user/help.ts b/src/commands/user/help.ts index 9bd3086..25032d5 100644 --- a/src/commands/user/help.ts +++ b/src/commands/user/help.ts @@ -14,7 +14,7 @@ export default { callback: async ({ client, interaction }) => { const color = "#0099ff"; const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + "https://antaresnetwork.com/resources/CSSC-bot/cssc-server-icon.png"; const title = "Help and Commands List"; const description = "Welcome to CSSC-Bot! My purpose in this server is to make sure you have the correct roles for this server. My purpose mey evolve over time. You can always use this command to see my latest features."; @@ -44,7 +44,7 @@ export default { }, ]; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; const Embed = new MessageEmbed() .setColor(color) diff --git a/src/commands/user/ping.ts b/src/commands/user/ping.ts index e9d5fec..950290c 100644 --- a/src/commands/user/ping.ts +++ b/src/commands/user/ping.ts @@ -17,7 +17,7 @@ export default { const title = "Bot/API Ping"; const description = `Ping: 🏓 | Latency is: **${client.ws.ping}**ms.`; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; const Embed = new MessageEmbed() .setColor(color) diff --git a/src/commands/user/status.ts b/src/commands/user/status.ts index bd7a48d..42a4a6c 100644 --- a/src/commands/user/status.ts +++ b/src/commands/user/status.ts @@ -15,12 +15,12 @@ export default { // Embed values const color = "#0099ff"; const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + "https://antaresnetwork.com/resources/CSSC-bot/cssc-server-icon.png"; const title = "Status Page"; const description = - "CLick here to see the bot's status: \nhttps://status.playantares.com"; + "CLick here to see the bot's status: \nhttps://status.antaresnetwork.com"; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; // Embed construction const Embed = new MessageEmbed() diff --git a/src/commands/user/uptime.ts b/src/commands/user/uptime.ts index 17adffe..91c27ff 100644 --- a/src/commands/user/uptime.ts +++ b/src/commands/user/uptime.ts @@ -24,7 +24,7 @@ export default { const title = "Bot Uptime"; const description = `I have been online for ${days}d ${hours}h ${minutes}m ${seconds}s`; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; // Embed construction const Embed = new MessageEmbed() diff --git a/src/commands/user/version.ts b/src/commands/user/version.ts index c039b87..871d1c2 100644 --- a/src/commands/user/version.ts +++ b/src/commands/user/version.ts @@ -16,7 +16,7 @@ export default { const title = "Bot Version"; const description = `I am running version: ${process.env.VERSION}`; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; // Embed construction const Embed = new MessageEmbed() diff --git a/src/features/interactionCreate.ts b/src/features/interactionCreate.ts index 340b1e8..aae8f3d 100644 --- a/src/features/interactionCreate.ts +++ b/src/features/interactionCreate.ts @@ -12,7 +12,7 @@ export default (client: Client): void => { const color = "#0099ff"; const description = `You selected the ${interaction.values[0]} role.`; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; // Constants for all interactions const member = interaction.member as GuildMember; diff --git a/src/features/status-changer.ts b/src/features/status-changer.ts index 0d46db6..2b6b3ea 100644 --- a/src/features/status-changer.ts +++ b/src/features/status-changer.ts @@ -4,9 +4,9 @@ export default (client: Client) => { const statusOptions = [ `/help | Ping: ${client.ws.ping}ms`, `V.${process.env.VERSION}`, - `status.playantares.com`, - `playantares.com/github`, - `status.playantares.com`, + `status.antaresnetwork.com`, + `antaresnetwork.com/github`, + `status.antaresnetwork.com`, `Antares Network Server Hosting`, "Go to #roles!", "Hello! I'm CSSC-Bot", diff --git a/src/utils/embeds.ts b/src/utils/embeds.ts index 2828f26..9e1935c 100644 --- a/src/utils/embeds.ts +++ b/src/utils/embeds.ts @@ -15,9 +15,9 @@ export function create_default_embed( ) { const color = "#0099ff"; const thumbnail = - "https://playantares.com/resources/CSSC-bot/cssc-server-icon.png"; + "https://antaresnetwork.com/resources/CSSC-bot/cssc-server-icon.png"; const footer = `Delivered in: ${client.ws.ping}ms | CSSC-bot | ${process.env.VERSION}`; - const footerIcon = "https://playantares.com/resources/CSSC-bot/icon.jpg"; + const footerIcon = "https://antaresnetwork.com/resources/CSSC-bot/icon.jpg"; // Embed construction const embed = new MessageEmbed() From 48e8700fb8439a0e90fa3cdf3ec65ea4d92da733 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 17 Jan 2023 00:09:20 -0600 Subject: [PATCH 136/146] Clean up and document roles --- src/utils/roles.ts | 169 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 129 insertions(+), 40 deletions(-) diff --git a/src/utils/roles.ts b/src/utils/roles.ts index 4ffe066..f42987d 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -5,11 +5,24 @@ import { staffModel } from "../models/staffModel"; import { yearModel } from "../models/yearModel"; import { Model } from "mongoose"; +/** + * @description + * @author John Schiltz + * @export + * @interface IRole + */ export interface IRole { ROLE_NAME: string; ROLE_ID: string; } +/** + * @description Clean the role name by removing special characters, replacing whitespace with dashes, and truncating to 100 characters + * @author John Schiltz + * @export + * @param name - The role name to clean + * @return {*} + */ export function cleanRoleString(name: string): string { const clean_name: string = name .toLowerCase() @@ -19,12 +32,24 @@ export function cleanRoleString(name: string): string { return clean_name; } +/** + * @description Check if the collections exist in the database + * @author John Schiltz + * @export + * @template T + * @param model - The model to check + */ export async function checkIfCollectionsExist(model: Model) { if (!(await model.exists({}))) { throw new Error(`${model.name} collection does not exist`); } } -async function dbQuery() { +/** + * @description Get all groups of roles from the database and return them as an array + * @author Nathan Goldsborough + * @return {*} + */ +async function getAllRolesFromDB() { return await Promise.all([ classModel.find({}), staffModel.find({}), @@ -32,27 +57,41 @@ async function dbQuery() { ]); } +/** + * @description Get all roles from a user and return them as a string + * @author Nathan Goldsborough + * @export + * @param member - The user to get the roles from + * @return {*} - The roles as a string + */ export async function getUsersRoles(member: GuildMember): Promise { - let list = ""; - for (const group of await dbQuery()) { - for (const element of group) { - if (member.roles.cache.has(element.ROLE_ID)) { - list += `${member.guild.roles.cache.get(element.ROLE_ID)?.name}\n`; + let roles_list = ""; + for (const role_group of await getAllRolesFromDB()) { + for (const role of role_group) { + if (member.roles.cache.has(role.ROLE_ID)) { + roles_list += `${member.guild.roles.cache.get(role.ROLE_ID)?.name}\n`; } } } - return list; + return roles_list; } +/** + * @description Remove all roles from a user given a model and member + * @author Nathan Goldsborough + * @export + * @template T + * @param member - The user to remove the roles from + * @param model - The model to get the roles from + * @return {*} + */ export async function removeRole( member: GuildMember, model: Model ): Promise { - // This function is triggered when a user changes their role, - // it removes the previous role from the user - const list = await model.find({}); + const roles = await model.find({}); - for (const role of list) { + for (const role of roles) { if (member.roles.cache.has(role.ROLE_ID)) { await member.roles.remove(role.ROLE_ID); console.log( @@ -66,12 +105,20 @@ export async function removeRole( } } +/** + * @description Add a role to a user given a role id and model + * @author Nathan Goldsborough + * @export + * @template T + * @param member - The user to add the role to + * @param model - The model to get the role from + * @param id - The id of the role to add + */ export async function addNewRole( member: GuildMember, model: Model, id: string ) { - // This function is triggered when a user changes their role, it adds the new role to the user const role = await model.findOne({ ROLE_NAME: id }); if (role === null) { @@ -90,6 +137,15 @@ export async function addNewRole( } } +/** + * @description + * @author Nathan Goldsborough + * @export + * @template T + * @param guild - The server to create the roles in + * @param model - The mongo db model to get the roles from + * @return {*} + */ export async function createRoles( guild: Guild, model: Model @@ -98,58 +154,91 @@ export async function createRoles( for (let index = 0; index < role_docs.length; index++) { const role_doc = role_docs[index]; - if ( - guild.roles.cache.find((r) => r.name === role_doc.ROLE_NAME) === undefined - ) { - // Create the role + const clean_role_name = cleanRoleString(role_doc.ROLE_NAME); + const found_role = checkForRole(guild, clean_role_name, role_doc.ROLE_ID); + + if (found_role === undefined) { const role = await guild.roles.create({ - name: cleanRoleString(role_doc.ROLE_NAME), + name: clean_role_name, }); + + // save role id to database role_doc.ROLE_ID = role.id; await role_doc.save(); // Print the role id to the console console.log(chalk.yellow(`Created role: ${role.name}\tid: ${role?.id}`)); } else { - // If the role already exists, print the id to the console - const role = guild.roles.cache.find((r) => r.name === role_doc.ROLE_NAME); - if (role === undefined) { - continue; - } - const id = role.id; - role_doc.ROLE_ID = id; + // If the role already exists, update it to match the db then print the id to the console + role_doc.ROLE_ID = found_role.id; + role_doc.ROLE_NAME = found_role.name; await role_doc.save(); - console.log(chalk.yellow(`Role exists: ${role.name}\tid: ${id}`)); + console.log( + chalk.yellow(`Role exists: ${found_role.name}\tid: ${found_role.id}`) + ); + } + } +} +/** + * @description - Checks if a role exists in the guild first by id, then by name + * @author John Schiltz + * @export + * @param guild + * @param role_name + * @param role_id + * @return - The role if it exists, undefined if it doesn't + */ +export function checkForRole( + guild: Guild, + role_name?: string, + role_id?: string +) { + if (role_id !== undefined) { + const found_role = guild.channels.cache.find((role) => { + return role.id === role_id; + }); + if (found_role !== undefined) { + return found_role; } } + if (role_name !== undefined) { + const found_role = guild.channels.cache.find((role) => { + return role.name === role_name; + }); + if (found_role !== undefined) { + return found_role; + } + } + return undefined; } +/** + * @description Check if all roles in database exist for a server and print if they do not + * @author Nathan Goldsborough + * @export + * @param guild Server to check roles for + * @return {*} true if all roles exist, false if they do not + */ export async function checkForRoles(guild: Guild): Promise { - // Check if all roles exist in a guild - // Return true if they do, false if they don't - - const collection: boolean[] = []; - - for (const group of await dbQuery()) { - for (const element of group) { - const name = guild.roles.cache.find((r) => r.name === element.ROLE_NAME); - const id = guild.roles.cache.find((r) => r.id === element.ROLE_ID); + let foundAllRoles = true; + for (const roleGroups of await getAllRolesFromDB()) { + for (const role of roleGroups) { + const name = guild.roles.cache.find((r) => r.name === role.ROLE_NAME); + const id = guild.roles.cache.find((r) => r.id === role.ROLE_ID); if (name === undefined && id === undefined) { + foundAllRoles = false; console.log( chalk.red.bold( - `Role ${element.ROLE_NAME} does not exist in ${guild.name}, Please run the /createRoles command in that server.` + `Role ${role.ROLE_NAME} does not exist in ${guild.name}, Please run the /createRoles command in that server.` ) ); - collection.push(false); } } } - if (collection.includes(false)) { - return false; - } else { + if (foundAllRoles) { console.log(chalk.yellow.bold(`All roles in list exist in ${guild.name}`)); - return true; } + return foundAllRoles; } From 7f0af114e2adcf7122512a507dc6bd413f816f8b Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 17 Jan 2023 00:17:20 -0600 Subject: [PATCH 137/146] add documentation --- src/utils/roles.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/roles.ts b/src/utils/roles.ts index f42987d..f36c7b9 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -80,7 +80,7 @@ export async function getUsersRoles(member: GuildMember): Promise { * @description Remove all roles from a user given a model and member * @author Nathan Goldsborough * @export - * @template T + * @template T - Extends IRole * @param member - The user to remove the roles from * @param model - The model to get the roles from * @return {*} @@ -109,7 +109,7 @@ export async function removeRole( * @description Add a role to a user given a role id and model * @author Nathan Goldsborough * @export - * @template T + * @template T - Extends IRole * @param member - The user to add the role to * @param model - The model to get the role from * @param id - The id of the role to add @@ -141,7 +141,7 @@ export async function addNewRole( * @description * @author Nathan Goldsborough * @export - * @template T + * @template T - Extends IRole * @param guild - The server to create the roles in * @param model - The mongo db model to get the roles from * @return {*} From d6f0999225c0d9fe73fb29d4eb15f95784044dfd Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 17 Jan 2023 00:22:51 -0600 Subject: [PATCH 138/146] swap to using name instead of ROLE_NAME --- src/utils/roles.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/utils/roles.ts b/src/utils/roles.ts index f36c7b9..13528c5 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -112,17 +112,17 @@ export async function removeRole( * @template T - Extends IRole * @param member - The user to add the role to * @param model - The model to get the role from - * @param id - The id of the role to add + * @param name - The name of the role to add as specified in the database */ export async function addNewRole( member: GuildMember, model: Model, - id: string + name: string ) { - const role = await model.findOne({ ROLE_NAME: id }); + const role = await model.findOne({ NAME: name }); if (role === null) { - throw new Error(`No role found with id: ${id}`); + throw new Error(`No role found with id: ${name}`); } if (!member.roles.cache.has(role.ROLE_ID)) { From 54d4a64fe983f9c17d9f019d905ac3cb1e868d07 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 17 Jan 2023 08:24:32 -0600 Subject: [PATCH 139/146] fix name --- src/utils/roles.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/utils/roles.ts b/src/utils/roles.ts index 13528c5..d3c5dfa 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -46,7 +46,7 @@ export async function checkIfCollectionsExist(model: Model) { } /** * @description Get all groups of roles from the database and return them as an array - * @author Nathan Goldsborough + * @author Nathen Goldsborough * @return {*} */ async function getAllRolesFromDB() { @@ -59,7 +59,7 @@ async function getAllRolesFromDB() { /** * @description Get all roles from a user and return them as a string - * @author Nathan Goldsborough + * @author Nathen Goldsborough * @export * @param member - The user to get the roles from * @return {*} - The roles as a string @@ -78,7 +78,7 @@ export async function getUsersRoles(member: GuildMember): Promise { /** * @description Remove all roles from a user given a model and member - * @author Nathan Goldsborough + * @author Nathen Goldsborough * @export * @template T - Extends IRole * @param member - The user to remove the roles from @@ -107,7 +107,7 @@ export async function removeRole( /** * @description Add a role to a user given a role id and model - * @author Nathan Goldsborough + * @author Nathen Goldsborough * @export * @template T - Extends IRole * @param member - The user to add the role to @@ -139,7 +139,7 @@ export async function addNewRole( /** * @description - * @author Nathan Goldsborough + * @author Nathen Goldsborough * @export * @template T - Extends IRole * @param guild - The server to create the roles in @@ -215,7 +215,7 @@ export function checkForRole( /** * @description Check if all roles in database exist for a server and print if they do not - * @author Nathan Goldsborough + * @author Nathen Goldsborough * @export * @param guild Server to check roles for * @return {*} true if all roles exist, false if they do not From 606276e25853bc0926516b4f44649d8b086f3071 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 17 Jan 2023 10:43:07 -0600 Subject: [PATCH 140/146] more documentation --- src/commands/owner/csClassPoll.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/commands/owner/csClassPoll.ts b/src/commands/owner/csClassPoll.ts index a3a7165..ff3acb0 100644 --- a/src/commands/owner/csClassPoll.ts +++ b/src/commands/owner/csClassPoll.ts @@ -12,7 +12,14 @@ import { sleep } from "../../utils/sleep"; import { getCourseName } from "../../utils/channels"; // Splits any size list into lists of at most `max_list_len` -/** */ +/** + * @description - Splits a list into lists of at most `max_list_len` elements + * @author John Schiltz + * @template T + * @param list - The list to split + * @param max_list_len - The maximum length of each list + * @return {*} + */ function split_list(list: T[], max_list_len: number): T[][] { const class_chunks: T[][] = []; for (let i = 0; i < list.length; i += max_list_len) { @@ -21,7 +28,12 @@ function split_list(list: T[], max_list_len: number): T[][] { return class_chunks; } -// consumes a Class and returns Message Selec tOption data +/** + * @description - Creates a MessageSelectOptionData object from a class object + * @author John Schiltz + * @param _class - The class to create the option from + * @return {*} + */ function create_option_from_class(_class: IClass): MessageSelectOptionData { const clean_name = cleanRoleString(getCourseName(_class)); return { From dc1b3fed99011ad024916d87fef8ea9329a0e473 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Tue, 17 Jan 2023 23:33:29 -0600 Subject: [PATCH 141/146] use === instead of == --- src/commands/owner/csClassPoll.ts | 2 +- src/commands/owner/csCreateChannels.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/owner/csClassPoll.ts b/src/commands/owner/csClassPoll.ts index ff3acb0..d534358 100644 --- a/src/commands/owner/csClassPoll.ts +++ b/src/commands/owner/csClassPoll.ts @@ -85,7 +85,7 @@ export default { const row_chunks = split_list(rows, 5); for (let index = 0; index < row_chunks.length; index++) { - if (index == 0) { + if (index === 0) { // Define embeds used in this command const infoEmbed = new MessageEmbed() .setTitle("Choose a role") diff --git a/src/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts index de9f7e3..03a03ef 100644 --- a/src/commands/owner/csCreateChannels.ts +++ b/src/commands/owner/csCreateChannels.ts @@ -62,7 +62,7 @@ export default { ); console.log(`Channel: ${cs_category}`); - while (cs_category != undefined && cs_category.type == "GUILD_CATEGORY") { + while (cs_category !== undefined && cs_category.type === "GUILD_CATEGORY") { const children = Array.from(cs_category.children.values()); for (let index = 0; index < children.length; index++) { const match = courses.find((course) => { From 7352a770324c1f548684b6fff6d996682cd1ff41 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 21 Jan 2023 15:28:09 -0600 Subject: [PATCH 142/146] Sort channels before creating them --- src/commands/owner/csCreateChannels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts index 03a03ef..3293f99 100644 --- a/src/commands/owner/csCreateChannels.ts +++ b/src/commands/owner/csCreateChannels.ts @@ -31,7 +31,7 @@ export default { await msgInt.deferReply({ ephemeral: true }); - const courses = await classModel.find({}); + const courses = await classModel.find({}).sort({ NAME: 1 }); //create an array of the courses with cleaned names const cleaned_courses: string[] = []; From 4395e61e7e8495d2e824cebc526403214433d13b Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 21 Jan 2023 15:31:48 -0600 Subject: [PATCH 143/146] Report name of matching channel not id --- src/commands/owner/csCreateChannels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts index 03a03ef..c33fa6d 100644 --- a/src/commands/owner/csCreateChannels.ts +++ b/src/commands/owner/csCreateChannels.ts @@ -70,7 +70,7 @@ export default { }); if (match !== undefined) { console.log( - `Channel ${children[index]}'s COURSE_ID matches ${match.NAME}` + `Channel ${children[index].name}'s COURSE_ID matches ${match.NAME}` ); continue; } From d1e71e515fa109e3c2287009a27a80de80f75031 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 21 Jan 2023 15:54:24 -0600 Subject: [PATCH 144/146] Found second spot --- src/commands/owner/csCreateChannels.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts index c33fa6d..9b28c7b 100644 --- a/src/commands/owner/csCreateChannels.ts +++ b/src/commands/owner/csCreateChannels.ts @@ -74,7 +74,9 @@ export default { ); continue; } - console.log(`Moving: ${children[index]} to: ${cs_past_category_name}`); + console.log( + `Moving: ${children[index].name} to: ${cs_past_category_name}` + ); await moveChannel(msgInt.guild, children[index], cs_past_category_name); } From b10f93f945ceb1b1a9bcf1d24906158a1e051923 Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 21 Jan 2023 16:24:12 -0600 Subject: [PATCH 145/146] fix colors --- src/commands/owner/csCreateChannels.ts | 46 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/commands/owner/csCreateChannels.ts b/src/commands/owner/csCreateChannels.ts index 9b28c7b..ed2ccf8 100644 --- a/src/commands/owner/csCreateChannels.ts +++ b/src/commands/owner/csCreateChannels.ts @@ -52,7 +52,9 @@ export default { let move_channel_count = 0; console.log( - `category name: ${concatCategoryName(category_name, category_number)}` + chalk.blue( + `category name: ${concatCategoryName(category_name, category_number)}` + ) ); //Move classes no longer in the db to cs_past_category_name @@ -60,7 +62,7 @@ export default { msgInt.guild, concatCategoryName(category_name, category_number) ); - console.log(`Channel: ${cs_category}`); + console.log(chalk.blue(`Channel: ${cs_category?.name}`)); while (cs_category !== undefined && cs_category.type === "GUILD_CATEGORY") { const children = Array.from(cs_category.children.values()); @@ -70,12 +72,16 @@ export default { }); if (match !== undefined) { console.log( - `Channel ${children[index].name}'s COURSE_ID matches ${match.NAME}` + chalk.green( + `Channel ${children[index].name}'s COURSE_ID matches ${match.NAME}` + ) ); continue; } console.log( - `Moving: ${children[index].name} to: ${cs_past_category_name}` + chalk.yellow( + `Moving: ${children[index].name} to: ${cs_past_category_name}` + ) ); await moveChannel(msgInt.guild, children[index], cs_past_category_name); } @@ -113,17 +119,21 @@ export default { ) ).fetch(true); console.log( - `old category full, new category: ${concatCategoryName( - category_name, - category_number - )} created` + chalk.yellow( + `old category full, new category: ${concatCategoryName( + category_name, + category_number + )} created` + ) ); } console.log( - `Working in category: ${concatCategoryName( - category_name, - category_number - )} size: ${category.children.size}` + chalk.yellow( + `Working in category: ${concatCategoryName( + category_name, + category_number + )} size: ${category.children.size}` + ) ); // Create new channels @@ -160,10 +170,12 @@ export default { ) { // Moves and updates old channels console.log( - `Moving: ${channel.name} to: ${concatCategoryName( - category_name, - category_number - )}` + chalk.yellow( + `Moving: ${channel.name} to: ${concatCategoryName( + category_name, + category_number + )}` + ) ); channel.edit({ topic: courses[index].INFO }); move_channel_count += await moveChannel( @@ -208,7 +220,7 @@ export default { const embed = create_default_embed(client, title, description); await msgInt.editReply({ embeds: [embed] }); - console.log(chalk.yellow(description)); + console.log(chalk.green(description)); // Log the command usage console.log( From 01bcc3605dd79b9c3fe13385741b0ddfd15e702e Mon Sep 17 00:00:00 2001 From: John Schiltz Date: Sat, 21 Jan 2023 16:25:04 -0600 Subject: [PATCH 146/146] check against roles not channels --- src/utils/roles.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/utils/roles.ts b/src/utils/roles.ts index d3c5dfa..d453af7 100644 --- a/src/utils/roles.ts +++ b/src/utils/roles.ts @@ -158,26 +158,29 @@ export async function createRoles( const found_role = checkForRole(guild, clean_role_name, role_doc.ROLE_ID); if (found_role === undefined) { + console.log( + chalk.red( + `Couldn't find role: ${clean_role_name} with id: ${role_doc.ROLE_ID}` + ) + ); const role = await guild.roles.create({ name: clean_role_name, }); // save role id to database role_doc.ROLE_ID = role.id; - await role_doc.save(); - // Print the role id to the console console.log(chalk.yellow(`Created role: ${role.name}\tid: ${role?.id}`)); } else { // If the role already exists, update it to match the db then print the id to the console role_doc.ROLE_ID = found_role.id; role_doc.ROLE_NAME = found_role.name; - await role_doc.save(); console.log( - chalk.yellow(`Role exists: ${found_role.name}\tid: ${found_role.id}`) + chalk.green(`Role exists: ${found_role.name}\tid: ${found_role.id}`) ); } + await role_doc.save(); } } /** @@ -195,7 +198,7 @@ export function checkForRole( role_id?: string ) { if (role_id !== undefined) { - const found_role = guild.channels.cache.find((role) => { + const found_role = guild.roles.cache.find((role) => { return role.id === role_id; }); if (found_role !== undefined) { @@ -203,7 +206,7 @@ export function checkForRole( } } if (role_name !== undefined) { - const found_role = guild.channels.cache.find((role) => { + const found_role = guild.roles.cache.find((role) => { return role.name === role_name; }); if (found_role !== undefined) {