La year inactivity update! (#48)

* feat: non t message deletion

* feat: cloudflare ai!

* feat: image classification and llama 3

* feat: image classification and infinitecraft

* feat: add initial find and lower the paste length

* chore: add devServer boolean to gpt
This commit is contained in:
2024-04-22 21:25:52 +02:00
committed by GitHub
parent ecada7600e
commit 8005ac0699
12 changed files with 1060502 additions and 170 deletions

View File

@@ -0,0 +1,49 @@
import { commandModule, CommandType } from '@sern/handler';
import { publish } from '#plugins';
import { AttachmentBuilder } from 'discord.js';
import { createCanvas, loadImage } from '@napi-rs/canvas';
export default commandModule({
name: 'Clasifica una imagen',
type: CommandType.CtxMsg,
plugins: [publish()],
execute: async (ctx) => {
await ctx.deferReply()
if (ctx.targetMessage.attachments.size === 0) return ctx.editReply('No hay ninguna imagen para clasificar!');
const image = ctx.targetMessage.attachments.first();
if (!image.contentType.startsWith('image/')) return ctx.editReply('El archivo no es una imagen!');
const imageBlob = await fetch(image.url).then(async res => await res.arrayBuffer());
const imageUint8Array = new Uint8Array(imageBlob);
const request = await fetch(`https://api.cloudflare.com/client/v4/accounts/${process.env.CF_AI_ACC}/ai/run/@cf/facebook/detr-resnet-50`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CF_AI_TOKEN}`,
},
body: imageUint8Array,
}).then(async res => await res.json());
// all canvas stuff, this was fun to make
const canvas = createCanvas(image.width, image.height);
const ctxCanvas = canvas.getContext('2d');
const img = await loadImage(image.url);
ctxCanvas.drawImage(img, 0, 0, image.width, image.height);
ctxCanvas.font = '40px sans-serif';
ctxCanvas.fillStyle = 'red';
ctxCanvas.strokeStyle = 'red';
ctxCanvas.lineWidth = 3;
for (const result of request.result) {
if (result.score < 0.5) continue;
console.log(result)
const box = result.box;
ctxCanvas.strokeRect(box.xmin, box.ymin, box.xmax - box.xmin, box.ymax - box.ymin);
ctxCanvas.fillText(result.label, box.xmin, box.ymin - 5);
}
const canvasBuffer = canvas.toBuffer('image/png');
const attachment = new AttachmentBuilder(canvasBuffer, { name: 'generatedImage.png' });
await ctx.editReply({ files: [attachment] })
},
});

View File

@@ -0,0 +1,97 @@
import { commandModule, CommandType } from '@sern/handler';
import { ApplicationCommandOptionType, bold, codeBlock, EmbedBuilder, inlineCode } from 'discord.js';
import { publish } from '../../plugins/publish.js';
import fs from 'node:fs/promises'
import { ICFile } from '../../util/infinitecraft/decompress.js';
import Finder from '../../util/infinitecraft/finder.js';
const recipeFile = JSON.parse(await fs.readFile('./util/infinitecraft/recipes.json', 'utf-8')) as ICFile;
export default commandModule({
type: CommandType.Slash,
plugins: [publish()],
description: 'Descifra con un algoritmo cómo llegar a la receta de un objeto en InfiniteCraft',
options: [
{
name: 'objeto',
description: 'El objeto que quieres descifrar',
type: ApplicationCommandOptionType.String,
required: true,
autocomplete: true,
command: {
onEvent: [],
async execute(ctx) {
const input = ctx.options.getFocused();
const choices = recipeFile.items
.filter(item => item.toLowerCase().includes(input.toLowerCase()))
.slice(0, 25)
if (choices.length === 0) return ctx.respond([{ name: 'No se encontraron resultados', value: 'SSError' }]);
if (input.length === 0) return ctx.respond([{ name: 'Empieza a escribir', value: 'SSError' }]);
await ctx.respond(
choices.map(choice => {
return ({ name: choice, value: choice })
})
)
},
}
}
],
execute: async (ctx, [, options]) => {
await ctx.interaction.deferReply()
const object = options.getString('objeto', true)
if (object === 'SSError') return ctx.reply({
content: 'Has escogido el mensaje de error 💀',
ephemeral: true
});
if (!recipeFile.items.includes(options.getString('objeto', true))) return ctx.reply({
content: 'No se encontró el objeto. Asegúrate de escogerlo del autocompletado.',
ephemeral: true
});
let processed = 0
let timesBacked = 0
const infinitePath = new Finder((progress) => {
switch (progress.phase) {
case 0:
processed = progress.current
break;
case 1:
timesBacked = timesBacked + 1
break;
}
})
const interval = setInterval(() => {
ctx.interaction.editReply({
content: `Procesando...\n${inlineCode(processed.toString())} recetas procesadas, ${inlineCode(timesBacked.toString())} veces retrocedido.`,
})
}, 1250)
ctx.interaction.editReply({
content: `Procesando...\n${inlineCode(processed.toString())} recetas procesadas, ${inlineCode(timesBacked.toString())} veces retrocedido.`,
})
const initialTime = performance.now()
const path = await infinitePath.findItem(object)
const finalTime = performance.now()
clearInterval(interval)
if (path.length === 0) return ctx.interaction.editReply({
content: 'No se encontró la receta de este objeto.'
});
const recipe = path.map(({ first, second, result }) => `${first} + ${second} = ${result}`).join('\n')
if (recipe.length >= 1500) {
var paste = await fetch('https://fb.srizan.dev/paste', {
method: 'POST',
body: recipe
}).then(async res => await res.text())
}
const embed = new EmbedBuilder()
.setTitle(`Receta de ${object.toLowerCase()}`)
.setColor('Green')
.setDescription(paste ? `La ruta es demasiado grande, así que lo he puesto en un pastebin:\nhttps://fb.srizan.dev/${paste}` : codeBlock(recipe))
.setFooter({ text: 'Ya que se usa un algoritmo, puede o no ser la ruta más rápida para llegar al ítem' })
return ctx.interaction.editReply({
embeds: [embed],
content: `Por fin encontrado! La búsqueda tomó ${bold(((finalTime - initialTime) / 1000).toFixed(2))} segundos.`
})
},
});

View File

@@ -2,40 +2,115 @@ import { discordEvent } from '@sern/handler';
import axios from 'axios';
import { TextChannel } from 'discord.js';
import db from '../schemas/chatgpt.js';
import { fetchEventSource } from '@ai-zen/node-fetch-event-source';
import database from '../schemas/chatgpt';
import { devMode } from '../index.js';
export default discordEvent({
name: 'messageCreate',
async execute(message) {
if (message.channel.id !== process.env.CHATGPT_CHANNEL) return;
if (message.author.bot) return;
if (message.content.includes('ig')) return;
if (message.channel.id !== process.env.CHATGPT_CHANNEL) return;
if (message.author.bot) return;
if (message.content.includes('ig')) return;
try {
await (message.channel as TextChannel).sendTyping()
const response = await axios.post('https://chatgpt-api.shn.hk/v1/', {
"model": "gpt-3.5-turbo",
"messages": [{ "role": "user", "content": message.content }]
}).then(res => res.data)
const titleResponse = await axios.post('https://chatgpt-api.shn.hk/v1/', {
"model": "gpt-3.5-turbo",
"messages": [{ "role": "user", "content": `Generate a title in less than 6 words for the following message, also remove the quotes if you are going to add them AND don't put Title in the beginning:\nUser: ${message.content}\nAssistant: ${response.choices[0].message.content}` }]
}).then(res => res.data.choices[0].message.content.replaceAll('"', '') as string)
const botMsg = await message.reply({ content: response.choices[0].message.content.slice(0, 2000) })
const thread = await botMsg.startThread({ name: titleResponse })
const systemMsg =
"You are Vinci, a helpful Discord bot assistant which tries to answer all questions that your users ask. You MUST speak naturally, if you were texting somebody. Don't tell the user that you are an assistant as they already know. Markdown is supported, including headers, codeblocks, etc. You will also chat with spanish speaking users, so your responses MUST, without exception, be in the spanish language, including your responses down the line.";
try {
await (message.channel as TextChannel).sendTyping();
/*const response = await fetch(`https://api.cloudflare.com/client/v4/accounts/${process.env.CF_AI_ACC}/ai/run/@cf/meta/llama-2-7b-chat-int8`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CF_AI_TOKEN}`
},
body: JSON.stringify({
messages: [{ role: 'system', content: systemMsg }, { role: "user", content: message.content }]
})
}).then(async res => (await res.json()).result.response as string)*/
const dbData = new db({
messageid: message.id,
threadid: thread.id,
messages: [
{ role: 'user', content: message.content },
{ role: 'assistant', content: response.choices[0].message.content.replace(/^\n{2}/, '') }
]
})
await dbData.save()
} catch (e) {
await message.reply({ content: 'Algo ha ido mal.' }).catch(() => {})
console.log(e)
}
},
const messages = [
{ role: 'system', content: systemMsg },
{ role: 'user', content: message.content },
];
const ctrl = new AbortController();
let msg = '';
let isDone = false;
const sentMsg = await message.reply(':sparkles: Pensando...');
message.channel.sendTyping();
const sendInterval = setInterval(() => {
if (msg.length > 2000 || msg.length === 0) return;
message.channel.sendTyping();
sentMsg.edit(msg);
if (isDone) {
clearTimeout(sendInterval);
ctrl.abort();
return;
}
}, 1000);
fetchEventSource(
`https://api.cloudflare.com/client/v4/accounts/${process.env.CF_AI_ACC}/ai/run/@cf/meta/llama-2-7b-chat-int8`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CF_AI_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
stream: true,
messages,
}),
onmessage: async (ev) => {
if (ev.data === '[DONE]') {
ctrl.abort();
isDone = true;
await sentMsg.edit({ content: msg });
messages.push({ role: 'assistant', content: msg });
const titleResponse = await fetch(
`https://api.cloudflare.com/client/v4/accounts/${process.env.CF_AI_ACC}/ai/run/@cf/meta/llama-3-8b-instruct`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CF_AI_TOKEN}`,
},
body: JSON.stringify({
messages: [
{
role: 'user',
// the "else you'll die" part actually works well for the prompt!
content: `Generate a title for the following conversation. Only respond with the title, else you'll die:\\nUser: ${message.content}\\nAssistant: ${msg}`,
},
],
}),
}
).then(
async (res) =>
(await res.json()).result.response.replaceAll('"', '') as string
);
const thread = await sentMsg.startThread({ name: titleResponse });
const dbData = new db({
messageid: message.id,
threadid: thread.id,
devServer: devMode,
messages: [
{ role: 'system', content: systemMsg },
{ role: 'user', content: message.content },
{ role: 'assistant', content: msg.replace(/^\n{2}/, '') },
],
});
await dbData.save();
} else {
const data = JSON.parse(ev.data);
msg = msg + data.response;
}
},
signal: ctrl.signal,
}
);
} catch (e) {
await message.reply({ content: 'Algo ha ido mal :(' }).catch(() => {});
console.log(e);
}
},
});

View File

@@ -1,7 +1,7 @@
import { discordEvent } from '@sern/handler';
import axios from 'axios';
import { ThreadChannel } from 'discord.js';
import database from '../schemas/chatgpt.js';
import { fetchEventSource } from '@ai-zen/node-fetch-event-source';
export default discordEvent({
name: 'messageCreate',
@@ -13,41 +13,59 @@ export default discordEvent({
try {
await thread.sendTyping()
let newObj = { role: 'user', content: message.content }
let db = await database.findOneAndUpdate({ threadid: thread.id }, {
$push: {
messages: newObj
}
})
const newObj = [{ role: 'user', content: message.content }]
const db = await database.findOne({ threadid: thread.id }).exec()
const messages = db!.messages.map((message) => {
const { _id, ...rest } = message.toObject(); // Convert Mongoose document to plain object and remove _id field
const { _id, ...rest } = message.toObject();
return rest
})
const response = await axios.post('https://chatgpt-api.shn.hk/v1/', {
"model": "gpt-3.5-turbo",
"messages": messages
}, {
const ctrl = new AbortController();
let msg = ''
let isDone = false
const sentMsg = await message.reply(':sparkles: Pensando...')
const sendInterval = setInterval(() => {
if (msg.length > 2000 || msg.length === 0) return
thread.sendTyping()
sentMsg.edit(msg)
if (isDone) {
clearTimeout(sendInterval)
ctrl.abort()
return
}
}, 1000)
fetchEventSource(`https://api.cloudflare.com/client/v4/accounts/${process.env.CF_AI_ACC}/ai/run/@cf/meta/llama-3-8b-instruct`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CF_AI_TOKEN}`,
'Content-Type': 'application/json'
}
}).then(res => res.data.choices[0].message.content as string)
newObj = { role: 'assistant', content: response }
db = await database.findOneAndUpdate({ threadid: thread.id }, {
$push: {
messages: newObj
}
},
body: JSON.stringify({
stream: true,
messages: messages.concat(newObj)
}),
onmessage: async (ev) => {
if (ev.data === '[DONE]') {
ctrl.abort()
isDone = true
newObj.push({ role: 'assistant', content: msg })
await database.findOneAndUpdate({ threadid: thread.id }, {
$push: {
messages: newObj
}
}).exec()
await sentMsg.edit({ content: msg })
} else {
const data = JSON.parse(ev.data)
msg = msg + data.response
}
},
signal: ctrl.signal
})
await message.reply({ content: response.slice(0, 2000) })
} catch (e) {
await message.reply('Algo ha ido mal.')
console.log(e)
}
},
});
function replacer(key, value) {
return value.replace(/[^\w\s]/gi, '');
}
});

10
events/t.ts Normal file
View File

@@ -0,0 +1,10 @@
import { discordEvent } from '@sern/handler';
export default discordEvent({
name: 'messageCreate',
async execute(msg) {
if (msg.channel.id !== process.env.T_CHANNEL) return;
if (msg.content !== 'T')
return await msg.delete();
}
});

View File

@@ -11,7 +11,7 @@ import minecraftstatus from './util/minecraftstatus.js';
import Spotify from 'spotify-api.js';
// import giveawaychecker from './util/giveawaychecker.js';
let devMode: boolean
export let devMode: boolean
if (process.argv[2] === '--dev') {
devMode = true
dotenv({path: '.env.dev'})

View File

@@ -1,6 +1,6 @@
{
"name": "vinci",
"version": "1.0.0",
"version": "1.1.0",
"description": "Vinci Discord Bot for Mara Turing",
"main": "dist/index.js",
"scripts": {
@@ -32,18 +32,21 @@
},
"homepage": "https://github.com/SrIzan10/vinci#readme",
"dependencies": {
"@ai-zen/node-fetch-event-source": "^2.1.4",
"@consumet/extensions": "1.3.5",
"@discordjs/opus": "^0.9.0",
"@discordjs/voice": "^0.15.0",
"@microsoft/fetch-event-source": "^2.0.1",
"@napi-rs/canvas": "^0.1.30",
"@sern/handler": "^3.0.3",
"axios": "^1.1.3",
"@sern/handler": "^3.3.4",
"axios": "^1.6.8",
"dayjs": "^1.11.6",
"discord-tictactoe": "^4.0.0",
"discord.js": "^14.13.0",
"discord.js": "^14.14.1",
"dotenv": "^16.0.1",
"execa": "^6.1.0",
"express": "^4.18.1",
"extended-eventsource": "^1.4.6",
"form-data": "^4.0.0",
"genius-lyrics": "^4.4.3",
"googlethis": "^1.7.1",

View File

@@ -1,11 +1,12 @@
import mongoose from 'mongoose'
const messageSchema = new mongoose.Schema({
role: { type: String, required: true },
content: { type: String, required: true },
content: { type: String, reqmuired: true },
});
const schema = new mongoose.Schema({
messageid: { type: String, required: true },
threadid: { type: String, required: true },
devServer: { type: Boolean, required: true },
messages: { type: [messageSchema], required: true },
});
const db = mongoose.model('chatgpt', schema, 'chatgpt');

View File

@@ -0,0 +1,20 @@
export async function decompressRecipes(file: ICFile) {
const recipes = file.recipes;
const items = file.items;
return recipes.map((recipe) => ({
first: items[recipe[0]]!,
second: items[recipe[1]]!,
result: items[recipe[2]]!,
})) as Recipe[];
}
export interface Recipe {
first: string;
second: string;
result: string;
}
export interface ICFile {
recipes: number[][];
items: string[];
}

View File

@@ -0,0 +1,203 @@
// code based off of: https://github.com/vantezzen/infinite-craft-solver/blob/main/apps/web/lib/Finder.ts
// thanks to @vantezzen for such a cool algo
import fs from 'fs/promises'
import { ICFile, decompressRecipes } from './decompress.js';
export interface Recipe {
first: string;
second: string;
result: string;
}
export enum FinderPhase {
Search,
Backtrack,
}
export interface FinderProgess {
current: number;
phase: FinderPhase;
}
export default class Finder {
private DEFAULT_ITEMS = ["Water", "Fire", "Wind", "Earth"];
private recipes: Recipe[] = []; // Array to store all recipes
private recipeMap: Map<string, Recipe[]> = new Map(); // Map to store recipes for each item
private recipesLoaded: boolean = false; // Flag to check if recipes are loaded
public items = new Set<string>(this.DEFAULT_ITEMS);
constructor(
private onProgress: (progress: FinderProgess) => void = () => {}
) {}
private async loadRecipes() {
const file = JSON.parse(await fs.readFile("./util/infinitecraft/recipes.json", "utf-8")) as ICFile
this.recipes = await decompressRecipes(file);
this.items = new Set<string>(file.items);
for (const recipe of this.recipes) {
if (!this.recipeMap.has(recipe.result)) {
this.recipeMap.set(recipe.result, []);
}
this.recipeMap.get(recipe.result)!.push(recipe);
}
this.recipesLoaded = true;
}
async findItem(targetItem: string) {
if (this.DEFAULT_ITEMS.includes(targetItem)) {
return [];
}
if (!this.recipesLoaded) {
await this.loadRecipes();
}
if (!this.items.has(targetItem)) {
throw new Error("Item not found");
}
const path = await this.findShortestPath(targetItem);
if (!path) {
throw new Error("Item cannot be crafted");
}
return path;
};
private async findShortestPath(targetItem: string): Promise<Recipe[] | null> {
const itemQueue: {
item: string;
recipe: Recipe | null;
}[] = this.DEFAULT_ITEMS.map((item) => ({
item,
recipe: null,
}));
const recipesUsed = new Set<Recipe>();
const discoveredItems = new Set<string>(this.DEFAULT_ITEMS);
let itemsProcessed = 0;
const updateInterval = setInterval(() => {
this.onProgress({
current: itemsProcessed,
phase: FinderPhase.Search,
});
}, 100);
let cleanedRecipes = this.recipes.filter((recipe) => {
const isCircularRecipe =
recipe.first === recipe.result || recipe.second === recipe.result;
const containsNothing =
recipe.first === "Nothing" ||
recipe.second === "Nothing" ||
recipe.result === "Nothing";
return !isCircularRecipe && !containsNothing;
});
while (itemQueue.length > 0) {
itemsProcessed++;
const { item, recipe } = itemQueue.shift()!;
if (item === targetItem) {
// console.log("Found path", recipesUsed.size);
clearInterval(updateInterval);
return await this.backtrackPath(targetItem, recipe, [...recipesUsed]);
}
cleanedRecipes.forEach((recipe) => {
const hasDiscoveredItems =
discoveredItems.has(recipe.first) &&
discoveredItems.has(recipe.second);
if (!hasDiscoveredItems) return;
const resultAlreadyDiscovered = discoveredItems.has(recipe.result);
if (resultAlreadyDiscovered) return;
discoveredItems.add(recipe.result);
recipesUsed.add(recipe);
itemQueue.push({
item: recipe.result,
recipe,
});
});
cleanedRecipes = cleanedRecipes.filter(
(r) => !recipesUsed.has(r) && !discoveredItems.has(r.result)
);
await new Promise((resolve) => setTimeout(resolve, 0));
}
clearInterval(updateInterval);
return null;
}
private async backtrackPath(
targetItem: string,
recipe: Recipe | null,
recipesUsed: Recipe[]
): Promise<Recipe[]> {
if (!recipe) {
return [];
}
// "recipesUsed" contains recipes that are not part of the shortest path to the target item
// We want to backtrack from the target item to the source items (this.DEFAULT_ITEMS) to find the shortest path
const recipes: Recipe[] = [recipe];
const itemQueue = [recipe?.first, recipe?.second];
const discoveredItems = new Set<string>([targetItem]);
const updateInfo = () => {
this.onProgress({
current: recipes.length,
phase: FinderPhase.Backtrack,
});
};
const updateInterval = setInterval(() => {
updateInfo();
}, 50);
updateInfo();
await new Promise((resolve) => setTimeout(resolve, 0));
while (itemQueue.length > 0) {
const item = itemQueue.shift()!;
if (this.DEFAULT_ITEMS.includes(item)) {
continue;
}
const recipeUsedForItem = recipesUsed.find(
(recipe) => recipe.result === item
);
if (!recipeUsedForItem) {
continue;
}
recipes.push(recipeUsedForItem);
discoveredItems.add(recipeUsedForItem.first);
discoveredItems.add(recipeUsedForItem.second);
itemQueue.push(recipeUsedForItem.first, recipeUsedForItem.second);
await new Promise((resolve) => setTimeout(resolve, 0));
}
clearInterval(updateInterval);
return this.removeDuplicates(recipes.reverse());
}
private removeDuplicates(path: Recipe[]): Recipe[] {
const seen = new Set<string>();
return path.filter((recipe) => {
const key = `${recipe.first}-${recipe.second}-${recipe.result}`;
if (seen.has(key)) {
return false;
}
seen.add(key);
return true;
});
}
}

1059783
util/infinitecraft/recipes.json Normal file

File diff suppressed because it is too large Load Diff

287
yarn.lock
View File

@@ -2,6 +2,13 @@
# yarn lockfile v1
"@ai-zen/node-fetch-event-source@^2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@ai-zen/node-fetch-event-source/-/node-fetch-event-source-2.1.4.tgz#57f0e3bb129eb06dc8df8be0cc7d27a96c49da67"
integrity sha512-OHFwPJecr+qwlyX5CGmTvKAKPZAdZaxvx/XDqS1lx4I2ZAk9riU0XnEaRGOOAEFrdcLZ98O5yWqubwjaQc0umg==
dependencies:
cross-fetch "^4.0.0"
"@aws-crypto/crc32@3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa"
@@ -720,34 +727,39 @@
ts-mixer "^6.0.2"
tslib "^2.4.1"
"@discordjs/builders@^1.6.5":
version "1.6.5"
resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.6.5.tgz#3e23912eaab1d542b61ca0fa7202e5aaef2b7200"
integrity sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg==
"@discordjs/builders@^1.7.0":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.7.0.tgz#e2478c7e55b0f4c40837edb8f102bce977323a37"
integrity sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==
dependencies:
"@discordjs/formatters" "^0.3.2"
"@discordjs/util" "^1.0.1"
"@sapphire/shapeshift" "^3.9.2"
discord-api-types "0.37.50"
"@discordjs/formatters" "^0.3.3"
"@discordjs/util" "^1.0.2"
"@sapphire/shapeshift" "^3.9.3"
discord-api-types "0.37.61"
fast-deep-equal "^3.1.3"
ts-mixer "^6.0.3"
tslib "^2.6.1"
tslib "^2.6.2"
"@discordjs/collection@1.5.3":
version "1.5.3"
resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18"
integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==
"@discordjs/collection@^1.3.0":
version "1.3.0"
resolved "https://registry.npmjs.org/@discordjs/collection/-/collection-1.3.0.tgz"
"@discordjs/collection@^1.5.3":
version "1.5.3"
resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18"
integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==
"@discordjs/collection@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.0.0.tgz#409b80c74eb8486cc4ee6a9b83426aaff1380f8c"
integrity sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==
"@discordjs/formatters@^0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.2.tgz#3ae054f7b3097cc0dc7645fade37a3f20fa1fb4b"
integrity sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA==
"@discordjs/formatters@^0.3.3":
version "0.3.3"
resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.3.tgz#b16fdd79bb819680ab7e519193004e9dc124a749"
integrity sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==
dependencies:
discord-api-types "0.37.50"
discord-api-types "0.37.61"
"@discordjs/node-pre-gyp@^0.4.5":
version "0.4.5"
@@ -783,29 +795,29 @@
tslib "^2.4.1"
undici "^5.13.0"
"@discordjs/rest@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.0.1.tgz#100c208a964e54b8d7cd418bbaed279c816b8ec5"
integrity sha512-/eWAdDRvwX/rIE2tuQUmKaxmWeHmGealttIzGzlYfI4+a7y9b6ZoMp8BG/jaohs8D8iEnCNYaZiOFLVFLQb8Zg==
"@discordjs/rest@^2.1.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.2.0.tgz#f4ec00d3faff965c00a879b7e87bb4b6f4446966"
integrity sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==
dependencies:
"@discordjs/collection" "^1.5.3"
"@discordjs/util" "^1.0.1"
"@discordjs/collection" "^2.0.0"
"@discordjs/util" "^1.0.2"
"@sapphire/async-queue" "^1.5.0"
"@sapphire/snowflake" "^3.5.1"
"@vladfrangu/async_event_emitter" "^2.2.2"
discord-api-types "0.37.50"
magic-bytes.js "^1.0.15"
tslib "^2.6.1"
undici "5.22.1"
discord-api-types "0.37.61"
magic-bytes.js "^1.5.0"
tslib "^2.6.2"
undici "5.27.2"
"@discordjs/util@^0.1.0":
version "0.1.0"
resolved "https://registry.npmjs.org/@discordjs/util/-/util-0.1.0.tgz"
"@discordjs/util@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.1.tgz#7d6f97b65425d3a8b46ea1180150dee6991a88cf"
integrity sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA==
"@discordjs/util@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.2.tgz#dc1896d764452b1bd9707eb9aa99ccfbb30bd1c0"
integrity sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==
"@discordjs/voice@^0.15.0":
version "0.15.0"
@@ -817,20 +829,25 @@
tslib "^2.5.0"
ws "^8.12.1"
"@discordjs/ws@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.0.1.tgz#fab8aa4c1667040a95b5268a2875add27353d323"
integrity sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g==
"@discordjs/ws@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.0.2.tgz#3933b12d4686aabf6a95dfe5fb6e744342a661d1"
integrity sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==
dependencies:
"@discordjs/collection" "^1.5.3"
"@discordjs/rest" "^2.0.1"
"@discordjs/util" "^1.0.1"
"@discordjs/collection" "^2.0.0"
"@discordjs/rest" "^2.1.0"
"@discordjs/util" "^1.0.2"
"@sapphire/async-queue" "^1.5.0"
"@types/ws" "^8.5.5"
"@types/ws" "^8.5.9"
"@vladfrangu/async_event_emitter" "^2.2.2"
discord-api-types "0.37.50"
tslib "^2.6.1"
ws "^8.13.0"
discord-api-types "0.37.61"
tslib "^2.6.2"
ws "^8.14.2"
"@fastify/busboy@^2.0.0":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d"
integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
"@jridgewell/resolve-uri@^3.0.3":
version "3.1.0"
@@ -847,6 +864,11 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@microsoft/fetch-event-source@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d"
integrity sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==
"@napi-rs/canvas-android-arm64@0.1.37":
version "0.1.37"
resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.37.tgz#812724d3c0fa9e3147c3a74a8f705fa7e661a437"
@@ -908,31 +930,32 @@
fast-deep-equal "^3.1.3"
lodash "^4.17.21"
"@sapphire/shapeshift@^3.9.2":
version "3.9.2"
resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.2.tgz#a9c12cd51e1bc467619bb56df804450dd14871ac"
integrity sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==
"@sapphire/shapeshift@^3.9.3":
version "3.9.7"
resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.7.tgz#43e23243cac8a0c046bf1e73baf3dbf407d33a0c"
integrity sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==
dependencies:
fast-deep-equal "^3.1.3"
lodash "^4.17.21"
"@sapphire/snowflake@3.5.1", "@sapphire/snowflake@^3.5.1":
version "3.5.1"
resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec"
integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==
"@sapphire/snowflake@^3.2.2":
version "3.4.0"
resolved "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz"
"@sapphire/snowflake@^3.5.1":
version "3.5.1"
resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec"
integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==
"@sern/handler@^3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@sern/handler/-/handler-3.0.3.tgz#6b286219a7091693d298e38636c49808ebfd3840"
integrity sha512-kQBHXE+yejAMCWH7+XqwJViCYgSt8dtVb0cyPp36pMCgjodYIXk8lJ26eQ3KVy3PTSMIlgnw1QztZCrAYa6qTw==
"@sern/handler@^3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@sern/handler/-/handler-3.3.4.tgz#a842aec8dd9f9b470a7f0ceda957d0c1a86acc5d"
integrity sha512-kQQV31BUv5L1EiVapCwzZQMLtBwuRdu7+fwn1NMFDcOtRlyfcXwQYrUERNLE4Gj638egjDzIg/L0d5Bb+t/VrA==
dependencies:
callsites "^3.1.0"
iti "^0.6.0"
rxjs "^7.8.0"
ts-results-es "^3.6.1"
ts-results-es "^4.0.0"
"@sindresorhus/is@^5.2.0":
version "5.3.0"
@@ -1045,16 +1068,23 @@
"@types/node" "*"
"@types/webidl-conversions" "*"
"@types/ws@8.5.9":
version "8.5.9"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c"
integrity sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==
dependencies:
"@types/node" "*"
"@types/ws@^8.5.3", "@types/ws@^8.5.4":
version "8.5.4"
resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz"
dependencies:
"@types/node" "*"
"@types/ws@^8.5.5":
version "8.5.5"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb"
integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==
"@types/ws@^8.5.9":
version "8.5.10"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787"
integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==
dependencies:
"@types/node" "*"
@@ -1140,6 +1170,15 @@ axios@^1.1.3:
form-data "^4.0.0"
proxy-from-env "^1.1.0"
axios@^1.6.8:
version "1.6.8"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66"
integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
@@ -1227,6 +1266,11 @@ call-bind@^1.0.0:
function-bind "^1.1.1"
get-intrinsic "^1.0.2"
callsites@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
cheerio-select@^1.5.0:
version "1.6.0"
resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz"
@@ -1316,6 +1360,13 @@ create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz"
cross-fetch@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983"
integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==
dependencies:
node-fetch "^2.6.12"
cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
@@ -1406,10 +1457,10 @@ diff@^4.0.1:
version "4.0.2"
resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
discord-api-types@0.37.50:
version "0.37.50"
resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.50.tgz#6059eb8c0b784ad8194655a8b8b7f540fcfac428"
integrity sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==
discord-api-types@0.37.61:
version "0.37.61"
resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.61.tgz#9dd8e58c624237e6f1b23be2d29579af268b8c5b"
integrity sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==
discord-api-types@^0.37.20, discord-api-types@^0.37.23, discord-api-types@^0.37.35:
version "0.37.35"
@@ -1421,25 +1472,25 @@ discord-tictactoe@^4.0.0:
dependencies:
discord.js "^14.3.0"
discord.js@^14.13.0:
version "14.13.0"
resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.13.0.tgz#e7a00bdba70adb9e266a06884ca1acaf9a0b5c20"
integrity sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA==
discord.js@^14.14.1:
version "14.14.1"
resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.14.1.tgz#9a2bea23bba13819705ab87612837610abce9ee3"
integrity sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==
dependencies:
"@discordjs/builders" "^1.6.5"
"@discordjs/collection" "^1.5.3"
"@discordjs/formatters" "^0.3.2"
"@discordjs/rest" "^2.0.1"
"@discordjs/util" "^1.0.1"
"@discordjs/ws" "^1.0.1"
"@sapphire/snowflake" "^3.5.1"
"@types/ws" "^8.5.5"
discord-api-types "0.37.50"
fast-deep-equal "^3.1.3"
lodash.snakecase "^4.1.1"
tslib "^2.6.1"
undici "5.22.1"
ws "^8.13.0"
"@discordjs/builders" "^1.7.0"
"@discordjs/collection" "1.5.3"
"@discordjs/formatters" "^0.3.3"
"@discordjs/rest" "^2.1.0"
"@discordjs/util" "^1.0.2"
"@discordjs/ws" "^1.0.2"
"@sapphire/snowflake" "3.5.1"
"@types/ws" "8.5.9"
discord-api-types "0.37.61"
fast-deep-equal "3.1.3"
lodash.snakecase "4.1.1"
tslib "2.6.2"
undici "5.27.2"
ws "8.14.2"
discord.js@^14.3.0:
version "14.7.1"
@@ -1604,7 +1655,12 @@ express@^4.18.1:
utils-merge "1.0.1"
vary "~1.1.2"
fast-deep-equal@^3.1.3:
extended-eventsource@^1.4.6:
version "1.4.6"
resolved "https://registry.yarnpkg.com/extended-eventsource/-/extended-eventsource-1.4.6.tgz#7dca49515ad174d77f509534ddec9c573d66f968"
integrity sha512-5KvOiwRph/8hQbxU5V3WGmdNTN4NaqBVdlREyOdA4Tza8kupkOTKdev2O445kspfCE3KFpRG072lOme+BFZ3Hg==
fast-deep-equal@3.1.3, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
@@ -1645,6 +1701,11 @@ follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0:
version "1.15.2"
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
follow-redirects@^1.15.6:
version "1.15.6"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
form-data-encoder@^2.1.2:
version "2.1.4"
resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz"
@@ -1893,7 +1954,7 @@ libsodium@^0.7.11:
version "0.7.11"
resolved "https://registry.npmjs.org/libsodium/-/libsodium-0.7.11.tgz"
lodash.snakecase@^4.1.1:
lodash.snakecase@4.1.1, lodash.snakecase@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz"
@@ -1911,10 +1972,10 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
magic-bytes.js@^1.0.15:
version "1.0.15"
resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.0.15.tgz#3c9d2b7d45bb8432482646b5f74bbf6725274616"
integrity sha512-bpRmwbRHqongRhA+mXzbLWjVy7ylqmfMBYaQkSs6pac0z6hBTvsgrH0r4FBYd/UYVJBmS6Rp/O+oCCQVLzKV1g==
magic-bytes.js@^1.5.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz#c41cf4bc2f802992b05e64962411c9dd44fdef92"
integrity sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==
make-dir@^3.1.0:
version "3.1.0"
@@ -2073,6 +2134,13 @@ node-domexception@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz"
node-fetch@^2.6.12:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
dependencies:
whatwg-url "^5.0.0"
node-fetch@^2.6.7:
version "2.6.9"
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz"
@@ -2538,10 +2606,10 @@ ts-node@10.9.1:
v8-compile-cache-lib "^3.0.1"
yn "3.1.1"
ts-results-es@^3.6.1:
version "3.6.1"
resolved "https://registry.yarnpkg.com/ts-results-es/-/ts-results-es-3.6.1.tgz#2249aca8690b3b68445873c2a3da9517db98a16b"
integrity sha512-J1i9VBJd6PV+W9ZYJLNGiwzEW34f+dbrB8GzL5VEUdDEWQqU89DtSx4oeX01h5e+GP1xI4e7CRn7fbYeNKdZOg==
ts-results-es@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/ts-results-es/-/ts-results-es-4.1.0.tgz#d0057dd16e40125d039c134a3124cf1783ce84ce"
integrity sha512-7V37C/Zzx2K2U48fpC7jiQc5aDFZJoGD6sQ6EZgeoHqdTTIHy8yVB8+oXZx268hz9qJa0oUCrc1OAyPJH5Q8MQ==
tsc-watch@^5.0.3:
version "5.0.3"
@@ -2553,6 +2621,11 @@ tsc-watch@^5.0.3:
string-argv "^0.1.1"
strip-ansi "^6.0.0"
tslib@2.6.2, tslib@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
tslib@^1.11.1:
version "1.14.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
@@ -2561,11 +2634,6 @@ tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1, tslib@^2.4.1, tslib@^2.5.0:
version "2.5.0"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz"
tslib@^2.6.1:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
type-is@~1.6.18:
version "1.6.18"
resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
@@ -2578,12 +2646,12 @@ typescript@^5.2.2:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78"
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
undici@5.22.1:
version "5.22.1"
resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b"
integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==
undici@5.27.2:
version "5.27.2"
resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411"
integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==
dependencies:
busboy "^1.6.0"
"@fastify/busboy" "^2.0.0"
undici@^5.13.0, undici@^5.8.2:
version "5.20.0"
@@ -2665,14 +2733,19 @@ wrappy@1:
version "1.0.2"
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
ws@8.14.2:
version "8.14.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f"
integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==
ws@^8.11.0, ws@^8.12.1:
version "8.12.1"
resolved "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz"
ws@^8.13.0:
version "8.13.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
ws@^8.14.2:
version "8.16.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"
integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
yallist@^4.0.0:
version "4.0.0"