├── src ├── utils │ ├── index.ts │ ├── rest.ts │ └── response.ts ├── interfaces │ ├── index.ts │ ├── event.ts │ ├── job.ts │ └── command.ts ├── index.ts ├── commands │ ├── help.ts │ ├── imagine.ts │ └── restoration.ts ├── client │ ├── interval.ts │ └── index.ts └── events │ └── interactionCreate.ts ├── .gitignore ├── .env.example ├── tsconfig.json ├── package.json ├── LICENSE ├── README.md └── yarn.lock /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export { response } from './response'; 2 | export { rest } from './rest'; -------------------------------------------------------------------------------- /src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export { ICommand } from './command'; 2 | export { IEvent } from './event'; 3 | export { IJob } from './job'; -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { config } from 'dotenv'; 2 | import Bot from './client'; 3 | import 'advanced-logs'; 4 | 5 | config(); 6 | const bot = new Bot(); 7 | bot.init(); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # debug 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | .pnpm-debug.log* 9 | 10 | # env files 11 | .env -------------------------------------------------------------------------------- /src/interfaces/event.ts: -------------------------------------------------------------------------------- 1 | import { ClientEvents } from 'discord.js'; 2 | import Bot from '../client'; 3 | 4 | export interface IEvent { 5 | name: keyof ClientEvents; 6 | type: 'on' | 'once'; 7 | run: (client: Bot, ...args: any) => Promise | any; 8 | }; -------------------------------------------------------------------------------- /src/commands/help.ts: -------------------------------------------------------------------------------- 1 | import { ICommand } from '@/interfaces'; 2 | 3 | export const Command: ICommand = { 4 | name: 'help', 5 | description: 'Shows a list of all commands.', 6 | run: async (client, interaction) => { 7 | interaction.reply('hello world!'); 8 | } 9 | }; -------------------------------------------------------------------------------- /src/interfaces/job.ts: -------------------------------------------------------------------------------- 1 | import { ChatInputCommandInteraction } from 'discord.js'; 2 | 3 | export interface IJob { 4 | id: string; 5 | job_id: string; 6 | name: string; 7 | user: string; 8 | interaction: ChatInputCommandInteraction; 9 | status: string; 10 | started_at: number; 11 | urls: { 12 | get: string; 13 | cancel: string; 14 | } 15 | }; -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | DISCORD_TOKEN="" # Discord bot token 2 | REPLICATE_API_KEY="" # Get one from: https://replicate.com/account 3 | 4 | SCZHOU_CODEFORMER__VERSION="7de2ea26c616d5bf2245ad0d5e24f0ff9a6204578a5c876db53142edd9d2cd56" # https://replicate.com/sczhou/codeformer/versions 5 | STABILITY_AI_STABLE_DIFFUSION__VERSION="f178fa7a1ae43a9a9af01b833b9d2ecf97b1bcb0acfd2dc5dd04895e042863f1" # https://replicate.com/stability-ai/stable-diffusion/versions -------------------------------------------------------------------------------- /src/interfaces/command.ts: -------------------------------------------------------------------------------- 1 | import { ChatInputCommandInteraction } from 'discord.js'; 2 | import Bot from '../client'; 3 | 4 | interface IOption { 5 | type: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; 6 | name: string; 7 | description: string; 8 | required?: boolean; 9 | options?: IOption[]; 10 | }; 11 | 12 | export interface ICommand { 13 | name: string; 14 | description: string; 15 | options?: IOption[], 16 | run: (client: Bot, interaction: ChatInputCommandInteraction) => Promise | any; 17 | }; -------------------------------------------------------------------------------- /src/utils/rest.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosPromise } from 'axios'; 2 | 3 | export const rest = (method: 'get' | 'post', url: string | undefined, body?: { [key: string]: any }) => { 4 | const options = { 5 | headers: { 6 | 'Content-Type': 'application/json', 7 | 'Authorization': `Token ${process.env.REPLICATE_API_KEY}` 8 | } 9 | }; 10 | 11 | const param_one = method === 'post' ? body : options; 12 | const param_two = method === 'post' ? options : undefined; 13 | 14 | return axios[method](url ?? 'https://api.replicate.com/v1/predictions', param_one, param_two) 15 | .catch((err): AxiosPromise => err?.response) 16 | .then(res => res?.data); 17 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": [ "ESNext" ], 4 | "module": "commonjs", 5 | "esModuleInterop": true, 6 | "allowSyntheticDefaultImports": true, 7 | "target": "ESNext", 8 | "noImplicitAny": true, 9 | "moduleResolution": "node", 10 | "sourceMap": true, 11 | "outDir": "dist", 12 | "baseUrl": ".", 13 | "resolveJsonModule": true, 14 | "declaration": true, 15 | "skipDefaultLibCheck": true, 16 | "skipLibCheck": true, 17 | "experimentalDecorators": true, 18 | "emitDecoratorMetadata": true, 19 | "paths": { 20 | "@/*": [ 21 | "./src/*" 22 | ] 23 | } 24 | }, 25 | "include": [ 26 | "src/**/*" 27 | ], 28 | "exclude": [ 29 | "node_modules" 30 | ] 31 | } -------------------------------------------------------------------------------- /src/client/interval.ts: -------------------------------------------------------------------------------- 1 | import { response, rest } from '../utils'; 2 | import Bot from './index'; 3 | 4 | export default function Interval(client: Bot) { 5 | client.jobs.forEach(async job => { 6 | const req = await rest('get', job.urls.get); 7 | if (!req) return client.jobs.delete(job.user); 8 | 9 | job.interaction.editReply(response({ 10 | name: job.name, 11 | id: job.id, 12 | avatar: job.interaction.user.displayAvatarURL(), 13 | image: req?.output ?? req.input?.image, 14 | started_at: new Date(req.created_at).getTime(), 15 | status: req.status, 16 | finished_at: req.completed_at ? new Date(req.completed_at).getTime() : undefined 17 | })); 18 | 19 | if (![ 'starting', 'processing' ].includes(req?.status)) { 20 | client.jobs.delete(job.user); 21 | }; 22 | }); 23 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "replicate-bot", 3 | "version": "1.0.0", 4 | "description": "🤖 Discord bot with AI-based commands.", 5 | "main": "src/index.ts", 6 | "dependencies": { 7 | "advanced-logs": "^2.1.3", 8 | "axios": "^1.3.1", 9 | "discord.js": "^14.7.1", 10 | "dotenv": "^16.0.3", 11 | "glob": "^8.1.0" 12 | }, 13 | "devDependencies": { 14 | "@types/glob": "^8.0.1", 15 | "@types/node": "^18.11.18", 16 | "ts-node": "^10.9.1", 17 | "typescript": "^4.9.5" 18 | }, 19 | "scripts": { 20 | "start": "ts-node src/index.ts" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/Swothh/replicate-bot.git" 25 | }, 26 | "keywords": [ 27 | "discord", 28 | "bot", 29 | "ai", 30 | "replicate" 31 | ], 32 | "author": "Swôth", 33 | "license": "MIT", 34 | "bugs": { 35 | "url": "https://github.com/Swothh/replicate-bot/issues" 36 | }, 37 | "homepage": "https://github.com/Swothh/replicate-bot#readme" 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Swôth 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

replicate-bot

3 |

🤖 Discord bot with AI-based commands.

4 |
Developed with 💙 by Swôth
5 |
6 | 7 | # ⚙️ Config 8 | > Create a file named **.env** by copying the **.env.example** file. Write the **Discord bot token** and the **Replicate api key** to the file. 9 | 10 | # 📜 Usage 11 | > ***Make the adjustments mentioned above.*** 12 | > 13 | > Install packages. \ 14 | > $ `npm install` 15 | > 16 | > Start bot. \ 17 | > $ `npm start` 18 | 19 | # ⭐ Star 20 | > Don't forget to star if you like it. 21 | 22 | # 📷 Screenshots 23 |
24 | 25 | 26 |
27 |
28 | 29 | 30 |
31 | 32 | # 🔒 License 33 | > MIT -------------------------------------------------------------------------------- /src/events/interactionCreate.ts: -------------------------------------------------------------------------------- 1 | import { Events, Interaction, EmbedBuilder } from 'discord.js'; 2 | import { isAsyncFunction } from 'util/types'; 3 | import { IEvent } from '@/interfaces'; 4 | 5 | export const Event: IEvent = { 6 | name: Events.InteractionCreate, 7 | type: 'on', 8 | run: async (client, interaction: Interaction) => { 9 | if (interaction.isButton() && interaction.customId === 'cancel_job') { 10 | const job = client.jobs.get(interaction.user.id); 11 | if (!job) return; 12 | client.jobs.delete(interaction.user.id); 13 | return job.interaction.deleteReply(); 14 | }; 15 | 16 | if (!interaction.isCommand() || !interaction.isChatInputCommand()) return; 17 | const command = client.commands.get(interaction.commandName); 18 | if (!command) return; 19 | 20 | const errorHandler = (err: Error) => { 21 | console.error(err); 22 | 23 | interaction.reply({ 24 | embeds: [ 25 | new EmbedBuilder() 26 | .setColor('Red') 27 | .setDescription(':x: **|** An error occurred while executing this command.') 28 | ] 29 | }); 30 | }; 31 | 32 | if (isAsyncFunction(command.run)) { 33 | command.run(client, interaction).catch(errorHandler); 34 | } else { 35 | try { 36 | command.run(client, interaction); 37 | } catch(err) { 38 | errorHandler(err); 39 | }; 40 | }; 41 | } 42 | }; -------------------------------------------------------------------------------- /src/utils/response.ts: -------------------------------------------------------------------------------- 1 | import { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } from 'discord.js'; 2 | 3 | interface IOptions { 4 | name: string; 5 | id: string; 6 | avatar: string; 7 | image?: string; 8 | status: string; 9 | started_at: number; 10 | finished_at?: number; 11 | }; 12 | 13 | export const response = (options: IOptions) => ({ 14 | embeds: [ 15 | new EmbedBuilder() 16 | .setColor(options.finished_at ? 'Green' : 'Grey') 17 | .setAuthor({ name: `ID: ${options.id}`, iconURL: options.avatar }) 18 | .setTitle(options.name + ' job ' + (options.finished_at ? 'finished' : 'started') + '.') 19 | .setImage(options.image ? String(options.image) : null) 20 | .addFields({ 21 | name: '• Status', 22 | value: options.status.charAt(0).toUpperCase() + options.status.slice(1), 23 | inline: true 24 | }, ...(!options.finished_at ? [ 25 | { 26 | name: '• Started At', 27 | value: ``, 28 | inline: true 29 | } 30 | ] : [ 31 | { 32 | name: '• Processed In', 33 | value: `${((options.finished_at - options.started_at) / 1000).toFixed(1)} seconds`, 34 | inline: true 35 | } 36 | ])) 37 | ], 38 | components: options.finished_at ? [] : [ 39 | new ActionRowBuilder() 40 | .addComponents( 41 | new ButtonBuilder() 42 | .setCustomId('cancel_job') 43 | .setLabel('Cancel Job') 44 | .setStyle(ButtonStyle.Secondary) 45 | .setEmoji('❌') 46 | ) 47 | ] 48 | }); -------------------------------------------------------------------------------- /src/commands/imagine.ts: -------------------------------------------------------------------------------- 1 | import { EmbedBuilder } from 'discord.js'; 2 | import { rest, response } from '../utils'; 3 | import { ICommand } from '../interfaces'; 4 | import crypto from 'crypto'; 5 | 6 | export const Command: ICommand = { 7 | name: 'imagine', 8 | description: 'Generates an image from a prompt.', 9 | options: [ 10 | { 11 | type: 3, 12 | name: 'prompt', 13 | description: 'The prompt for the image.', 14 | required: true 15 | } 16 | ], 17 | run: async (client, interaction) => { 18 | await interaction.deferReply(); 19 | const embed = new EmbedBuilder(); 20 | 21 | if (client.jobs.has(interaction.user.id)) { 22 | embed.setColor('Red').setDescription(':x: **|** You already have a job running.'); 23 | return interaction.followUp({ embeds: [ embed ] }); 24 | }; 25 | 26 | const md5 = (data: string) => crypto.createHash('md5').update(data).digest('hex'); 27 | const prompt = interaction.options.getString('prompt'); 28 | 29 | const req = await rest('post', undefined, { 30 | version: process.env.STABILITY_AI_STABLE_DIFFUSION__VERSION, 31 | input: { 32 | prompt 33 | } 34 | }); 35 | 36 | if (!req?.urls?.get) { 37 | embed.setColor('Red').setDescription(':x: **|** Something went wrong. (rate-limit)'); 38 | return interaction.followUp({ embeds: [ embed ] }); 39 | }; 40 | 41 | client.jobs.set(interaction.user.id, { 42 | id: md5(req.id), 43 | job_id: req.id, 44 | name: 'Imagine', 45 | user: interaction.user.id, 46 | interaction, 47 | status: req.status, 48 | started_at: new Date(req.created_at).getTime(), 49 | urls: req.urls 50 | }); 51 | 52 | interaction.followUp(response({ 53 | name: 'Imagine', 54 | id: md5(req.id), 55 | avatar: interaction.user.displayAvatarURL(), 56 | image: undefined, 57 | started_at: new Date(req.created_at).getTime(), 58 | status: req.status 59 | })); 60 | } 61 | }; -------------------------------------------------------------------------------- /src/commands/restoration.ts: -------------------------------------------------------------------------------- 1 | import { EmbedBuilder } from 'discord.js'; 2 | import { rest, response } from '../utils'; 3 | import { ICommand } from '../interfaces'; 4 | import crypto from 'crypto'; 5 | 6 | export const Command: ICommand = { 7 | name: 'restoration', 8 | description: 'Robust face restoration algorithm for old photos / AI-generated faces.', 9 | options: [ 10 | { 11 | type: 1, 12 | name: 'url', 13 | description: 'Restore a image from a URL.', 14 | options: [ 15 | { 16 | type: 3, 17 | name: 'url', 18 | description: 'The URL of the image.', 19 | required: true 20 | } 21 | ] 22 | }, 23 | { 24 | type: 1, 25 | name: 'attachment', 26 | description: 'Restore a image from an attachment.', 27 | options: [ 28 | { 29 | type: 11, 30 | name: 'attachment', 31 | description: 'The attachment of the image.', 32 | required: true 33 | } 34 | ] 35 | } 36 | ], 37 | run: async (client, interaction) => { 38 | await interaction.deferReply(); 39 | const embed = new EmbedBuilder(); 40 | 41 | if (client.jobs.has(interaction.user.id)) { 42 | embed.setColor('Red').setDescription(':x: **|** You already have a job running.'); 43 | return interaction.followUp({ embeds: [ embed ] }); 44 | }; 45 | 46 | const md5 = (data: string) => crypto.createHash('md5').update(data).digest('hex'); 47 | const att = interaction.options.getAttachment('attachment'); 48 | const url = att?.url ?? interaction.options.getString('url'); 49 | 50 | if (att && att.contentType.split('/')[0] !== 'image' || ![ 'png', 'jpeg', 'jpg' ].includes(url.split('.').reverse()[0])) { 51 | embed.setColor('Red').setDescription(':x: **|** Invalid attachment type.'); 52 | return interaction.followUp({ embeds: [ embed ] }); 53 | }; 54 | 55 | const req = await rest('post', undefined, { 56 | version: process.env.SCZHOU_CODEFORMER__VERSION, 57 | input: { 58 | image: url 59 | } 60 | }); 61 | 62 | if (!req?.urls?.get) { 63 | embed.setColor('Red').setDescription(':x: **|** Something went wrong. (rate-limit)'); 64 | return interaction.followUp({ embeds: [ embed ] }); 65 | }; 66 | 67 | client.jobs.set(interaction.user.id, { 68 | id: md5(req.id), 69 | job_id: req.id, 70 | name: 'Restoration', 71 | user: interaction.user.id, 72 | interaction, 73 | status: req.status, 74 | started_at: new Date(req.created_at).getTime(), 75 | urls: req.urls 76 | }); 77 | 78 | interaction.followUp(response({ 79 | name: 'Restoration', 80 | id: md5(req.id), 81 | avatar: interaction.user.displayAvatarURL(), 82 | image: url, 83 | started_at: new Date(req.created_at).getTime(), 84 | status: req.status 85 | })); 86 | } 87 | }; -------------------------------------------------------------------------------- /src/client/index.ts: -------------------------------------------------------------------------------- 1 | import { Client, IntentsBitField, Collection, REST, Routes } from 'discord.js'; 2 | import { ICommand, IEvent, IJob } from '../interfaces'; 3 | import Interval from './interval'; 4 | import { glob } from 'glob'; 5 | import { join } from 'path'; 6 | 7 | export default class Bot extends Client { 8 | public readonly commands = new Collection(); 9 | public readonly jobs = new Collection(); 10 | public interval: NodeJS.Timer; 11 | 12 | constructor() { 13 | super({ 14 | intents: [ 15 | IntentsBitField.Flags.Guilds, 16 | IntentsBitField.Flags.GuildMembers 17 | ] 18 | }); 19 | 20 | this.interval = setInterval(() => ( 21 | Interval(this) 22 | ), 1000); 23 | }; 24 | 25 | public async init(): Promise { 26 | this.loadCommands().loadEvents().login(process.env.DISCORD_TOKEN).then(() => { 27 | console.success(`Connected to Discord as ${this.user?.tag}.`); 28 | this.postCommands(); 29 | }); 30 | }; 31 | 32 | public postCommands(): Bot { 33 | const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN); 34 | console.info('Started loading application (/) commands...'); 35 | 36 | rest.put(Routes.applicationCommands(this.user.id), { 37 | body: this.commands.toJSON() 38 | }).then(() => { 39 | console.success(`Successfully loaded [${this.commands.size}] application (/) commands.`); 40 | }).catch(err => { 41 | console.error(err); 42 | process.exit(1); 43 | }); 44 | 45 | return this; 46 | }; 47 | 48 | public loadCommands(): Bot { 49 | glob('**/*.ts', { cwd: join(__dirname, '../commands') }, (err, files) => { 50 | if (err) { 51 | console.error(err); 52 | process.exit(1); 53 | } else { 54 | files.forEach(async file => { 55 | try { 56 | const { Command }: { Command: ICommand } = await import(`../commands/${file}`); 57 | if (this.commands.get(Command.name)) console.error(`Repeated command name. (name: ${Command.name}, file: ${file})`); 58 | else this.commands.set(Command.name, Command); 59 | } catch(err) { 60 | console.error(err); 61 | }; 62 | }); 63 | }; 64 | }); 65 | 66 | return this; 67 | }; 68 | 69 | public loadEvents(): Bot { 70 | glob('**/*.ts', { cwd: join(__dirname, '../events') }, (err, files) => { 71 | if (err) { 72 | console.error(err); 73 | process.exit(1); 74 | } else { 75 | files.forEach(async file => { 76 | try { 77 | const { Event }: { Event: IEvent } = await import(`../events/${file}`); 78 | this[Event.type](Event.name, Event.run.bind(null, this)); 79 | } catch(err) { 80 | console.error(err); 81 | }; 82 | }); 83 | }; 84 | }); 85 | 86 | return this; 87 | }; 88 | }; -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@discordjs/builders@^1.4.0": 13 | version "1.4.0" 14 | resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.4.0.tgz#b951b5e6ce4e459cd06174ce50dbd51c254c1d47" 15 | integrity sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA== 16 | dependencies: 17 | "@discordjs/util" "^0.1.0" 18 | "@sapphire/shapeshift" "^3.7.1" 19 | discord-api-types "^0.37.20" 20 | fast-deep-equal "^3.1.3" 21 | ts-mixer "^6.0.2" 22 | tslib "^2.4.1" 23 | 24 | "@discordjs/collection@^1.3.0": 25 | version "1.3.0" 26 | resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.3.0.tgz#65bf9674db72f38c25212be562bb28fa0dba6aa3" 27 | integrity sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg== 28 | 29 | "@discordjs/rest@^1.4.0": 30 | version "1.5.0" 31 | resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-1.5.0.tgz#dc15474ab98cf6f31291bf61bbc72bcf4f30cea2" 32 | integrity sha512-lXgNFqHnbmzp5u81W0+frdXN6Etf4EUi8FAPcWpSykKd8hmlWh1xy6BmE0bsJypU1pxohaA8lQCgp70NUI3uzA== 33 | dependencies: 34 | "@discordjs/collection" "^1.3.0" 35 | "@discordjs/util" "^0.1.0" 36 | "@sapphire/async-queue" "^1.5.0" 37 | "@sapphire/snowflake" "^3.2.2" 38 | discord-api-types "^0.37.23" 39 | file-type "^18.0.0" 40 | tslib "^2.4.1" 41 | undici "^5.13.0" 42 | 43 | "@discordjs/util@^0.1.0": 44 | version "0.1.0" 45 | resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-0.1.0.tgz#e42ca1bf407bc6d9adf252877d1b206e32ba369a" 46 | integrity sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ== 47 | 48 | "@jridgewell/resolve-uri@^3.0.3": 49 | version "3.1.0" 50 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 51 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 52 | 53 | "@jridgewell/sourcemap-codec@^1.4.10": 54 | version "1.4.14" 55 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 56 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 57 | 58 | "@jridgewell/trace-mapping@0.3.9": 59 | version "0.3.9" 60 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 61 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 62 | dependencies: 63 | "@jridgewell/resolve-uri" "^3.0.3" 64 | "@jridgewell/sourcemap-codec" "^1.4.10" 65 | 66 | "@sapphire/async-queue@^1.5.0": 67 | version "1.5.0" 68 | resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" 69 | integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== 70 | 71 | "@sapphire/shapeshift@^3.7.1": 72 | version "3.8.1" 73 | resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz#b98dc6a7180f9b38219267917b2e6fa33f9ec656" 74 | integrity sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw== 75 | dependencies: 76 | fast-deep-equal "^3.1.3" 77 | lodash "^4.17.21" 78 | 79 | "@sapphire/snowflake@^3.2.2": 80 | version "3.4.0" 81 | resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.4.0.tgz#25c012158a9feea2256c718985dbd6c1859a5022" 82 | integrity sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw== 83 | 84 | "@tokenizer/token@^0.3.0": 85 | version "0.3.0" 86 | resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" 87 | integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== 88 | 89 | "@tsconfig/node10@^1.0.7": 90 | version "1.0.9" 91 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 92 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 93 | 94 | "@tsconfig/node12@^1.0.7": 95 | version "1.0.11" 96 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 97 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 98 | 99 | "@tsconfig/node14@^1.0.0": 100 | version "1.0.3" 101 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 102 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 103 | 104 | "@tsconfig/node16@^1.0.2": 105 | version "1.0.3" 106 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 107 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 108 | 109 | "@types/glob@^8.0.1": 110 | version "8.0.1" 111 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.1.tgz#6e3041640148b7764adf21ce5c7138ad454725b0" 112 | integrity sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw== 113 | dependencies: 114 | "@types/minimatch" "^5.1.2" 115 | "@types/node" "*" 116 | 117 | "@types/minimatch@^5.1.2": 118 | version "5.1.2" 119 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" 120 | integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== 121 | 122 | "@types/node@*", "@types/node@^18.11.18": 123 | version "18.11.18" 124 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" 125 | integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== 126 | 127 | "@types/ws@^8.5.3": 128 | version "8.5.4" 129 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" 130 | integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== 131 | dependencies: 132 | "@types/node" "*" 133 | 134 | acorn-walk@^8.1.1: 135 | version "8.2.0" 136 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 137 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 138 | 139 | acorn@^8.4.1: 140 | version "8.8.2" 141 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" 142 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 143 | 144 | advanced-logs@^2.1.3: 145 | version "2.1.3" 146 | resolved "https://registry.yarnpkg.com/advanced-logs/-/advanced-logs-2.1.3.tgz#2ca57a0fbf35f12af5e350d6e04b34484732b4a5" 147 | integrity sha512-h83Q1ZRv3VXbt0NLrX/I8XxKUXwja9C7GceOoqbkHH1IAXD7RTF3iGn5T2FGJPQk8W7zKNyHek5igGOx5r5ggw== 148 | 149 | arg@^4.1.0: 150 | version "4.1.3" 151 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 152 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 153 | 154 | asynckit@^0.4.0: 155 | version "0.4.0" 156 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 157 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 158 | 159 | axios@^1.3.1: 160 | version "1.3.1" 161 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.1.tgz#80bf6c8dbb46e6db1fa8fe9ab114c1ca7405c2ee" 162 | integrity sha512-78pWJsQTceInlyaeBQeYZ/QgZeWS8hGeKiIJiDKQe3hEyBb7sEMq0K4gjx+Va6WHTYO4zI/RRl8qGRzn0YMadA== 163 | dependencies: 164 | follow-redirects "^1.15.0" 165 | form-data "^4.0.0" 166 | proxy-from-env "^1.1.0" 167 | 168 | balanced-match@^1.0.0: 169 | version "1.0.2" 170 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 171 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 172 | 173 | brace-expansion@^2.0.1: 174 | version "2.0.1" 175 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 176 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 177 | dependencies: 178 | balanced-match "^1.0.0" 179 | 180 | busboy@^1.6.0: 181 | version "1.6.0" 182 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" 183 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== 184 | dependencies: 185 | streamsearch "^1.1.0" 186 | 187 | combined-stream@^1.0.8: 188 | version "1.0.8" 189 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 190 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 191 | dependencies: 192 | delayed-stream "~1.0.0" 193 | 194 | create-require@^1.1.0: 195 | version "1.1.1" 196 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 197 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 198 | 199 | delayed-stream@~1.0.0: 200 | version "1.0.0" 201 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 202 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 203 | 204 | diff@^4.0.1: 205 | version "4.0.2" 206 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 207 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 208 | 209 | discord-api-types@^0.37.20, discord-api-types@^0.37.23: 210 | version "0.37.31" 211 | resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.31.tgz#128d33d641fd9a92fba97a47d7052e1f5694ec27" 212 | integrity sha512-k9DQQ7Wv+ehiF7901qk/FnP47k6O2MHm3meQFee4gUzi5dfGAVLf7SfLNtb4w7G2dmukJyWQtVJEDF9oMb9yuQ== 213 | 214 | discord.js@^14.7.1: 215 | version "14.7.1" 216 | resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.7.1.tgz#26079d0ff4d27daf02480a403c456121f0682bd9" 217 | integrity sha512-1FECvqJJjjeYcjSm0IGMnPxLqja/pmG1B0W2l3lUY2Gi4KXiyTeQmU1IxWcbXHn2k+ytP587mMWqva2IA87EbA== 218 | dependencies: 219 | "@discordjs/builders" "^1.4.0" 220 | "@discordjs/collection" "^1.3.0" 221 | "@discordjs/rest" "^1.4.0" 222 | "@discordjs/util" "^0.1.0" 223 | "@sapphire/snowflake" "^3.2.2" 224 | "@types/ws" "^8.5.3" 225 | discord-api-types "^0.37.20" 226 | fast-deep-equal "^3.1.3" 227 | lodash.snakecase "^4.1.1" 228 | tslib "^2.4.1" 229 | undici "^5.13.0" 230 | ws "^8.11.0" 231 | 232 | dotenv@^16.0.3: 233 | version "16.0.3" 234 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" 235 | integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== 236 | 237 | fast-deep-equal@^3.1.3: 238 | version "3.1.3" 239 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 240 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 241 | 242 | file-type@^18.0.0: 243 | version "18.2.0" 244 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.2.0.tgz#c2abec00d1af0f09151e1549e3588aab0bac5001" 245 | integrity sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg== 246 | dependencies: 247 | readable-web-to-node-stream "^3.0.2" 248 | strtok3 "^7.0.0" 249 | token-types "^5.0.1" 250 | 251 | follow-redirects@^1.15.0: 252 | version "1.15.2" 253 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 254 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 255 | 256 | form-data@^4.0.0: 257 | version "4.0.0" 258 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 259 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 260 | dependencies: 261 | asynckit "^0.4.0" 262 | combined-stream "^1.0.8" 263 | mime-types "^2.1.12" 264 | 265 | fs.realpath@^1.0.0: 266 | version "1.0.0" 267 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 268 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 269 | 270 | glob@^8.1.0: 271 | version "8.1.0" 272 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 273 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 274 | dependencies: 275 | fs.realpath "^1.0.0" 276 | inflight "^1.0.4" 277 | inherits "2" 278 | minimatch "^5.0.1" 279 | once "^1.3.0" 280 | 281 | ieee754@^1.2.1: 282 | version "1.2.1" 283 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 284 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 285 | 286 | inflight@^1.0.4: 287 | version "1.0.6" 288 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 289 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 290 | dependencies: 291 | once "^1.3.0" 292 | wrappy "1" 293 | 294 | inherits@2, inherits@^2.0.3: 295 | version "2.0.4" 296 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 297 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 298 | 299 | lodash.snakecase@^4.1.1: 300 | version "4.1.1" 301 | resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" 302 | integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== 303 | 304 | lodash@^4.17.21: 305 | version "4.17.21" 306 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 307 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 308 | 309 | make-error@^1.1.1: 310 | version "1.3.6" 311 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 312 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 313 | 314 | mime-db@1.52.0: 315 | version "1.52.0" 316 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 317 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 318 | 319 | mime-types@^2.1.12: 320 | version "2.1.35" 321 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 322 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 323 | dependencies: 324 | mime-db "1.52.0" 325 | 326 | minimatch@^5.0.1: 327 | version "5.1.6" 328 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 329 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 330 | dependencies: 331 | brace-expansion "^2.0.1" 332 | 333 | once@^1.3.0: 334 | version "1.4.0" 335 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 336 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 337 | dependencies: 338 | wrappy "1" 339 | 340 | peek-readable@^5.0.0: 341 | version "5.0.0" 342 | resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" 343 | integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== 344 | 345 | proxy-from-env@^1.1.0: 346 | version "1.1.0" 347 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 348 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 349 | 350 | readable-stream@^3.6.0: 351 | version "3.6.0" 352 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 353 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 354 | dependencies: 355 | inherits "^2.0.3" 356 | string_decoder "^1.1.1" 357 | util-deprecate "^1.0.1" 358 | 359 | readable-web-to-node-stream@^3.0.2: 360 | version "3.0.2" 361 | resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" 362 | integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== 363 | dependencies: 364 | readable-stream "^3.6.0" 365 | 366 | safe-buffer@~5.2.0: 367 | version "5.2.1" 368 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 369 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 370 | 371 | streamsearch@^1.1.0: 372 | version "1.1.0" 373 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" 374 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== 375 | 376 | string_decoder@^1.1.1: 377 | version "1.3.0" 378 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 379 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 380 | dependencies: 381 | safe-buffer "~5.2.0" 382 | 383 | strtok3@^7.0.0: 384 | version "7.0.0" 385 | resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5" 386 | integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== 387 | dependencies: 388 | "@tokenizer/token" "^0.3.0" 389 | peek-readable "^5.0.0" 390 | 391 | token-types@^5.0.1: 392 | version "5.0.1" 393 | resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" 394 | integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== 395 | dependencies: 396 | "@tokenizer/token" "^0.3.0" 397 | ieee754 "^1.2.1" 398 | 399 | ts-mixer@^6.0.2: 400 | version "6.0.2" 401 | resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.2.tgz#3e4e4bb8daffb24435f6980b15204cb5b287e016" 402 | integrity sha512-zvHx3VM83m2WYCE8XL99uaM7mFwYSkjR2OZti98fabHrwkjsCvgwChda5xctein3xGOyaQhtTeDq/1H/GNvF3A== 403 | 404 | ts-node@^10.9.1: 405 | version "10.9.1" 406 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 407 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 408 | dependencies: 409 | "@cspotcode/source-map-support" "^0.8.0" 410 | "@tsconfig/node10" "^1.0.7" 411 | "@tsconfig/node12" "^1.0.7" 412 | "@tsconfig/node14" "^1.0.0" 413 | "@tsconfig/node16" "^1.0.2" 414 | acorn "^8.4.1" 415 | acorn-walk "^8.1.1" 416 | arg "^4.1.0" 417 | create-require "^1.1.0" 418 | diff "^4.0.1" 419 | make-error "^1.1.1" 420 | v8-compile-cache-lib "^3.0.1" 421 | yn "3.1.1" 422 | 423 | tslib@^2.4.1: 424 | version "2.5.0" 425 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" 426 | integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== 427 | 428 | typescript@^4.9.5: 429 | version "4.9.5" 430 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 431 | integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 432 | 433 | undici@^5.13.0: 434 | version "5.16.0" 435 | resolved "https://registry.yarnpkg.com/undici/-/undici-5.16.0.tgz#6b64f9b890de85489ac6332bd45ca67e4f7d9943" 436 | integrity sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ== 437 | dependencies: 438 | busboy "^1.6.0" 439 | 440 | util-deprecate@^1.0.1: 441 | version "1.0.2" 442 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 443 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 444 | 445 | v8-compile-cache-lib@^3.0.1: 446 | version "3.0.1" 447 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 448 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 449 | 450 | wrappy@1: 451 | version "1.0.2" 452 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 453 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 454 | 455 | ws@^8.11.0: 456 | version "8.12.0" 457 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" 458 | integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== 459 | 460 | yn@3.1.1: 461 | version "3.1.1" 462 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 463 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 464 | --------------------------------------------------------------------------------