├── .env.example ├── .github ├── dependabot.yml └── workflows │ └── linter.yml ├── .gitignore ├── .prettierrc ├── Makefile ├── README.md ├── config.json ├── docker-compose.yml ├── docker └── bot │ └── Dockerfile ├── eslint.config.mjs ├── index.ts ├── main.ts ├── package.json ├── prisma ├── migrations │ ├── 20241205223939_ │ │ └── migration.sql │ └── migration_lock.toml └── schema.prisma ├── shards.ts ├── src ├── commands │ ├── admin │ │ └── SetLogsChannel.ts │ └── utils │ │ ├── BotInfo.ts │ │ └── Help.ts ├── events │ └── InteractionCreate.ts ├── services │ └── CommandService.ts └── utils │ ├── Command.ts │ ├── CommandsManager.ts │ ├── Constants.ts │ ├── Context.ts │ ├── DiscordEvent.ts │ ├── EventsManager.ts │ ├── Logger.ts │ └── PrismaClient.ts ├── tsconfig.json ├── tsconfigcopy.json └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | DATABASE_URL="mysql://root:YOUR_PASSWORD@bot-structure-database:3306/bot" 2 | MYSQL_ROOT_PASSWORD=YOUR_PASSWORD 3 | TOKEN=YOUR_TOKEN -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | open-pull-requests-limit: 5 13 | -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ################################# 3 | ################################# 4 | ## Super Linter GitHub Actions ## 5 | ################################# 6 | ################################# 7 | name: Lint Code Base 8 | 9 | # 10 | # Documentation: 11 | # https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions 12 | # 13 | 14 | ############################# 15 | # Start the job on all push # 16 | ############################# 17 | on: 18 | push: 19 | branches-ignore: [] 20 | pull_request: 21 | branches: [master, main, typescript] 22 | 23 | ############### 24 | # Set the Job # 25 | ############### 26 | jobs: 27 | build: 28 | # Name the Job 29 | name: Code Verification 30 | # Set the agent to run on 31 | runs-on: ubuntu-latest 32 | 33 | ################## 34 | # Load all steps # 35 | ################## 36 | steps: 37 | ########################## 38 | # Checkout the code base # 39 | ########################## 40 | - name: Checkout Code 41 | uses: actions/checkout@v4 42 | with: 43 | # Full git history is needed to get a proper list of changed files within `super-linter` 44 | fetch-depth: 0 45 | 46 | - name: Install node.js v20 47 | uses: actions/setup-node@v4 48 | with: 49 | node-version: 20 50 | cache: "yarn" 51 | 52 | - name: Install dependencies 53 | run: yarn --immutable 54 | 55 | ################################ 56 | # Run Linter against code base # 57 | ################################ 58 | - name: ESLint 59 | run: yarn lint 60 | 61 | - name: Compile TypeScript Test 62 | run: yarn test 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | npm/ 3 | dist/ 4 | package-lock.json 5 | yarn-error.log 6 | config.json 7 | .env 8 | prisma/dev.db 9 | prisma/dev.db-journal 10 | .idea -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": false, 4 | "trailingComma": "none", 5 | "printWidth": 120, 6 | "tabWidth": 4, 7 | "useTabs": true, 8 | "arrowParens": "avoid", 9 | "overrides": [ 10 | { 11 | "files": "*.json", 12 | "options": { 13 | "tabWidth": 4 14 | } 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | start: 2 | docker-compose up -d 3 | 4 | rebuild: 5 | docker-compose up -d --build 6 | 7 | rebuild-clean: 8 | docker-compose down -v 9 | docker-compose up -d --build 10 | 11 | prisma-migrate: 12 | docker exec -it bot-structure-node sh -c "npx prisma migrate dev" 13 | docker exec -it bot-structure-node sh -c "npx prisma generate" 14 | 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## discord.js-bot-structure 2 | 3 | Cette branche est plus compliqué que les autres, c'est une structure assez complexe pour des bots Discord normalemment assez gros ou multi fonction par ex 4 | Pour bien utiliser cette structure merci d'essayer de lire tous les fichiers pour être à l'aise par la suite avec la structure 5 | 6 | ## 🌍 Prérequis 7 | 8 | Il faudra pour cette branche 9 | - Un assez bon niveau en JavaScript 10 | - Maitrisez les **classes** (Impérativement) 11 | 12 | 13 | ## 🚀 Installation 14 | 15 | - Mettre une star ⭐ 16 | - Cloner le repository 17 | - Copier et mettre à jour le fichier `.env.example` et le renommer en `.env` 18 | - Exécuter `make start` pour lancer le bot et sa base de données 19 | - Installer les devDependencies avec `npm install` pour votre IDE 20 | 21 | > Note pour les utilisateurs de Windows : Vous pouvez exécuter les commandes `make` en utilisant WSL (Windows Subsystem for Linux) ou en utilisant Git Bash. Vous pouvez également exécuter les commandes manuellement ou installer make via Chocolatey (https://chocolatey.org/install) puis `choco install make`. 22 | 23 | ## 😸 Développement 24 | 25 | ### Migrations & Base de données 26 | Lorsque vous développez, vous devrez peut-être modifier le schéma de la base de données. Pour cela, vous devrez suivre ces étapes : 27 | - Modifier le `schema.prisma` pour ajouter ou modifier des tables 28 | - Exécuter la commande `make prisma-migrate` afin de créer une nouvelle migration et de générer les fichiers nécessaires à l'autocomplétion de Prisma 29 | 30 | > **ATTENTION :** Si vous oubliez de créer une migration, le bot peut ne pas démarrer correctement. Si le bot ne démarre plus, il est impossible d'exécuter la commande `make prisma-migrate`. 31 | > Pour résoudre ce problème, commentez les lignes de code qui causent l'erreur, exécutez la commande `make prisma-migrate` et décommentez les lignes de code. 32 | 33 | 34 | ## Crédits 35 | 36 | - Ca serait sympathique de votre par de mettre sur une commande (botinfo/crédits/help) que vous utiliser cette structure 37 | - Cette structure a été faites par Ota et en partie par Warix 38 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "bot": { 3 | "token": "", 4 | "ownersIDs": ["OWNER_ID"] 5 | }, 6 | "mainLang": "fr", 7 | "testGuild": "490839183275982849" 8 | } 9 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | name: discord-bot-structure 2 | 3 | services: 4 | bot-structure-database: 5 | container_name: bot-structure-database 6 | image: mysql:8.0 7 | ports: 8 | - "6633:3306" 9 | hostname: bot-structure-database 10 | env_file: 11 | - .env 12 | environment: 13 | MYSQL_DATABASE: bot 14 | volumes: 15 | - mysql_data:/var/lib/mysql 16 | networks: 17 | - bot-structure 18 | 19 | bot-structure-node: 20 | container_name: bot-structure-node 21 | depends_on: 22 | - bot-structure-database 23 | build: 24 | context: . 25 | dockerfile: docker/bot/Dockerfile 26 | volumes: 27 | - ./src:/home/node/src 28 | - .env:/home/node/.env 29 | - ./main.ts:/home/node/main.ts 30 | - ./tsconfig.json:/home/node/tsconfig.json 31 | - ./package.json:/home/node/package.json 32 | # Prisma schema and migrations need to be mounted for your IDE 33 | - ./prisma:/home/node/prisma 34 | - ./node_modules/.prisma:/home/node/node_modules/.prisma 35 | networks: 36 | - bot-structure 37 | 38 | networks: 39 | bot-structure: 40 | driver: bridge 41 | 42 | volumes: 43 | mysql_data: 44 | -------------------------------------------------------------------------------- /docker/bot/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:21 2 | RUN apt-get update 3 | 4 | # Create app directory 5 | RUN mkdir -p /home/node/node_modules && chown -R node:node /home/node 6 | WORKDIR /home/node 7 | 8 | # Copy app source 9 | COPY --chown=node:node . . 10 | 11 | # Switch to node user 12 | USER node 13 | 14 | # Install app dependencies and download translation files 15 | RUN npm install 16 | ARG CACHEBUST=1 17 | 18 | # Start the app 19 | ENTRYPOINT ["npm", "run", "entrypoint"] -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import typescriptEslint from "@typescript-eslint/eslint-plugin"; 2 | import tsParser from "@typescript-eslint/parser"; 3 | import path from "node:path"; 4 | import { fileURLToPath } from "node:url"; 5 | import js from "@eslint/js"; 6 | import { FlatCompat } from "@eslint/eslintrc"; 7 | 8 | const __filename = fileURLToPath(import.meta.url); 9 | const __dirname = path.dirname(__filename); 10 | const compat = new FlatCompat({ 11 | baseDirectory: __dirname, 12 | recommendedConfig: js.configs.recommended, 13 | allConfig: js.configs.all 14 | }); 15 | 16 | export default [{ 17 | ignores: ["**/node_modules", "**/dist"], 18 | }, ...compat.extends( 19 | "eslint:recommended", 20 | "plugin:@typescript-eslint/eslint-recommended", 21 | "plugin:@typescript-eslint/recommended", 22 | ), { 23 | plugins: { 24 | "@typescript-eslint": typescriptEslint, 25 | }, 26 | 27 | languageOptions: { 28 | parser: tsParser, 29 | }, 30 | 31 | rules: { 32 | "object-literal-sort-keys": 0, 33 | "interface-name": 0, 34 | "no-empty": 0, 35 | "no-console": 0, 36 | radix: 0, 37 | semi: 2, 38 | "no-unused-vars": 1, 39 | "no-unused-expressions": 1, 40 | quotes: 2, 41 | }, 42 | }]; -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import Bot from "./main"; 4 | 5 | new Bot(); -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // On récupère des classes ici 4 | import { Client, IntentsBitField, Partials } from "discord.js"; 5 | import CommandsManager from "./src/utils/CommandsManager"; 6 | import EventsManager from "./src/utils/EventsManager.js"; 7 | import Logger from "./src/utils/Logger"; 8 | import * as config from "./config.json"; 9 | import { ConfigFile } from "./src/utils/Constants"; 10 | import "dotenv/config"; 11 | 12 | // Création de notre classe Bot qui est la principale et qui est étendu de Client 13 | class Bot extends Client { 14 | config: ConfigFile; 15 | logger: Logger; 16 | events: EventsManager; 17 | commands!: CommandsManager; 18 | 19 | constructor() { 20 | // On passe les options à la classe Client : https://discord.js.org/#/docs/main/stable/class/Client 21 | // Listes des options : https://discord.js.org/#/docs/main/stable/typedef/ClientOptions 22 | super({ 23 | partials: [Partials.Channel], 24 | intents: [ 25 | IntentsBitField.Flags.Guilds, 26 | IntentsBitField.Flags.GuildMessages, 27 | IntentsBitField.Flags.GuildMembers, 28 | IntentsBitField.Flags.GuildBans, 29 | IntentsBitField.Flags.GuildMessageReactions, 30 | IntentsBitField.Flags.GuildIntegrations, 31 | IntentsBitField.Flags.GuildWebhooks, 32 | IntentsBitField.Flags.GuildEmojisAndStickers, 33 | IntentsBitField.Flags.GuildVoiceStates, 34 | IntentsBitField.Flags.DirectMessages, 35 | IntentsBitField.Flags.DirectMessageReactions, 36 | IntentsBitField.Flags.DirectMessageTyping, 37 | IntentsBitField.Flags.GuildScheduledEvents, 38 | IntentsBitField.Flags.GuildPresences, 39 | IntentsBitField.Flags.GuildMessageTyping, 40 | IntentsBitField.Flags.GuildMessages 41 | ] 42 | }); 43 | this.config = config; // récupérer la config 44 | // on définit notre logger comme ca on a la date dans la console et des couleurs 45 | this.logger = new Logger(`Shard #${this.shard?.ids?.toString() ?? "0"}`); 46 | // regarder aux classes suivantes pour + d'infos 47 | this.events = new EventsManager(this); 48 | 49 | this.launch() 50 | .then(() => { 51 | this.commands = new CommandsManager(this); 52 | // On load nos commandes 53 | this.commands 54 | .loadCommands() 55 | .then(() => { 56 | this.logger.success(`[Commands] Loaded ${this.commands?.commands.size} commands`); 57 | this.logger.success("All was successfuly launched"); 58 | }) 59 | .catch(error => { 60 | this.logger.error( 61 | `[CommandLoadError] An error occured when loading commands ${error}`, 62 | error.stack 63 | ); 64 | }); 65 | }) 66 | .catch(error => { 67 | this.logger.error(`[LaunchError] An error occured at startup ${error}`, error.stack); 68 | }); 69 | } 70 | 71 | async launch() { 72 | // On load nos events 73 | await this.events.loadEvent(); 74 | this.logger.success(`[Events] Loaded ${this.events.events.size} events`); 75 | 76 | try { 77 | await this.login(process.env.TOKEN); 78 | this.logger.success("[WS] Connected to discord"); 79 | } catch (error) { 80 | this.logger.error(`[WS] Connection error: ${error}`); 81 | return process.exit(1); 82 | } 83 | } 84 | } 85 | 86 | process.on("uncaughtException", console.error); 87 | process.on("unhandledRejection", console.error); 88 | 89 | export default Bot; 90 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discord.js-bot-structure", 3 | "version": "1.0.0", 4 | "description": "A useful discord.js-bot-structure", 5 | "main": "main.ts", 6 | "scripts": { 7 | "test": "tsc --noEmit", 8 | "compile": "tsc", 9 | "watch": "tsc --watch", 10 | "start": "tsc && node dist/shards.js", 11 | "entrypoint": "npx prisma migrate deploy && npx prisma generate && tsc && node dist/shards.js", 12 | "dev": "node dist/index.js", 13 | "lint": "eslint .", 14 | "prettier": "prettier --check **/*.ts", 15 | "check": "yarn lint && yarn prettier && yarn test", 16 | "format": "prettier --write **/*.ts" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/warix8/discord.js-bot-structure.git" 21 | }, 22 | "author": "Warix", 23 | "license": "ISC", 24 | "bugs": { 25 | "url": "https://github.com/warix8/discord.js-bot-structure/issues" 26 | }, 27 | "homepage": "https://github.com/warix8/discord.js-bot-structure#readme", 28 | "contributors": [ 29 | "Warix", 30 | "Ota" 31 | ], 32 | "node": ">=16.6.0", 33 | "dependencies": { 34 | "@prisma/client": "^5.22.0", 35 | "asciiart-logo": "^0.2.7", 36 | "discord.js": "^14.16.3", 37 | "dotenv": "^16.4.5" 38 | }, 39 | "devDependencies": { 40 | "@types/node": "^22.13.1", 41 | "@typescript-eslint/eslint-plugin": "^8.15.0", 42 | "@typescript-eslint/parser": "^8.15.0", 43 | "eslint": "^9.15.0", 44 | "eslint-config-prettier": "^9.1.0", 45 | "prettier": "^3.3.3", 46 | "prisma": "^5.22.0", 47 | "typescript": "^5.6.3" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /prisma/migrations/20241205223939_/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `Guild` ( 3 | `id` VARCHAR(191) NOT NULL, 4 | `logs_channel` VARCHAR(191) NULL, 5 | `addedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), 6 | `updatedAt` DATETIME(3) NOT NULL, 7 | 8 | PRIMARY KEY (`id`) 9 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 10 | -------------------------------------------------------------------------------- /prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "mysql" -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "mysql" 10 | url = env("DATABASE_URL") 11 | } 12 | 13 | model Guild { 14 | id String @id 15 | logs_channel String? 16 | addedAt DateTime @default(now()) 17 | updatedAt DateTime @updatedAt 18 | } 19 | -------------------------------------------------------------------------------- /shards.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { ShardingManager } from "discord.js"; 4 | // eslint-disable-next-line @typescript-eslint/ban-ts-comment 5 | // @ts-ignore 6 | import logo from "asciiart-logo"; 7 | import Logger from "./src/utils/Logger"; 8 | import "dotenv/config"; 9 | import * as botPackage from "./package.json"; 10 | 11 | const shardManagerLogger: Logger = new Logger("ShardingManager"); 12 | 13 | console.debug(botPackage.version); 14 | 15 | shardManagerLogger.info(logo(botPackage).render()); 16 | shardManagerLogger.info("Sharding manager starting !"); 17 | 18 | const processArgs = process.argv.slice(2); 19 | 20 | new ShardingManager("./dist/index.js", { 21 | respawn: true, 22 | totalShards: 23 | processArgs && parseInt(processArgs[1]) && processArgs[0] === "--shard" ? parseInt(processArgs[1]) : "auto", 24 | token: process.env.TOKEN 25 | }) 26 | .on("shardCreate", shard => { 27 | shardManagerLogger.info(`Creating Shard #${shard.id}`); 28 | }) 29 | .spawn() 30 | .then(() => { 31 | shardManagerLogger.success("All shards are launched !"); 32 | }) 33 | .catch(err => { 34 | shardManagerLogger.error("An error has occurred ! " + err); 35 | return process.exit(1); 36 | }); 37 | -------------------------------------------------------------------------------- /src/commands/admin/SetLogsChannel.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { ApplicationCommandOptionType, ApplicationCommandType, ChannelType, ChatInputCommandInteraction, PermissionsBitField } from "discord.js"; 4 | import Command from "../../utils/Command"; 5 | import { CachedGuildContext } from "../../utils/Context"; 6 | 7 | export default class SetLogsChannel extends Command { 8 | constructor() { 9 | super({ 10 | type: ApplicationCommandType.ChatInput, 11 | name: "setlogschannel", 12 | category: "utils", 13 | description: "Displays the bot informations.", 14 | options: [{ 15 | type: ApplicationCommandOptionType.Channel, 16 | name: "channel", 17 | description: "Logs channel", 18 | required: true, 19 | channelTypes: [ChannelType.GuildText] 20 | }], 21 | userPerms: [PermissionsBitField.Flags.ManageGuild], 22 | }); 23 | } 24 | 25 | async run(ctx: CachedGuildContext>) { 26 | 27 | const channel = ctx.args.getChannel("channel", true, [ChannelType.GuildText]); 28 | 29 | await ctx.updateGuildSettings({ 30 | logs_channel: channel.id 31 | }); 32 | 33 | await ctx.reply(`Logs channel set to ${channel}`); 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/commands/utils/BotInfo.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { ApplicationCommandType, Collection } from "discord.js"; 4 | import Command from "../../utils/Command"; 5 | import { BaseContext } from "../../utils/Context"; 6 | 7 | export default class Botinfo extends Command { 8 | constructor() { 9 | super({ 10 | type: ApplicationCommandType.ChatInput, 11 | name: "botinfo", 12 | category: "utils", 13 | description: "Displays the bot informations.", 14 | options: [], 15 | testCmd: true 16 | }); 17 | } 18 | 19 | async run(ctx: BaseContext) { 20 | const [guilds, users] = (await Promise.all([ 21 | ctx.shards.fetchClientValues("guilds.cache.size"), 22 | ctx.shards.fetchClientValues("users.cache.size") 23 | ])) as unknown as [Collection, Collection]; 24 | 25 | const ram = (await ctx.client.shard.broadcastEval(() => 26 | (process.memoryUsage().heapUsed / 1024 / 1024).toFixed(1) 27 | )) as unknown as Collection; 28 | 29 | ctx.reply({ 30 | embeds: [ 31 | { 32 | thumbnail: { 33 | url: ctx.client.user.displayAvatarURL({ size: 512 }) 34 | }, 35 | title: "Bot info", 36 | fields: [ 37 | { 38 | name: "Serveurs", 39 | value: "`" + guilds.reduce((acc, count) => acc + count, 0) + "`", 40 | // value: "`" + guilds.reduce((acc, guild) => acc + count, 0) + "`", 41 | inline: true 42 | }, 43 | { 44 | name: "Utilisateurs", 45 | value: "`" + users.reduce((acc, count) => acc + count, 0) + "`", 46 | inline: true 47 | }, 48 | { 49 | name: "Ram", 50 | value: 51 | "`" + 52 | `Heap: ${ram.reduce( 53 | (acc, memoryUsage) => acc + memoryUsage.heapUsed, 54 | 0 55 | )}\nRSS: ${ram.reduce((acc, memoryUsage) => acc + memoryUsage.rss, 0)}MB` + 56 | "`", 57 | inline: true 58 | }, 59 | { 60 | name: "Shards", 61 | value: "`" + ctx.shards.count + "`", 62 | inline: true 63 | }, 64 | { 65 | name: "Bot Structure", 66 | value: "[Github Source](https://github.com/warix8/discord.js-bot-structure#readme)", 67 | inline: true 68 | }, 69 | { 70 | name: "Durée de fonctionnement", 71 | value: "`" + (ctx.client.uptime / 60000).toFixed(2) + "min`" 72 | } 73 | ] 74 | } 75 | ] 76 | }); 77 | } 78 | } -------------------------------------------------------------------------------- /src/commands/utils/Help.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import Command from "../../utils/Command.js"; 4 | import { ApplicationCommandOptionType, ApplicationCommandType, ChatInputCommandInteraction, PermissionsBitField } from "discord.js"; 5 | import { BaseContext } from "../../utils/Context.js"; 6 | 7 | export default class Help extends Command { 8 | constructor() { 9 | super({ 10 | type: ApplicationCommandType.ChatInput, 11 | name: "help", 12 | category: "utils", 13 | description: "Display all the commands of the bot", 14 | options: [ 15 | { 16 | type: ApplicationCommandOptionType.String, 17 | name: "command", 18 | description: "Get the help of this command", 19 | required: false 20 | } 21 | ], 22 | userPerms: [PermissionsBitField.Flags.BanMembers, PermissionsBitField.Flags.KickMembers], 23 | examples: ["help", "help botinfo"] 24 | }); 25 | } 26 | 27 | async run(ctx: BaseContext) { 28 | if (ctx.args.getString("command")) { 29 | const command: Command | undefined = ctx.client.commands.findCommand( 30 | ctx.args?.getString("command")?.toLowerCase() 31 | ); 32 | if (!command) return ctx.reply(`The command \`${ctx.args.getString("command")}\` doesn't exist.`); 33 | 34 | return ctx.reply({ 35 | embeds: [ 36 | { 37 | title: "Help", 38 | description: command.description, 39 | fields: [ 40 | { 41 | name: "Options", 42 | value: " no " /*command.options.length > 0 43 | ? command.options.map((x) => `\`${x?. ? "(" : "<"}${x.name}:${x.type.toString().toLowerCase()}${x?.required ? ")" : ">"}\``).join("\n") 44 | : "No options",*/, 45 | inline: true 46 | }, 47 | { 48 | name: "Examples", 49 | value: 50 | command.examples.length > 0 51 | ? command.examples.map(x => "`" + x + "`").join("\n") 52 | : "No examples", 53 | inline: true 54 | } 55 | ] 56 | } 57 | ] 58 | }); 59 | } 60 | 61 | const category: string[] = []; 62 | 63 | ctx.client.commands.commands.each((command: Command) => { 64 | if (!category.includes(command.category) && !command.disabled) { 65 | category.push(command.category); 66 | } 67 | }); 68 | 69 | ctx.reply({ 70 | embeds: [ 71 | { 72 | title: "Help", 73 | thumbnail: { 74 | url: ctx.client.user.displayAvatarURL({ size: 512 }) 75 | }, 76 | description: 77 | "Here is the list of my commands.\nExample:\n`/ Execute a command.`\n`/help Help of a command.`\n[Bot Structure](https://github.com/warix8/discord.js-bot-structure#readme)\n", 78 | fields: category.map(x => { 79 | return { 80 | name: x, 81 | value: ctx.client.commands.commands 82 | .filter((cmd: Command) => cmd.category === x && !cmd.testCmd) 83 | .map((cmd: Command) => `\`${cmd.name}\``) 84 | .join(", ") 85 | }; 86 | }), 87 | timestamp: new Date().toISOString(), 88 | footer: { 89 | text: ctx.client.user.username, 90 | icon_url: ctx.client.user.avatarURL() 91 | } 92 | } 93 | ] 94 | }); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/events/InteractionCreate.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { Events, Interaction } from "discord.js"; 4 | import CommandService from "../services/CommandService"; 5 | import DiscordEvent from "../utils/DiscordEvent"; 6 | import Bot from "../../main"; 7 | 8 | /* 9 | L'évent interactionCreate n'est pas long car en faites les tâches sont répartis dans le dossier services prenez exemple sur CommandService ;) 10 | */ 11 | 12 | export default class InteractionCreate extends DiscordEvent { 13 | commands: CommandService; 14 | constructor(client: Bot) { 15 | super(client, Events.InteractionCreate); 16 | this.client = client; 17 | this.commands = new CommandService(this.client); 18 | } 19 | 20 | async run(interaction: Interaction) { 21 | if (interaction.isCommand()) await this.commands.handle(interaction); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/services/CommandService.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import Bot from "../../main"; 4 | import { CommandInteraction } from "discord.js"; 5 | import { BaseContext, CachedGuildContext } from "../utils/Context"; 6 | import prisma from "../utils/PrismaClient"; 7 | 8 | class CommandService { 9 | client: Bot; 10 | constructor(client: Bot) { 11 | this.client = client; 12 | } 13 | 14 | async handle(interaction: CommandInteraction) { 15 | const command = this.client.commands.findCommand(interaction.commandName); 16 | 17 | if (!command) return; 18 | 19 | if (command.ownerOnly && !this.client.config.bot.ownersIDs.includes(interaction.user.id)) { 20 | return interaction.reply("You can't use this command, it's for my creator."); 21 | } 22 | 23 | let ctx; 24 | if (interaction.inCachedGuild()) { 25 | 26 | const guild = interaction.guild; 27 | const channelBotPerms = interaction.channel?.permissionsFor(guild.members.me); 28 | 29 | if (!guild.members.me.permissions.has("EmbedLinks") || !channelBotPerms.has("EmbedLinks")) 30 | return interaction.reply("The bot must have the `EMBED_LINKS` permissions to work properly !"); 31 | 32 | // Si le bot manques de permissions 33 | if ( 34 | command.botPerms.length > 0 && 35 | !command.botPerms.every(p => guild.members.me.permissions.has(p) && channelBotPerms.has(p)) 36 | ) { 37 | return interaction.reply( 38 | `The bot must have \`${command.botPerms.join("`, `")}\` permissions to execute this command.` 39 | ); 40 | } 41 | 42 | // Si la commande est désactivée 43 | if (command.disabled && !this.client.config.bot.ownersIDs.includes(interaction.user.id)) { 44 | return interaction.reply("Sorry but this command is temporarly disabled."); 45 | } 46 | 47 | const guildSettings = await prisma.guild.upsert({ 48 | where: { 49 | id: guild.id 50 | }, 51 | create: { 52 | id: guild.id 53 | }, 54 | update: {}, 55 | }); 56 | 57 | ctx = new CachedGuildContext(this.client, interaction, guildSettings); 58 | 59 | 60 | } else { 61 | ctx = new BaseContext(this.client, interaction); 62 | } 63 | 64 | this.client.logger.info( 65 | `Command ${command.name} executed by ${ctx.author.username}` 66 | ); 67 | await command.run(ctx).catch(error => { 68 | if (interaction.replied || interaction.deferred) { 69 | interaction.editReply("Sorry but, an error occured."); 70 | } else { 71 | interaction.reply("Sorry but, an error occured."); 72 | } 73 | this.client.logger.error(error); 74 | }); 75 | } 76 | } 77 | 78 | export default CommandService; 79 | -------------------------------------------------------------------------------- /src/utils/Command.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { ApplicationCommandOptionData, ApplicationCommandType, ApplicationIntegrationType, BaseApplicationCommandData, ChatInputApplicationCommandData, InteractionContextType, MessageApplicationCommandData, PermissionResolvable, PermissionsBitField, UserApplicationCommandData } from "discord.js"; 4 | import { BaseContext } from "./Context"; 5 | 6 | /* 7 | La classe commandes très utiles surtout utilisez les paramètres ci-dessous pour vous simplifier la vie 8 | Au lieu de mettre member.hasPermissions à plein d'endroit le bot executera des test en fonction des options de votre commandes ! 9 | */ 10 | 11 | interface CommandInfo { 12 | type: ApplicationCommandType; 13 | name: string; 14 | description: string; 15 | category: string; 16 | options?: ApplicationCommandOptionData[]; 17 | examples?: string[]; 18 | userPerms?: bigint[]; 19 | botPerms?: bigint[]; 20 | disabled?: boolean; 21 | ownerOnly?: boolean; 22 | guildOnly?: boolean; 23 | testCmd?: boolean; 24 | nsfw?: boolean; 25 | descriptionLocalizations?: Record; 26 | nameLocalizations?: Record; 27 | integrationTypes?: ApplicationIntegrationType[]; 28 | contexts?: InteractionContextType[]; 29 | } 30 | 31 | export default abstract class Command { 32 | type: ApplicationCommandType; 33 | name: string; 34 | description: string; 35 | category: string; 36 | options: ApplicationCommandOptionData[]; 37 | examples: string[]; 38 | userPerms: PermissionResolvable; 39 | botPerms: bigint[]; 40 | disabled: boolean; 41 | ownerOnly: boolean; 42 | guildOnly: boolean; 43 | testCmd: boolean; 44 | nsfw: boolean; 45 | descriptionLocalizations: Record; 46 | nameLocalizations: Record; 47 | integrationTypes: ApplicationIntegrationType[]; 48 | contexts: InteractionContextType[]; 49 | constructor(info: CommandInfo) { 50 | this.type = info.type || ApplicationCommandType.ChatInput; 51 | this.name = info.name; 52 | this.category = info.category; 53 | this.description = info.description; 54 | this.options = info.options || []; 55 | this.examples = info.examples || []; 56 | this.descriptionLocalizations = info.descriptionLocalizations || {}; 57 | this.nameLocalizations = info.nameLocalizations || {}; 58 | 59 | this.userPerms = (info.userPerms?.length && info.userPerms.length > 0)? new PermissionsBitField(info.userPerms) : undefined; 60 | this.botPerms = info.botPerms || []; 61 | this.disabled = info.disabled || false; 62 | this.ownerOnly = info.ownerOnly || false; 63 | this.guildOnly = info.guildOnly || false; 64 | this.testCmd = info.testCmd || false; 65 | this.nsfw = info.nsfw || false; 66 | // this.cooldown = info.cooldown || 0; Si vous voulez faire votre système de cooldown ;) 67 | 68 | this.integrationTypes = info.integrationTypes || [ApplicationIntegrationType.GuildInstall]; 69 | this.contexts = info.contexts || [InteractionContextType.Guild]; 70 | } 71 | 72 | // eslint-disable-next-line no-unused-vars 73 | abstract run(ctx: BaseContext): Promise; 74 | 75 | get commandData(): ChatInputApplicationCommandData | MessageApplicationCommandData | UserApplicationCommandData { 76 | const base: BaseApplicationCommandData = { 77 | name: this.name, 78 | contexts: this.contexts, 79 | integrationTypes: this.integrationTypes, 80 | nameLocalizations: this.nameLocalizations, 81 | nsfw: this.nsfw 82 | }; 83 | if (this.userPerms) { 84 | Object.assign(base, { 85 | defaultMemberPermissions: this.userPerms, 86 | }); 87 | } 88 | if (this.type === ApplicationCommandType.ChatInput) { 89 | return { 90 | ...base, 91 | type: ApplicationCommandType.ChatInput, 92 | description: this.description, 93 | options: this.options, 94 | 95 | }; 96 | } else if (this.type === ApplicationCommandType.Message) { 97 | return { 98 | ...base, 99 | type: ApplicationCommandType.Message, 100 | }; 101 | } else { 102 | return { 103 | ...base, 104 | type: ApplicationCommandType.User, 105 | }; 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/utils/CommandsManager.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | // ici on gère nos commandes pour les charger ou en trouver une avec la fonction findCommand pour une command help 4 | 5 | import Bot from "../../main"; 6 | import { resolve } from "path"; 7 | import { Collection, ApplicationCommandManager } from "discord.js"; 8 | import { access, readdir, stat } from "fs/promises"; 9 | import Command from "./Command"; 10 | 11 | class CommandsManager { 12 | private _client: Bot; 13 | private _commands: Collection; 14 | private _path: string; 15 | private _globalCommands: ApplicationCommandManager; 16 | constructor(client: Bot) { 17 | this._client = client; 18 | this._commands = new Collection(); 19 | this._path = resolve(__dirname, "..", "commands"); 20 | if (!this._client.application) throw new Error("Appication is null"); 21 | this._globalCommands = this._client.application.commands; 22 | } 23 | 24 | get commands() { 25 | return this._commands; 26 | } 27 | 28 | addCommand(command: Command) { 29 | this._commands.set(command.name.toLowerCase(), command); 30 | } 31 | 32 | findCommand(name: string) { 33 | if (!name || typeof name !== "string") return undefined; 34 | return this._commands.find(cmd => { 35 | return cmd.name.toLowerCase() === name.toLowerCase(); 36 | }); 37 | } 38 | 39 | async loadCommands() { 40 | try { 41 | await access(this._path); 42 | } catch (error) { 43 | return console.error(error); 44 | } 45 | 46 | await this._globalCommands.fetch(); 47 | 48 | const categorys = await readdir(this._path); 49 | 50 | if (!categorys || categorys.length > 0) { 51 | for (const category of categorys) { 52 | const path = resolve(this._path, category); 53 | const stats = await stat(path); 54 | 55 | if (stats.isDirectory()) { 56 | const commands = await readdir(path); 57 | 58 | if (commands && commands.length > 0) { 59 | for (const command of commands) { 60 | const cmdPath = resolve(path, command); 61 | const cmdStats = await stat(cmdPath); 62 | 63 | if (cmdStats.isFile() && command.endsWith(".js")) { 64 | // eslint-disable-next-line @typescript-eslint/no-require-imports 65 | this.addCommand(new (require(cmdPath).default)()); 66 | } 67 | } 68 | } 69 | } 70 | } 71 | } 72 | 73 | await this._globalCommands.set( 74 | this._commands.filter(cmd => cmd.testCmd).map(cmd => cmd.commandData), 75 | this._client.config.testGuild 76 | ); 77 | 78 | await this._globalCommands.set(this._commands.filter(cmd => !cmd.testCmd).map(cmd => cmd.commandData)); 79 | } 80 | } 81 | 82 | export default CommandsManager; 83 | -------------------------------------------------------------------------------- /src/utils/Constants.ts: -------------------------------------------------------------------------------- 1 | export interface ConfigFile { 2 | bot: { 3 | token: string; 4 | ownersIDs: string[]; 5 | }; 6 | mainLang: string; 7 | testGuild: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/Context.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { 4 | CommandInteraction, 5 | ShardClientUtil, 6 | User, 7 | InteractionReplyOptions, 8 | MessagePayload, 9 | InteractionDeferReplyOptions, 10 | WebhookFetchMessageOptions} from "discord.js"; 11 | import Bot from "../../main"; 12 | import { Guild, Prisma } from "@prisma/client"; 13 | import prisma from "./PrismaClient"; 14 | 15 | /* 16 | Ca va paraitre énervent au début mais c'est super utile ! Au lieu de faire à chaque fois dans vos commandes 17 | Au lieu de message, ou client ca sera -> ctx.message ou ctx.client 18 | Avantages: 19 | Au lieu de faire message.guild.members.cache.get(message.author.id); dans vos commandes 20 | ctx.member; utile non ? 21 | remplacer aussi ctx.message.channel.send() par ctx.send(); ! 22 | */ 23 | /*class Context { 24 | interaction: CommandInteraction; 25 | client: Bot; 26 | args: CommandInteractionOptionResolver; 27 | lang: string; 28 | 29 | constructor(client: Bot, interaction: CommandInteraction) { 30 | this.interaction = interaction; 31 | this.client = client; 32 | this.args = ( 33 | interaction instanceof CommandInteraction ? interaction.options : null 34 | ) as CommandInteractionOptionResolver; 35 | this.lang = client.config.mainLang; 36 | } 37 | get shards(): ShardClientUtil { 38 | if (!this.client?.shard) throw new Error("Shard non trouvable"); 39 | return this.client.shard; 40 | } 41 | 42 | get guild(): Guild { 43 | if (!this.interaction.guild) throw new Error("Not a guild"); 44 | return this.interaction.guild; 45 | } 46 | 47 | get channel(): TextBasedChannel { 48 | if (this.interaction.channel.isTextBased()) throw new Error("Not a text channel"); 49 | return this.interaction.channel; 50 | } 51 | 52 | get author(): User { 53 | return this.interaction.user; 54 | } 55 | 56 | get member(): GuildMember { 57 | return this.interaction.member instanceof GuildMember 58 | ? this.interaction.member 59 | : this.guild.members.cache.get(this.interaction.member.user.id); 60 | } 61 | 62 | get me(): GuildMember { 63 | return this.guild.members.me; 64 | } 65 | 66 | reply(content: string | MessagePayload | InteractionReplyOptions) { 67 | return this.interaction.reply(content); // for embed or file or simple message 68 | } 69 | 70 | deferReply(options?: InteractionDeferReplyOptions) { 71 | this.interaction.deferReply(options); 72 | } 73 | 74 | followUp(content: string | MessagePayload | InteractionReplyOptions) { 75 | return this.interaction.followUp(content); 76 | } 77 | 78 | editReply(content: string | MessagePayload | WebhookFetchMessageOptions) { 79 | return this.interaction.editReply(content); 80 | } 81 | 82 | deleteReply(): Promise { 83 | return this.interaction.deleteReply(); 84 | } 85 | }*/ 86 | 87 | export class BaseContext { 88 | interaction: Interaction; 89 | client: Bot; 90 | lang: string; 91 | 92 | constructor(client: Bot, interaction: Interaction) { 93 | this.interaction = interaction; 94 | this.client = client; 95 | this.lang = interaction.locale; 96 | } 97 | get shards(): ShardClientUtil { 98 | if (!this.client?.shard) throw new Error("Shard non trouvable"); 99 | return this.client.shard; 100 | } 101 | 102 | get author(): User { 103 | return this.interaction.user; 104 | } 105 | 106 | get args(): Interaction["options"] { 107 | return this.interaction.options; 108 | } 109 | 110 | reply(content: string | MessagePayload | InteractionReplyOptions) { 111 | return this.interaction.reply(content); // for embed or file or simple message 112 | } 113 | 114 | deferReply(options?: InteractionDeferReplyOptions) { 115 | this.interaction.deferReply(options); 116 | } 117 | 118 | followUp(content: string | MessagePayload | InteractionReplyOptions) { 119 | return this.interaction.followUp(content); 120 | } 121 | 122 | editReply(content: string | MessagePayload | WebhookFetchMessageOptions) { 123 | return this.interaction.editReply(content); 124 | } 125 | 126 | deleteReply(): Promise { 127 | return this.interaction.deleteReply(); 128 | } 129 | 130 | translate(key: string) { 131 | return key; // To implement 132 | } 133 | } 134 | 135 | // Put your database stuff here like guild settings 136 | export class CachedGuildContext> extends BaseContext { 137 | guildSettings: Guild; 138 | constructor(client: Bot, interaction: Interaction, guildSettings: Guild) { 139 | super(client, interaction); 140 | this.guildSettings = guildSettings; 141 | } 142 | 143 | get guild() { 144 | return this.interaction.guild; 145 | } 146 | 147 | get me() { 148 | return this.guild.members.me; 149 | } 150 | 151 | get member() { 152 | return this.interaction.member; 153 | } 154 | 155 | get channel() { 156 | return this.interaction.channel; 157 | } 158 | 159 | async updateGuildSettings(data: Prisma.GuildUpdateInput) { 160 | this.guildSettings = await prisma.guild.update({ 161 | where: { id: this.guild.id }, 162 | data 163 | }); 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /src/utils/DiscordEvent.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import { ClientEvents } from "discord.js"; 4 | import Bot from "../../main"; 5 | 6 | abstract class DiscordEvent { 7 | client: Bot; 8 | name: Event; 9 | // eslint-disable-next-line no-unused-vars 10 | public abstract run(...args: ClientEvents[Event]): Promise | void; 11 | constructor(client: Bot, name: Event) { 12 | if (this.constructor === DiscordEvent) throw new Error("Event class is an abstract class"); 13 | this.client = client; 14 | this.name = name; 15 | } 16 | } 17 | 18 | export default DiscordEvent; 19 | -------------------------------------------------------------------------------- /src/utils/EventsManager.ts: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | import Bot from "../../main"; 4 | import { ClientEvents, Collection } from "discord.js"; 5 | import { resolve } from "path"; 6 | import type DiscordEvent from "./DiscordEvent"; 7 | 8 | // ici on gère nos events pour les charger etc. 9 | 10 | import { access, readdir, stat } from "fs/promises"; 11 | 12 | class EventsManager { 13 | private _client: Bot; 14 | private _events: Collection>; 15 | private _path: string; 16 | 17 | constructor(client: Bot) { 18 | this._client = client; 19 | this._events = new Collection(); 20 | this._path = resolve(__dirname, "..", "events"); 21 | } 22 | 23 | get events(): Collection> { 24 | return this._events; 25 | } 26 | 27 | addEvent(event: DiscordEvent) { 28 | this._events.set(event.name.toLowerCase(), event); 29 | this._client.on(event.name, event.run.bind(event)); 30 | } 31 | 32 | async loadEvent() { 33 | try { 34 | await access(this._path); 35 | } catch (error) { 36 | return console.error(error); 37 | } 38 | 39 | const events = await readdir(this._path); 40 | 41 | if (events && events.length > 0) { 42 | for (const event of events) { 43 | const path = resolve(this._path, "", event); 44 | const stats = await stat(path); 45 | 46 | if (event !== "Event.js" && stats.isFile() && event.endsWith(".js")) { 47 | // eslint-disable-next-line @typescript-eslint/no-require-imports 48 | this.addEvent(new (require(path).default)(this._client)); 49 | delete require.cache[require.resolve(path)]; 50 | } 51 | } 52 | } 53 | } 54 | } 55 | 56 | export default EventsManager; 57 | -------------------------------------------------------------------------------- /src/utils/Logger.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-expressions */ 2 | /* eslint-disable no-unused-vars */ 3 | /* eslint-disable @typescript-eslint/no-unused-expressions */ 4 | /* eslint-disable @typescript-eslint/no-unused-vars */ 5 | 6 | "use strict"; 7 | 8 | declare global { 9 | interface Console { 10 | success(...args: unknown[]): void; 11 | } 12 | } 13 | 14 | type LoggerTypes = "log" | "info" | "success" | "debug" | "warn" | "error"; 15 | 16 | class Logger { 17 | loggerTitle: string; 18 | private _types: { [P in LoggerTypes]: string }; 19 | private _originalConsole: Console; 20 | constructor(title: string) { 21 | this.loggerTitle = title; 22 | (this._types = { 23 | log: "\x1b[37m", 24 | info: "\x1b[34m", 25 | success: "\x1b[32m", 26 | debug: "\x1b[35m", 27 | warn: "\x1b[33m", 28 | error: "\x1b[31m" 29 | }), 30 | (this._originalConsole = Object.assign({}, console)); 31 | this._init(); 32 | } 33 | 34 | private _init() { 35 | for (const [type, color] of Object.entries(this._types) as [LoggerTypes, string][]) { 36 | this[type] = (...content: never[]): void => { 37 | this._originalConsole.log( 38 | "\x1b[40m", 39 | this._getDate(), 40 | color, 41 | `[${this.loggerTitle}]`, 42 | ...content, 43 | "\x1b[0m" 44 | ); 45 | }; 46 | console[type] = (...content: never[]): void => { 47 | this[type](...content); 48 | }; 49 | } 50 | } 51 | 52 | log(...content: unknown[]): void { 53 | // do nothing. 54 | } 55 | info(...content: unknown[]): void { 56 | // do nothing. 57 | } 58 | success(...content: unknown[]): void { 59 | // do nothing. 60 | } 61 | debug(...content: unknown[]): void { 62 | // do nothing. 63 | } 64 | warn(...content: unknown[]): void { 65 | // do nothing. 66 | } 67 | error(...content: unknown[]): void { 68 | // do nothing. 69 | } 70 | 71 | private _getDate() { 72 | return `[${new Date(Date.now()).toLocaleString("FR-fr", { timeZone: "Europe/Paris" })}]`; 73 | } 74 | } 75 | 76 | export default Logger; 77 | -------------------------------------------------------------------------------- /src/utils/PrismaClient.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from "@prisma/client"; 2 | 3 | const prisma = new PrismaClient(); 4 | 5 | export default prisma; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "ES2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ 8 | "module": "CommonJS", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ 13 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | "outDir": "./dist", /* Redirect output structure to the directory. */ 18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true, /* Enable all strict type-checking options. */ 29 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | "strictNullChecks": false, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 43 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ 44 | // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ 45 | 46 | /* Module Resolution Options */ 47 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 48 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 49 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 50 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 51 | // "typeRoots": [], /* List of folders to include type definitions from. */ 52 | // "types": [], /* Type declaration files to be included in compilation. */ 53 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 54 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 55 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 56 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 57 | 58 | "resolveJsonModule": true, 59 | 60 | /* Source Map Options */ 61 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 62 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 63 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 64 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 65 | 66 | /* Experimental Options */ 67 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 68 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 69 | 70 | /* Advanced Options */ 71 | "skipLibCheck": true, /* Skip type checking of declaration files. */ 72 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /tsconfigcopy.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": true, 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "target": "ES6", 6 | "module": "CommonJS", 7 | "declaration": true, 8 | "strict": true, 9 | "moduleResolution": "Node", 10 | "resolveJsonModule": true, 11 | "strictNullChecks": false, 12 | "noEmitOnError": true, 13 | "noImplicitAny": true 14 | }, 15 | "include": [ 16 | "root/**/*" 17 | ] 18 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discordjs/builders@^1.9.0": 6 | version "1.9.0" 7 | resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.9.0.tgz#71fa6de91132bd1deaff2a9daea7aa5d5c9f124a" 8 | integrity sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg== 9 | dependencies: 10 | "@discordjs/formatters" "^0.5.0" 11 | "@discordjs/util" "^1.1.1" 12 | "@sapphire/shapeshift" "^4.0.0" 13 | discord-api-types "0.37.97" 14 | fast-deep-equal "^3.1.3" 15 | ts-mixer "^6.0.4" 16 | tslib "^2.6.3" 17 | 18 | "@discordjs/collection@1.5.3": 19 | version "1.5.3" 20 | resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" 21 | integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== 22 | 23 | "@discordjs/collection@^2.1.0", "@discordjs/collection@^2.1.1": 24 | version "2.1.1" 25 | resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.1.1.tgz#901917bc538c12b9c3613036d317847baee08cae" 26 | integrity sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg== 27 | 28 | "@discordjs/formatters@^0.5.0": 29 | version "0.5.0" 30 | resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.5.0.tgz#2d284c4271bc41984339936df1d0164e470f3b7a" 31 | integrity sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g== 32 | dependencies: 33 | discord-api-types "0.37.97" 34 | 35 | "@discordjs/rest@^2.3.0", "@discordjs/rest@^2.4.0": 36 | version "2.4.0" 37 | resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.4.0.tgz#63bfc816af58af844914e3589d7eae609cd199b5" 38 | integrity sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw== 39 | dependencies: 40 | "@discordjs/collection" "^2.1.1" 41 | "@discordjs/util" "^1.1.1" 42 | "@sapphire/async-queue" "^1.5.3" 43 | "@sapphire/snowflake" "^3.5.3" 44 | "@vladfrangu/async_event_emitter" "^2.4.6" 45 | discord-api-types "0.37.97" 46 | magic-bytes.js "^1.10.0" 47 | tslib "^2.6.3" 48 | undici "6.19.8" 49 | 50 | "@discordjs/util@^1.1.0", "@discordjs/util@^1.1.1": 51 | version "1.1.1" 52 | resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.1.1.tgz#bafcde0faa116c834da1258d78ec237080bbab29" 53 | integrity sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g== 54 | 55 | "@discordjs/ws@1.1.1": 56 | version "1.1.1" 57 | resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.1.1.tgz#bffbfd46838258ab09054ed98ddef1a36f6507a3" 58 | integrity sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA== 59 | dependencies: 60 | "@discordjs/collection" "^2.1.0" 61 | "@discordjs/rest" "^2.3.0" 62 | "@discordjs/util" "^1.1.0" 63 | "@sapphire/async-queue" "^1.5.2" 64 | "@types/ws" "^8.5.10" 65 | "@vladfrangu/async_event_emitter" "^2.2.4" 66 | discord-api-types "0.37.83" 67 | tslib "^2.6.2" 68 | ws "^8.16.0" 69 | 70 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 71 | version "4.4.1" 72 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" 73 | integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== 74 | dependencies: 75 | eslint-visitor-keys "^3.4.3" 76 | 77 | "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": 78 | version "4.12.1" 79 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" 80 | integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== 81 | 82 | "@eslint/config-array@^0.19.0": 83 | version "0.19.0" 84 | resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.0.tgz#3251a528998de914d59bb21ba4c11767cf1b3519" 85 | integrity sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ== 86 | dependencies: 87 | "@eslint/object-schema" "^2.1.4" 88 | debug "^4.3.1" 89 | minimatch "^3.1.2" 90 | 91 | "@eslint/core@^0.9.0": 92 | version "0.9.0" 93 | resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.9.0.tgz#168ee076f94b152c01ca416c3e5cf82290ab4fcd" 94 | integrity sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg== 95 | 96 | "@eslint/eslintrc@^3.2.0": 97 | version "3.2.0" 98 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" 99 | integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== 100 | dependencies: 101 | ajv "^6.12.4" 102 | debug "^4.3.2" 103 | espree "^10.0.1" 104 | globals "^14.0.0" 105 | ignore "^5.2.0" 106 | import-fresh "^3.2.1" 107 | js-yaml "^4.1.0" 108 | minimatch "^3.1.2" 109 | strip-json-comments "^3.1.1" 110 | 111 | "@eslint/js@9.15.0": 112 | version "9.15.0" 113 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.15.0.tgz#df0e24fe869143b59731942128c19938fdbadfb5" 114 | integrity sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg== 115 | 116 | "@eslint/object-schema@^2.1.4": 117 | version "2.1.4" 118 | resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" 119 | integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== 120 | 121 | "@eslint/plugin-kit@^0.2.3": 122 | version "0.2.3" 123 | resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz#812980a6a41ecf3a8341719f92a6d1e784a2e0e8" 124 | integrity sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA== 125 | dependencies: 126 | levn "^0.4.1" 127 | 128 | "@humanfs/core@^0.19.1": 129 | version "0.19.1" 130 | resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" 131 | integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== 132 | 133 | "@humanfs/node@^0.16.6": 134 | version "0.16.6" 135 | resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" 136 | integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== 137 | dependencies: 138 | "@humanfs/core" "^0.19.1" 139 | "@humanwhocodes/retry" "^0.3.0" 140 | 141 | "@humanwhocodes/module-importer@^1.0.1": 142 | version "1.0.1" 143 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 144 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 145 | 146 | "@humanwhocodes/retry@^0.3.0": 147 | version "0.3.1" 148 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" 149 | integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== 150 | 151 | "@humanwhocodes/retry@^0.4.1": 152 | version "0.4.1" 153 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" 154 | integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== 155 | 156 | "@nodelib/fs.scandir@2.1.5": 157 | version "2.1.5" 158 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 159 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 160 | dependencies: 161 | "@nodelib/fs.stat" "2.0.5" 162 | run-parallel "^1.1.9" 163 | 164 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 165 | version "2.0.5" 166 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 167 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 168 | 169 | "@nodelib/fs.walk@^1.2.3": 170 | version "1.2.8" 171 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 172 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 173 | dependencies: 174 | "@nodelib/fs.scandir" "2.1.5" 175 | fastq "^1.6.0" 176 | 177 | "@prisma/client@^5.22.0": 178 | version "5.22.0" 179 | resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.22.0.tgz#da1ca9c133fbefe89e0da781c75e1c59da5f8802" 180 | integrity sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA== 181 | 182 | "@prisma/debug@5.22.0": 183 | version "5.22.0" 184 | resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.22.0.tgz#58af56ed7f6f313df9fb1042b6224d3174bbf412" 185 | integrity sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ== 186 | 187 | "@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2": 188 | version "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" 189 | resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz#d534dd7235c1ba5a23bacd5b92cc0ca3894c28f4" 190 | integrity sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ== 191 | 192 | "@prisma/engines@5.22.0": 193 | version "5.22.0" 194 | resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.22.0.tgz#28f3f52a2812c990a8b66eb93a0987816a5b6d84" 195 | integrity sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA== 196 | dependencies: 197 | "@prisma/debug" "5.22.0" 198 | "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" 199 | "@prisma/fetch-engine" "5.22.0" 200 | "@prisma/get-platform" "5.22.0" 201 | 202 | "@prisma/fetch-engine@5.22.0": 203 | version "5.22.0" 204 | resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz#4fb691b483a450c5548aac2f837b267dd50ef52e" 205 | integrity sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA== 206 | dependencies: 207 | "@prisma/debug" "5.22.0" 208 | "@prisma/engines-version" "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2" 209 | "@prisma/get-platform" "5.22.0" 210 | 211 | "@prisma/get-platform@5.22.0": 212 | version "5.22.0" 213 | resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.22.0.tgz#fc675bc9d12614ca2dade0506c9c4a77e7dddacd" 214 | integrity sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q== 215 | dependencies: 216 | "@prisma/debug" "5.22.0" 217 | 218 | "@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": 219 | version "1.5.5" 220 | resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.5.tgz#2b18d402bb920b65b13ad4ed8dfb6c386300dd84" 221 | integrity sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg== 222 | 223 | "@sapphire/shapeshift@^4.0.0": 224 | version "4.0.0" 225 | resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz#86c1b41002ff5d0b2ad21cbc3418b06834b89040" 226 | integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== 227 | dependencies: 228 | fast-deep-equal "^3.1.3" 229 | lodash "^4.17.21" 230 | 231 | "@sapphire/snowflake@3.5.3": 232 | version "3.5.3" 233 | resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.3.tgz#0c102aa2ec5b34f806e9bc8625fc6a5e1d0a0c6a" 234 | integrity sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ== 235 | 236 | "@sapphire/snowflake@^3.5.3": 237 | version "3.5.5" 238 | resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.5.tgz#33a60ab4231e3cab29e8a0077f342125f2c8d1bd" 239 | integrity sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ== 240 | 241 | "@types/estree@^1.0.6": 242 | version "1.0.6" 243 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" 244 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 245 | 246 | "@types/json-schema@^7.0.15": 247 | version "7.0.15" 248 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 249 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 250 | 251 | "@types/node@*", "@types/node@^22.13.1": 252 | version "22.13.1" 253 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.1.tgz#a2a3fefbdeb7ba6b89f40371842162fac0934f33" 254 | integrity sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew== 255 | dependencies: 256 | undici-types "~6.20.0" 257 | 258 | "@types/ws@^8.5.10": 259 | version "8.5.13" 260 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" 261 | integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== 262 | dependencies: 263 | "@types/node" "*" 264 | 265 | "@typescript-eslint/eslint-plugin@^8.15.0": 266 | version "8.15.0" 267 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz#c95c6521e70c8b095a684d884d96c0c1c63747d2" 268 | integrity sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg== 269 | dependencies: 270 | "@eslint-community/regexpp" "^4.10.0" 271 | "@typescript-eslint/scope-manager" "8.15.0" 272 | "@typescript-eslint/type-utils" "8.15.0" 273 | "@typescript-eslint/utils" "8.15.0" 274 | "@typescript-eslint/visitor-keys" "8.15.0" 275 | graphemer "^1.4.0" 276 | ignore "^5.3.1" 277 | natural-compare "^1.4.0" 278 | ts-api-utils "^1.3.0" 279 | 280 | "@typescript-eslint/parser@^8.15.0": 281 | version "8.15.0" 282 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.15.0.tgz#92610da2b3af702cfbc02a46e2a2daa6260a9045" 283 | integrity sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A== 284 | dependencies: 285 | "@typescript-eslint/scope-manager" "8.15.0" 286 | "@typescript-eslint/types" "8.15.0" 287 | "@typescript-eslint/typescript-estree" "8.15.0" 288 | "@typescript-eslint/visitor-keys" "8.15.0" 289 | debug "^4.3.4" 290 | 291 | "@typescript-eslint/scope-manager@8.15.0": 292 | version "8.15.0" 293 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz#28a1a0f13038f382424f45a988961acaca38f7c6" 294 | integrity sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA== 295 | dependencies: 296 | "@typescript-eslint/types" "8.15.0" 297 | "@typescript-eslint/visitor-keys" "8.15.0" 298 | 299 | "@typescript-eslint/type-utils@8.15.0": 300 | version "8.15.0" 301 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz#a6da0f93aef879a68cc66c73fe42256cb7426c72" 302 | integrity sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw== 303 | dependencies: 304 | "@typescript-eslint/typescript-estree" "8.15.0" 305 | "@typescript-eslint/utils" "8.15.0" 306 | debug "^4.3.4" 307 | ts-api-utils "^1.3.0" 308 | 309 | "@typescript-eslint/types@8.15.0": 310 | version "8.15.0" 311 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.15.0.tgz#4958edf3d83e97f77005f794452e595aaf6430fc" 312 | integrity sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ== 313 | 314 | "@typescript-eslint/typescript-estree@8.15.0": 315 | version "8.15.0" 316 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz#915c94e387892b114a2a2cc0df2d7f19412c8ba7" 317 | integrity sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg== 318 | dependencies: 319 | "@typescript-eslint/types" "8.15.0" 320 | "@typescript-eslint/visitor-keys" "8.15.0" 321 | debug "^4.3.4" 322 | fast-glob "^3.3.2" 323 | is-glob "^4.0.3" 324 | minimatch "^9.0.4" 325 | semver "^7.6.0" 326 | ts-api-utils "^1.3.0" 327 | 328 | "@typescript-eslint/utils@8.15.0": 329 | version "8.15.0" 330 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.15.0.tgz#ac04679ad19252776b38b81954b8e5a65567cef6" 331 | integrity sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ== 332 | dependencies: 333 | "@eslint-community/eslint-utils" "^4.4.0" 334 | "@typescript-eslint/scope-manager" "8.15.0" 335 | "@typescript-eslint/types" "8.15.0" 336 | "@typescript-eslint/typescript-estree" "8.15.0" 337 | 338 | "@typescript-eslint/visitor-keys@8.15.0": 339 | version "8.15.0" 340 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz#9ea5a85eb25401d2aa74ec8a478af4e97899ea12" 341 | integrity sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q== 342 | dependencies: 343 | "@typescript-eslint/types" "8.15.0" 344 | eslint-visitor-keys "^4.2.0" 345 | 346 | "@vladfrangu/async_event_emitter@^2.2.4", "@vladfrangu/async_event_emitter@^2.4.6": 347 | version "2.4.6" 348 | resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz#508b6c45b03f917112a9008180b308ba0e4d1805" 349 | integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== 350 | 351 | acorn-jsx@^5.3.2: 352 | version "5.3.2" 353 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 354 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 355 | 356 | acorn@^8.14.0: 357 | version "8.14.0" 358 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" 359 | integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== 360 | 361 | ajv@^6.12.4: 362 | version "6.12.6" 363 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 364 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 365 | dependencies: 366 | fast-deep-equal "^3.1.1" 367 | fast-json-stable-stringify "^2.0.0" 368 | json-schema-traverse "^0.4.1" 369 | uri-js "^4.2.2" 370 | 371 | ansi-styles@^3.2.1: 372 | version "3.2.1" 373 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 374 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 375 | dependencies: 376 | color-convert "^1.9.0" 377 | 378 | ansi-styles@^4.1.0: 379 | version "4.3.0" 380 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 381 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 382 | dependencies: 383 | color-convert "^2.0.1" 384 | 385 | argparse@^2.0.1: 386 | version "2.0.1" 387 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 388 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 389 | 390 | asciiart-logo@^0.2.7: 391 | version "0.2.7" 392 | resolved "https://registry.yarnpkg.com/asciiart-logo/-/asciiart-logo-0.2.7.tgz#5e94c400a3c661597259efb75031b8cd6ae50d13" 393 | integrity sha512-E0E5o1MqmKnBmfWmuWnxhKu9jVdntxy6Q/CcUUXNnYooR7k1cahcyLoRhwb6AlpbKQ70jQfjj3swX20jLN5V5Q== 394 | dependencies: 395 | chalk "^2.4.2" 396 | figlet "^1.2.0" 397 | to-title-case "^1.0.0" 398 | 399 | balanced-match@^1.0.0: 400 | version "1.0.2" 401 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 402 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 403 | 404 | brace-expansion@^1.1.7: 405 | version "1.1.11" 406 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 407 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 408 | dependencies: 409 | balanced-match "^1.0.0" 410 | concat-map "0.0.1" 411 | 412 | brace-expansion@^2.0.1: 413 | version "2.0.1" 414 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 415 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 416 | dependencies: 417 | balanced-match "^1.0.0" 418 | 419 | braces@^3.0.3: 420 | version "3.0.3" 421 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 422 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 423 | dependencies: 424 | fill-range "^7.1.1" 425 | 426 | callsites@^3.0.0: 427 | version "3.1.0" 428 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 429 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 430 | 431 | chalk@^2.4.2: 432 | version "2.4.2" 433 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 434 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 435 | dependencies: 436 | ansi-styles "^3.2.1" 437 | escape-string-regexp "^1.0.5" 438 | supports-color "^5.3.0" 439 | 440 | chalk@^4.0.0: 441 | version "4.1.2" 442 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 443 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 444 | dependencies: 445 | ansi-styles "^4.1.0" 446 | supports-color "^7.1.0" 447 | 448 | color-convert@^1.9.0: 449 | version "1.9.3" 450 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 451 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 452 | dependencies: 453 | color-name "1.1.3" 454 | 455 | color-convert@^2.0.1: 456 | version "2.0.1" 457 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 458 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 459 | dependencies: 460 | color-name "~1.1.4" 461 | 462 | color-name@1.1.3: 463 | version "1.1.3" 464 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 465 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 466 | 467 | color-name@~1.1.4: 468 | version "1.1.4" 469 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 470 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 471 | 472 | concat-map@0.0.1: 473 | version "0.0.1" 474 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 475 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 476 | 477 | cross-spawn@^7.0.5: 478 | version "7.0.6" 479 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 480 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 481 | dependencies: 482 | path-key "^3.1.0" 483 | shebang-command "^2.0.0" 484 | which "^2.0.1" 485 | 486 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 487 | version "4.3.7" 488 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" 489 | integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== 490 | dependencies: 491 | ms "^2.1.3" 492 | 493 | deep-is@^0.1.3: 494 | version "0.1.4" 495 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 496 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 497 | 498 | discord-api-types@0.37.100: 499 | version "0.37.100" 500 | resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.100.tgz#5979892d39511bc7f1dbb9660d2d2cad698b3de7" 501 | integrity sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA== 502 | 503 | discord-api-types@0.37.83: 504 | version "0.37.83" 505 | resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.83.tgz#a22a799729ceded8176ea747157837ddf4708b1f" 506 | integrity sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA== 507 | 508 | discord-api-types@0.37.97: 509 | version "0.37.97" 510 | resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.97.tgz#d658573f726ad179261d538dbad4e7e8eca48d11" 511 | integrity sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA== 512 | 513 | discord.js@^14.16.3: 514 | version "14.16.3" 515 | resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.16.3.tgz#9553366953c992469f47a55af2a11c2054a9babe" 516 | integrity sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA== 517 | dependencies: 518 | "@discordjs/builders" "^1.9.0" 519 | "@discordjs/collection" "1.5.3" 520 | "@discordjs/formatters" "^0.5.0" 521 | "@discordjs/rest" "^2.4.0" 522 | "@discordjs/util" "^1.1.1" 523 | "@discordjs/ws" "1.1.1" 524 | "@sapphire/snowflake" "3.5.3" 525 | discord-api-types "0.37.100" 526 | fast-deep-equal "3.1.3" 527 | lodash.snakecase "4.1.1" 528 | tslib "^2.6.3" 529 | undici "6.19.8" 530 | 531 | dotenv@^16.4.5: 532 | version "16.4.5" 533 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" 534 | integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== 535 | 536 | escape-regexp-component@^1.0.2: 537 | version "1.0.2" 538 | resolved "https://registry.yarnpkg.com/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz#9c63b6d0b25ff2a88c3adbd18c5b61acc3b9faa2" 539 | integrity sha512-B0yxafj1D1ZTNEHkFoQxz4iboZSfaZHhaNhIug7GcUCL4ZUrVSJZTmWUAkPOFaYDfi3RNT9XM082TuGE6jpmiQ== 540 | 541 | escape-string-regexp@^1.0.5: 542 | version "1.0.5" 543 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 544 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 545 | 546 | escape-string-regexp@^4.0.0: 547 | version "4.0.0" 548 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 549 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 550 | 551 | eslint-config-prettier@^9.1.0: 552 | version "9.1.0" 553 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" 554 | integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== 555 | 556 | eslint-scope@^8.2.0: 557 | version "8.2.0" 558 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" 559 | integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== 560 | dependencies: 561 | esrecurse "^4.3.0" 562 | estraverse "^5.2.0" 563 | 564 | eslint-visitor-keys@^3.4.3: 565 | version "3.4.3" 566 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 567 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 568 | 569 | eslint-visitor-keys@^4.2.0: 570 | version "4.2.0" 571 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" 572 | integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== 573 | 574 | eslint@^9.15.0: 575 | version "9.15.0" 576 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.15.0.tgz#77c684a4e980e82135ebff8ee8f0a9106ce6b8a6" 577 | integrity sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw== 578 | dependencies: 579 | "@eslint-community/eslint-utils" "^4.2.0" 580 | "@eslint-community/regexpp" "^4.12.1" 581 | "@eslint/config-array" "^0.19.0" 582 | "@eslint/core" "^0.9.0" 583 | "@eslint/eslintrc" "^3.2.0" 584 | "@eslint/js" "9.15.0" 585 | "@eslint/plugin-kit" "^0.2.3" 586 | "@humanfs/node" "^0.16.6" 587 | "@humanwhocodes/module-importer" "^1.0.1" 588 | "@humanwhocodes/retry" "^0.4.1" 589 | "@types/estree" "^1.0.6" 590 | "@types/json-schema" "^7.0.15" 591 | ajv "^6.12.4" 592 | chalk "^4.0.0" 593 | cross-spawn "^7.0.5" 594 | debug "^4.3.2" 595 | escape-string-regexp "^4.0.0" 596 | eslint-scope "^8.2.0" 597 | eslint-visitor-keys "^4.2.0" 598 | espree "^10.3.0" 599 | esquery "^1.5.0" 600 | esutils "^2.0.2" 601 | fast-deep-equal "^3.1.3" 602 | file-entry-cache "^8.0.0" 603 | find-up "^5.0.0" 604 | glob-parent "^6.0.2" 605 | ignore "^5.2.0" 606 | imurmurhash "^0.1.4" 607 | is-glob "^4.0.0" 608 | json-stable-stringify-without-jsonify "^1.0.1" 609 | lodash.merge "^4.6.2" 610 | minimatch "^3.1.2" 611 | natural-compare "^1.4.0" 612 | optionator "^0.9.3" 613 | 614 | espree@^10.0.1, espree@^10.3.0: 615 | version "10.3.0" 616 | resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" 617 | integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== 618 | dependencies: 619 | acorn "^8.14.0" 620 | acorn-jsx "^5.3.2" 621 | eslint-visitor-keys "^4.2.0" 622 | 623 | esquery@^1.5.0: 624 | version "1.6.0" 625 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 626 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 627 | dependencies: 628 | estraverse "^5.1.0" 629 | 630 | esrecurse@^4.3.0: 631 | version "4.3.0" 632 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 633 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 634 | dependencies: 635 | estraverse "^5.2.0" 636 | 637 | estraverse@^5.1.0, estraverse@^5.2.0: 638 | version "5.3.0" 639 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 640 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 641 | 642 | esutils@^2.0.2: 643 | version "2.0.3" 644 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 645 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 646 | 647 | fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 648 | version "3.1.3" 649 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 650 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 651 | 652 | fast-glob@^3.3.2: 653 | version "3.3.2" 654 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 655 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 656 | dependencies: 657 | "@nodelib/fs.stat" "^2.0.2" 658 | "@nodelib/fs.walk" "^1.2.3" 659 | glob-parent "^5.1.2" 660 | merge2 "^1.3.0" 661 | micromatch "^4.0.4" 662 | 663 | fast-json-stable-stringify@^2.0.0: 664 | version "2.1.0" 665 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 666 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 667 | 668 | fast-levenshtein@^2.0.6: 669 | version "2.0.6" 670 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 671 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 672 | 673 | fastq@^1.6.0: 674 | version "1.17.1" 675 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 676 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 677 | dependencies: 678 | reusify "^1.0.4" 679 | 680 | figlet@^1.2.0: 681 | version "1.8.0" 682 | resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.8.0.tgz#1b93c4f65f4c1a3b1135221987eee8cf8b9c0ac7" 683 | integrity sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw== 684 | 685 | file-entry-cache@^8.0.0: 686 | version "8.0.0" 687 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" 688 | integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== 689 | dependencies: 690 | flat-cache "^4.0.0" 691 | 692 | fill-range@^7.1.1: 693 | version "7.1.1" 694 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 695 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 696 | dependencies: 697 | to-regex-range "^5.0.1" 698 | 699 | find-up@^5.0.0: 700 | version "5.0.0" 701 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 702 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 703 | dependencies: 704 | locate-path "^6.0.0" 705 | path-exists "^4.0.0" 706 | 707 | flat-cache@^4.0.0: 708 | version "4.0.1" 709 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" 710 | integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== 711 | dependencies: 712 | flatted "^3.2.9" 713 | keyv "^4.5.4" 714 | 715 | flatted@^3.2.9: 716 | version "3.3.2" 717 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" 718 | integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== 719 | 720 | fsevents@2.3.3: 721 | version "2.3.3" 722 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 723 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 724 | 725 | glob-parent@^5.1.2: 726 | version "5.1.2" 727 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 728 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 729 | dependencies: 730 | is-glob "^4.0.1" 731 | 732 | glob-parent@^6.0.2: 733 | version "6.0.2" 734 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 735 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 736 | dependencies: 737 | is-glob "^4.0.3" 738 | 739 | globals@^14.0.0: 740 | version "14.0.0" 741 | resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" 742 | integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== 743 | 744 | graphemer@^1.4.0: 745 | version "1.4.0" 746 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 747 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 748 | 749 | has-flag@^3.0.0: 750 | version "3.0.0" 751 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 752 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 753 | 754 | has-flag@^4.0.0: 755 | version "4.0.0" 756 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 757 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 758 | 759 | ignore@^5.2.0, ignore@^5.3.1: 760 | version "5.3.2" 761 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 762 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 763 | 764 | import-fresh@^3.2.1: 765 | version "3.3.0" 766 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 767 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 768 | dependencies: 769 | parent-module "^1.0.0" 770 | resolve-from "^4.0.0" 771 | 772 | imurmurhash@^0.1.4: 773 | version "0.1.4" 774 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 775 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 776 | 777 | is-extglob@^2.1.1: 778 | version "2.1.1" 779 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 780 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 781 | 782 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 783 | version "4.0.3" 784 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 785 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 786 | dependencies: 787 | is-extglob "^2.1.1" 788 | 789 | is-number@^7.0.0: 790 | version "7.0.0" 791 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 792 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 793 | 794 | isexe@^2.0.0: 795 | version "2.0.0" 796 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 797 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 798 | 799 | js-yaml@^4.1.0: 800 | version "4.1.0" 801 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 802 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 803 | dependencies: 804 | argparse "^2.0.1" 805 | 806 | json-buffer@3.0.1: 807 | version "3.0.1" 808 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 809 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 810 | 811 | json-schema-traverse@^0.4.1: 812 | version "0.4.1" 813 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 814 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 815 | 816 | json-stable-stringify-without-jsonify@^1.0.1: 817 | version "1.0.1" 818 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 819 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 820 | 821 | keyv@^4.5.4: 822 | version "4.5.4" 823 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 824 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 825 | dependencies: 826 | json-buffer "3.0.1" 827 | 828 | levn@^0.4.1: 829 | version "0.4.1" 830 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 831 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 832 | dependencies: 833 | prelude-ls "^1.2.1" 834 | type-check "~0.4.0" 835 | 836 | locate-path@^6.0.0: 837 | version "6.0.0" 838 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 839 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 840 | dependencies: 841 | p-locate "^5.0.0" 842 | 843 | lodash.merge@^4.6.2: 844 | version "4.6.2" 845 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 846 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 847 | 848 | lodash.snakecase@4.1.1: 849 | version "4.1.1" 850 | resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" 851 | integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== 852 | 853 | lodash@^4.17.21: 854 | version "4.17.21" 855 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 856 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 857 | 858 | magic-bytes.js@^1.10.0: 859 | version "1.10.0" 860 | resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz#c41cf4bc2f802992b05e64962411c9dd44fdef92" 861 | integrity sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ== 862 | 863 | merge2@^1.3.0: 864 | version "1.4.1" 865 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 866 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 867 | 868 | micromatch@^4.0.4: 869 | version "4.0.8" 870 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 871 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 872 | dependencies: 873 | braces "^3.0.3" 874 | picomatch "^2.3.1" 875 | 876 | minimatch@^3.1.2: 877 | version "3.1.2" 878 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 879 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 880 | dependencies: 881 | brace-expansion "^1.1.7" 882 | 883 | minimatch@^9.0.4: 884 | version "9.0.5" 885 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" 886 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 887 | dependencies: 888 | brace-expansion "^2.0.1" 889 | 890 | ms@^2.1.3: 891 | version "2.1.3" 892 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 893 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 894 | 895 | natural-compare@^1.4.0: 896 | version "1.4.0" 897 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 898 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 899 | 900 | optionator@^0.9.3: 901 | version "0.9.4" 902 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 903 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 904 | dependencies: 905 | deep-is "^0.1.3" 906 | fast-levenshtein "^2.0.6" 907 | levn "^0.4.1" 908 | prelude-ls "^1.2.1" 909 | type-check "^0.4.0" 910 | word-wrap "^1.2.5" 911 | 912 | p-limit@^3.0.2: 913 | version "3.1.0" 914 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 915 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 916 | dependencies: 917 | yocto-queue "^0.1.0" 918 | 919 | p-locate@^5.0.0: 920 | version "5.0.0" 921 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 922 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 923 | dependencies: 924 | p-limit "^3.0.2" 925 | 926 | parent-module@^1.0.0: 927 | version "1.0.1" 928 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 929 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 930 | dependencies: 931 | callsites "^3.0.0" 932 | 933 | path-exists@^4.0.0: 934 | version "4.0.0" 935 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 936 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 937 | 938 | path-key@^3.1.0: 939 | version "3.1.1" 940 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 941 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 942 | 943 | picomatch@^2.3.1: 944 | version "2.3.1" 945 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 946 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 947 | 948 | prelude-ls@^1.2.1: 949 | version "1.2.1" 950 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 951 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 952 | 953 | prettier@^3.3.3: 954 | version "3.3.3" 955 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" 956 | integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== 957 | 958 | prisma@^5.22.0: 959 | version "5.22.0" 960 | resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.22.0.tgz#1f6717ff487cdef5f5799cc1010459920e2e6197" 961 | integrity sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A== 962 | dependencies: 963 | "@prisma/engines" "5.22.0" 964 | optionalDependencies: 965 | fsevents "2.3.3" 966 | 967 | punycode@^2.1.0: 968 | version "2.3.1" 969 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 970 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 971 | 972 | queue-microtask@^1.2.2: 973 | version "1.2.3" 974 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 975 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 976 | 977 | resolve-from@^4.0.0: 978 | version "4.0.0" 979 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 980 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 981 | 982 | reusify@^1.0.4: 983 | version "1.0.4" 984 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 985 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 986 | 987 | run-parallel@^1.1.9: 988 | version "1.2.0" 989 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 990 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 991 | dependencies: 992 | queue-microtask "^1.2.2" 993 | 994 | semver@^7.6.0: 995 | version "7.6.3" 996 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 997 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 998 | 999 | shebang-command@^2.0.0: 1000 | version "2.0.0" 1001 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1002 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1003 | dependencies: 1004 | shebang-regex "^3.0.0" 1005 | 1006 | shebang-regex@^3.0.0: 1007 | version "3.0.0" 1008 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1009 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1010 | 1011 | strip-json-comments@^3.1.1: 1012 | version "3.1.1" 1013 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1014 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1015 | 1016 | supports-color@^5.3.0: 1017 | version "5.5.0" 1018 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1019 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1020 | dependencies: 1021 | has-flag "^3.0.0" 1022 | 1023 | supports-color@^7.1.0: 1024 | version "7.2.0" 1025 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1026 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1027 | dependencies: 1028 | has-flag "^4.0.0" 1029 | 1030 | title-case-minors@^1.0.0: 1031 | version "1.0.0" 1032 | resolved "https://registry.yarnpkg.com/title-case-minors/-/title-case-minors-1.0.0.tgz#51f17037c294747a1d1cda424b5004c86d8eb115" 1033 | integrity sha512-GFT+1ZjqJgq5AywOXjl9VelGgqMpOtfwdxYaYy3eUE1gbyxneeSnADLoov7TxXelqftIhlblsnHVqw5hNFUbGQ== 1034 | 1035 | to-capital-case@^1.0.0: 1036 | version "1.0.0" 1037 | resolved "https://registry.yarnpkg.com/to-capital-case/-/to-capital-case-1.0.0.tgz#a57c5014fd5a37217cf05099ff8a421bbf9c9b7f" 1038 | integrity sha512-mfERGNFweI+x+OctN7rlbZQqDC68BjXEt9gOrf8qy26IyqQyUTqfdKQBN3XhqN0fP9Pl4zaoXKGeWv+wSPXIyQ== 1039 | dependencies: 1040 | to-space-case "^1.0.0" 1041 | 1042 | to-no-case@^1.0.0: 1043 | version "1.0.2" 1044 | resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" 1045 | integrity sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg== 1046 | 1047 | to-regex-range@^5.0.1: 1048 | version "5.0.1" 1049 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1050 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1051 | dependencies: 1052 | is-number "^7.0.0" 1053 | 1054 | to-sentence-case@^1.0.0: 1055 | version "1.0.0" 1056 | resolved "https://registry.yarnpkg.com/to-sentence-case/-/to-sentence-case-1.0.0.tgz#c483bf3647737e5c738ef7006fe360d5f99c572e" 1057 | integrity sha512-egaI3iiTSS5FpN8ZiN08Kqx8EQDTK4yqnp5m2WqR5qGSMLi605gYn887drlyZFn+lLMQAOC7tABafk/oQIoqGQ== 1058 | dependencies: 1059 | to-no-case "^1.0.0" 1060 | 1061 | to-space-case@^1.0.0: 1062 | version "1.0.0" 1063 | resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" 1064 | integrity sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA== 1065 | dependencies: 1066 | to-no-case "^1.0.0" 1067 | 1068 | to-title-case@^1.0.0: 1069 | version "1.0.0" 1070 | resolved "https://registry.yarnpkg.com/to-title-case/-/to-title-case-1.0.0.tgz#aca88f89d6064de50108a97cea0db44827e80061" 1071 | integrity sha512-zy39Lh3pLnDIvS7PEoPNIo7Jbm7IK4NCruhQDEsHmVmvqn4v+WlwgQZtHESbYxnwhU0YCdTJJ4IQshR2XWYVFw== 1072 | dependencies: 1073 | escape-regexp-component "^1.0.2" 1074 | title-case-minors "^1.0.0" 1075 | to-capital-case "^1.0.0" 1076 | to-sentence-case "^1.0.0" 1077 | 1078 | ts-api-utils@^1.3.0: 1079 | version "1.4.0" 1080 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c" 1081 | integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ== 1082 | 1083 | ts-mixer@^6.0.4: 1084 | version "6.0.4" 1085 | resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" 1086 | integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== 1087 | 1088 | tslib@^2.6.2, tslib@^2.6.3: 1089 | version "2.8.1" 1090 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" 1091 | integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== 1092 | 1093 | type-check@^0.4.0, type-check@~0.4.0: 1094 | version "0.4.0" 1095 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1096 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1097 | dependencies: 1098 | prelude-ls "^1.2.1" 1099 | 1100 | typescript@^5.6.3: 1101 | version "5.6.3" 1102 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" 1103 | integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== 1104 | 1105 | undici-types@~6.20.0: 1106 | version "6.20.0" 1107 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" 1108 | integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== 1109 | 1110 | undici@6.19.8: 1111 | version "6.19.8" 1112 | resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1" 1113 | integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g== 1114 | 1115 | uri-js@^4.2.2: 1116 | version "4.4.1" 1117 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1118 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1119 | dependencies: 1120 | punycode "^2.1.0" 1121 | 1122 | which@^2.0.1: 1123 | version "2.0.2" 1124 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1125 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1126 | dependencies: 1127 | isexe "^2.0.0" 1128 | 1129 | word-wrap@^1.2.5: 1130 | version "1.2.5" 1131 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 1132 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1133 | 1134 | ws@^8.16.0: 1135 | version "8.18.0" 1136 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" 1137 | integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== 1138 | 1139 | yocto-queue@^0.1.0: 1140 | version "0.1.0" 1141 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1142 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1143 | --------------------------------------------------------------------------------