From ff7061994ca87b1c975c026e60384a12e8402a93 Mon Sep 17 00:00:00 2001 From: Chris Bockover Date: Wed, 18 Dec 2024 20:47:00 -0500 Subject: [PATCH] Refactor --- src/index.ts | 263 +----------------- src/{ => mango}/client.ts | 0 src/{ => mango}/coder.ts | 0 src/mango/commands.ts | 5 + src/mango/discord.ts | 18 ++ src/{ => mango}/dispatcher.ts | 4 +- src/{ => mango}/emoji.ts | 0 src/{ => mango/events}/commands/add.ts | 11 +- src/{ => mango/events}/commands/delete.ts | 4 +- src/{ => mango/events}/commands/setcatalog.ts | 2 +- src/{ => mango/events}/commands/setupdates.ts | 2 +- .../events}/commands/subscriptions.ts | 2 +- .../events}/commands/updatecatalog.ts | 4 +- src/mango/events/handle-message-create.ts | 44 +++ .../events/handle-message-reaction-add.ts | 108 +++++++ src/mango/events/handle-ready.ts | 30 ++ src/{ => mango}/fetch-manga.ts | 6 +- src/mango/jobs/check-for-manga-updates.ts | 90 ++++++ src/{ => mango}/prisma.ts | 0 src/{ => mango}/sidecar.ts | 12 +- src/{ => mango}/update-catalog.ts | 0 yarn.lock | 202 +++++++------- 22 files changed, 426 insertions(+), 381 deletions(-) rename src/{ => mango}/client.ts (100%) rename src/{ => mango}/coder.ts (100%) create mode 100644 src/mango/commands.ts create mode 100644 src/mango/discord.ts rename src/{ => mango}/dispatcher.ts (69%) rename src/{ => mango}/emoji.ts (100%) rename src/{ => mango/events}/commands/add.ts (84%) rename src/{ => mango/events}/commands/delete.ts (89%) rename src/{ => mango/events}/commands/setcatalog.ts (90%) rename src/{ => mango/events}/commands/setupdates.ts (90%) rename src/{ => mango/events}/commands/subscriptions.ts (96%) rename src/{ => mango/events}/commands/updatecatalog.ts (74%) create mode 100644 src/mango/events/handle-message-create.ts create mode 100644 src/mango/events/handle-message-reaction-add.ts create mode 100644 src/mango/events/handle-ready.ts rename src/{ => mango}/fetch-manga.ts (89%) create mode 100644 src/mango/jobs/check-for-manga-updates.ts rename src/{ => mango}/prisma.ts (100%) rename src/{ => mango}/sidecar.ts (91%) rename src/{ => mango}/update-catalog.ts (100%) diff --git a/src/index.ts b/src/index.ts index 0af4ed8..af7fc3e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,262 +1,3 @@ -import { Events } from "discord.js"; -import client from "./client"; -import prisma from "./prisma"; -import fs from "fs"; -import { Command } from "./types/command"; -import schedule from "node-schedule"; -import fetchManga from "./fetch-manga"; -import { emojiNumbers } from "./emoji"; +import { startDiscordClient } from "./mango/discord"; -const commands = new Map(); - -client.on(Events.ClientReady, (client) => { - console.log(`Logged in as ${client.user?.tag}!`); - client.guilds.cache.forEach(async (guild) => { - console.log(`Logged in to guild ${guild.name}`); - await prisma.guild.upsert({ - where: { - id: guild.id, - }, - update: { - name: guild.name, - }, - create: { - id: guild.id, - name: guild.name, - }, - }); - }); - const commandFiles = fs.readdirSync("./src/commands").filter((file) => file.endsWith(".ts")); - for (const file of commandFiles) { - const command = require(`./commands/${file}`).default; - commands.set(command.name, command); - console.log(`Loaded command ${command.name}`); - } -}); - -client.on(Events.MessageCreate, async (msg) => { - if (!msg.guild) { - return; - } - - if (!msg.content.startsWith("!")) { - return; - } - - const args = msg.content.slice(1).trim().split(/ +/); - - const commandName = args.shift()?.toLowerCase(); - - if (!commandName) { - return; - } - - const command = commands.get(commandName); - - if (!command) { - return; - } - - if (command.usableBy && !command.usableBy.includes(msg.author.id)) { - await msg.channel.send( - `You don't have permission to use this command, ${msg.author.displayName}! - ${command.usableBy - .map((id) => `<@${id}>`) - .join(" ")}` - ); - return; - } - - try { - await command.run({ client, msg, prisma }, args); - } catch (error) { - console.error(error); - msg.channel.send("There was an error trying to execute that command!"); - } -}); - -client.on(Events.MessageReactionAdd, async (reaction, user) => { - if (reaction.partial) { - try { - await reaction.fetch(); - } catch (error) { - return; - } - } - if (!reaction.message.guild) { - return; - } - - if (user.bot) { - return; - } - - const guild = await prisma.guild.findUnique({ - where: { - id: reaction.message.guild.id, - }, - }); - - if (!guild) { - return; - } - - if (reaction.message.channel.id !== guild.catalogChannelId) { - return; - } - - const emoji = reaction.emoji.name; - - if (!emoji || !emojiNumbers.includes(emoji)) { - return; - } - - const message = reaction.message; - if (!message.content) { - return; - } - - const messageSeries = message.content.split("\n"); - - const seriesFromIndex = messageSeries[emojiNumbers.indexOf(emoji)]; - - if (!seriesFromIndex) { - return; - } - - const seriesName = seriesFromIndex - .replace(/[\u{0080}-\u{FFFF}]/gu, "") - .slice(2) - .split(" -> ")[0]; - - const serie = await prisma.series.findUnique({ - where: { - name: seriesName, - }, - }); - - if (!serie) { - return; - } - - const resolvedUser = await client.users.fetch(user.id); - - const subscriptionExists = await prisma.subscription.findUnique({ - where: { - guildId_seriesId_userId: { - guildId: guild.id, - seriesId: serie.id, - userId: user.id, - }, - }, - }); - - if (subscriptionExists) { - await prisma.subscription.delete({ - where: { - guildId_seriesId_userId: { - guildId: guild.id, - seriesId: serie.id, - userId: user.id, - }, - }, - }); - await reaction.users.remove(resolvedUser); - return; - } - - await prisma.subscription.create({ - data: { - guildId: guild.id, - seriesId: serie.id, - userId: user.id, - }, - }); - - await reaction.users.remove(resolvedUser); -}); - -const job = schedule.scheduleJob("*/30 * * * *", async () => { - console.log(`Checking for updates at ${new Date().toISOString()}`); - const series = await prisma.series.findMany({ - include: { - subscription: true, - }, - }); - - const guildsSeries = await prisma.guildsSeries.findMany({ - where: {}, - include: { - guild: true, - }, - }); - - const seriesUpdates = await fetchManga( - series.map((s) => ({ - url: s.url, - source: s.source, - })) - ); - - for (const update of seriesUpdates) { - const serie = series.find((s) => s.name === update.title); - if (!serie) { - console.log(`Could not find serie ${update.title} - for update ${update.chapterUrl}`); - continue; - } - // Parse float here since sometimes we'll have partial chapters - // For example we'll have 97, 98, **98.5**, 99, 100 - so we need to parse - if (parseFloat(update.latestChapter) > parseFloat(serie.latestChapter)) { - console.log(`New chapter for ${serie.name} - ${update.chapterUrl}`); - const relevantGuilds = guildsSeries.filter((gs) => gs.seriesId === serie.id); - - for (const guild of relevantGuilds) { - if (!guild.guild.updatesChannelId) { - // Can't post updates if they don't have a channel set - continue; - } - const channel = client.channels.cache.get(guild.guild.updatesChannelId); - - if (channel && channel.isTextBased()) { - const ok = await channel.send( - `New chapter of ${serie.name} is out! ${update.chapterUrl}\n${serie.subscription - .map((s) => `<@${s.userId}>`) - .join(" ")}` - ); - ok - ? console.log(`Posted update for ${serie.name} in ${guild.guild.name}`) - : console.log(`Failed to post update for ${serie.name} in ${guild.guild.name}`); - } - } - - await prisma.series.update({ - where: { - id: serie.id, - }, - data: { - latestChapter: update.latestChapter, - lastCheckedAt: new Date(), - imageUrl: update.imageUrl, - }, - }); - } else { - // console.log(`No new chapter for ${serie.name}`); - await prisma.series.update({ - where: { - id: serie.id, - }, - data: { - lastCheckedAt: new Date(), - imageUrl: update.imageUrl, - }, - }); - } - } - - console.log( - `Finished checking for updates at ${new Date().toISOString()}, next check at ${job.nextInvocation().toISOString()}` - ); -}); - -client.login(process.env.DISCORD_TOKEN).then(() => { - job.invoke(); -}); +startDiscordClient(); diff --git a/src/client.ts b/src/mango/client.ts similarity index 100% rename from src/client.ts rename to src/mango/client.ts diff --git a/src/coder.ts b/src/mango/coder.ts similarity index 100% rename from src/coder.ts rename to src/mango/coder.ts diff --git a/src/mango/commands.ts b/src/mango/commands.ts new file mode 100644 index 0000000..016bd8e --- /dev/null +++ b/src/mango/commands.ts @@ -0,0 +1,5 @@ +import { Command } from "../types/command"; + +const commands = new Map(); + +export { commands }; diff --git a/src/mango/discord.ts b/src/mango/discord.ts new file mode 100644 index 0000000..902eca3 --- /dev/null +++ b/src/mango/discord.ts @@ -0,0 +1,18 @@ +import { Events } from "discord.js"; +import client from "./client"; +import { handleReady } from "./events/handle-ready"; +import { handleMessageCreate } from "./events/handle-message-create"; +import { handleMessageReactionAdd } from "./events/handle-message-reaction-add"; +import { checkForMangaUpdates } from "./jobs/check-for-manga-updates"; + +client.on(Events.ClientReady, handleReady); +client.on(Events.MessageCreate, handleMessageCreate); +client.on(Events.MessageReactionAdd, handleMessageReactionAdd); + +const startDiscordClient = async () => { + client.login(process.env.DISCORD_TOKEN).then(() => { + checkForMangaUpdates.invoke(); + }); +}; + +export { startDiscordClient }; diff --git a/src/dispatcher.ts b/src/mango/dispatcher.ts similarity index 69% rename from src/dispatcher.ts rename to src/mango/dispatcher.ts index 329190d..287c172 100644 --- a/src/dispatcher.ts +++ b/src/mango/dispatcher.ts @@ -1,9 +1,9 @@ import { encode, decode } from "./coder"; -import { Task } from "./types/task"; +import { Task } from "../types/task"; export async function dispatchToSidecar(data: Task): Promise { const encoded = encode(data); - const child = Bun.spawn(["bun", "src/sidecar.ts", encoded]); + const child = Bun.spawn(["bun", `${import.meta.dir}/sidecar.ts`, encoded]); const rawReturn = await new Response(child.stdout).text(); await child.exited; return decode(rawReturn); diff --git a/src/emoji.ts b/src/mango/emoji.ts similarity index 100% rename from src/emoji.ts rename to src/mango/emoji.ts diff --git a/src/commands/add.ts b/src/mango/events/commands/add.ts similarity index 84% rename from src/commands/add.ts rename to src/mango/events/commands/add.ts index 2b34720..2a072fe 100644 --- a/src/commands/add.ts +++ b/src/mango/events/commands/add.ts @@ -1,9 +1,8 @@ -import { SeriesSource } from "@prisma/client"; -import { Command } from "../types/command"; -import fetchManga from "../fetch-manga"; -import { tryToDetermineSeriesSource } from "../utils/try-to-determine-series-source"; -import extractMangadexId from "../utils/extract-mangadex-id"; -import { updateCatalog } from "../update-catalog"; +import { Command } from "../../../types/command"; +import { fetchManga } from "../../fetch-manga"; +import { tryToDetermineSeriesSource } from "../../../utils/try-to-determine-series-source"; +import extractMangadexId from "../../../utils/extract-mangadex-id"; +import { updateCatalog } from "../../update-catalog"; const command: Command = { name: "add", diff --git a/src/commands/delete.ts b/src/mango/events/commands/delete.ts similarity index 89% rename from src/commands/delete.ts rename to src/mango/events/commands/delete.ts index cf2ec8a..7638cba 100644 --- a/src/commands/delete.ts +++ b/src/mango/events/commands/delete.ts @@ -1,5 +1,5 @@ -import { Command } from "../types/command"; -import { updateCatalog } from "../update-catalog"; +import { Command } from "../../../types/command"; +import { updateCatalog } from "../../update-catalog"; const command: Command = { name: "delete", diff --git a/src/commands/setcatalog.ts b/src/mango/events/commands/setcatalog.ts similarity index 90% rename from src/commands/setcatalog.ts rename to src/mango/events/commands/setcatalog.ts index 091ba03..92121f6 100644 --- a/src/commands/setcatalog.ts +++ b/src/mango/events/commands/setcatalog.ts @@ -1,4 +1,4 @@ -import { Command } from "../types/command"; +import { Command } from "../../../types/command"; const command: Command = { name: "setcatalog", diff --git a/src/commands/setupdates.ts b/src/mango/events/commands/setupdates.ts similarity index 90% rename from src/commands/setupdates.ts rename to src/mango/events/commands/setupdates.ts index 080a140..6398a2d 100644 --- a/src/commands/setupdates.ts +++ b/src/mango/events/commands/setupdates.ts @@ -1,4 +1,4 @@ -import { Command } from "../types/command"; +import { Command } from "../../../types/command"; const command: Command = { name: "setupdates", diff --git a/src/commands/subscriptions.ts b/src/mango/events/commands/subscriptions.ts similarity index 96% rename from src/commands/subscriptions.ts rename to src/mango/events/commands/subscriptions.ts index 4f46892..9d2cc3d 100644 --- a/src/commands/subscriptions.ts +++ b/src/mango/events/commands/subscriptions.ts @@ -1,4 +1,4 @@ -import { Command } from "../types/command"; +import { Command } from "../../../types/command"; function splitBySize(str: string) { const lines = str.split("\n"); diff --git a/src/commands/updatecatalog.ts b/src/mango/events/commands/updatecatalog.ts similarity index 74% rename from src/commands/updatecatalog.ts rename to src/mango/events/commands/updatecatalog.ts index b1751f1..e705370 100644 --- a/src/commands/updatecatalog.ts +++ b/src/mango/events/commands/updatecatalog.ts @@ -1,5 +1,5 @@ -import { Command } from "../types/command"; -import { updateCatalog } from "../update-catalog"; +import { Command } from "../../../types/command"; +import { updateCatalog } from "../../update-catalog"; const command: Command = { name: "updatecatalog", diff --git a/src/mango/events/handle-message-create.ts b/src/mango/events/handle-message-create.ts new file mode 100644 index 0000000..8607495 --- /dev/null +++ b/src/mango/events/handle-message-create.ts @@ -0,0 +1,44 @@ +import { Message } from "discord.js"; +import { commands } from "../commands"; +import client from "../client"; +import prisma from "../prisma"; + +export const handleMessageCreate = async (msg: Message) => { + if (!msg.guild) { + return; + } + + if (!msg.content.startsWith("!")) { + return; + } + + const args = msg.content.slice(1).trim().split(/ +/); + + const commandName = args.shift()?.toLowerCase(); + + if (!commandName) { + return; + } + + const command = commands.get(commandName); + + if (!command) { + return; + } + + if (command.usableBy && !command.usableBy.includes(msg.author.id)) { + await msg.channel.send( + `You don't have permission to use this command, ${msg.author.displayName}! - ${command.usableBy + .map((id) => `<@${id}>`) + .join(" ")}` + ); + return; + } + + try { + await command.run({ client, msg, prisma }, args); + } catch (error) { + console.error(error); + msg.channel.send("There was an error trying to execute that command!"); + } +}; diff --git a/src/mango/events/handle-message-reaction-add.ts b/src/mango/events/handle-message-reaction-add.ts new file mode 100644 index 0000000..9251e24 --- /dev/null +++ b/src/mango/events/handle-message-reaction-add.ts @@ -0,0 +1,108 @@ +import { MessageReaction, User, PartialMessageReaction, PartialUser } from "discord.js"; +import prisma from "../prisma"; +import client from "../client"; +import { emojiNumbers } from "../emoji"; + +export const handleMessageReactionAdd = async ( + reaction: MessageReaction | PartialMessageReaction, + user: User | PartialUser +) => { + if (reaction.partial) { + try { + await reaction.fetch(); + } catch (error) { + return; + } + } + if (!reaction.message.guild) { + return; + } + + if (user.bot) { + return; + } + + const guild = await prisma.guild.findUnique({ + where: { + id: reaction.message.guild.id, + }, + }); + + if (!guild) { + return; + } + + if (reaction.message.channel.id !== guild.catalogChannelId) { + return; + } + + const emoji = reaction.emoji.name; + + if (!emoji || !emojiNumbers.includes(emoji)) { + return; + } + + const message = reaction.message; + if (!message.content) { + return; + } + + const messageSeries = message.content.split("\n"); + + const seriesFromIndex = messageSeries[emojiNumbers.indexOf(emoji)]; + + if (!seriesFromIndex) { + return; + } + + const seriesName = seriesFromIndex + .replace(/[\u{0080}-\u{FFFF}]/gu, "") + .slice(2) + .split(" -> ")[0]; + + const serie = await prisma.series.findUnique({ + where: { + name: seriesName, + }, + }); + + if (!serie) { + return; + } + + const resolvedUser = await client.users.fetch(user.id); + + const subscriptionExists = await prisma.subscription.findUnique({ + where: { + guildId_seriesId_userId: { + guildId: guild.id, + seriesId: serie.id, + userId: user.id, + }, + }, + }); + + if (subscriptionExists) { + await prisma.subscription.delete({ + where: { + guildId_seriesId_userId: { + guildId: guild.id, + seriesId: serie.id, + userId: user.id, + }, + }, + }); + await reaction.users.remove(resolvedUser); + return; + } + + await prisma.subscription.create({ + data: { + guildId: guild.id, + seriesId: serie.id, + userId: user.id, + }, + }); + + await reaction.users.remove(resolvedUser); +}; diff --git a/src/mango/events/handle-ready.ts b/src/mango/events/handle-ready.ts new file mode 100644 index 0000000..8287762 --- /dev/null +++ b/src/mango/events/handle-ready.ts @@ -0,0 +1,30 @@ +import { Client } from "discord.js"; +import prisma from "../prisma"; +import fs from "fs"; +import { commands } from "../commands"; + +export const handleReady = (client: Client) => { + console.log(import.meta.dir); + console.log(`Logged in as ${client.user?.tag}!`); + client.guilds.cache.forEach(async (guild) => { + console.log(`Logged in to guild ${guild.name}`); + await prisma.guild.upsert({ + where: { + id: guild.id, + }, + update: { + name: guild.name, + }, + create: { + id: guild.id, + name: guild.name, + }, + }); + }); + const commandFiles = fs.readdirSync(`${import.meta.dir}/commands`).filter((file) => file.endsWith(".ts")); + for (const file of commandFiles) { + const command = require(`${import.meta.dir}/commands/${file}`).default; + commands.set(command.name, command); + console.log(`Loaded command ${command.name}`); + } +}; diff --git a/src/fetch-manga.ts b/src/mango/fetch-manga.ts similarity index 89% rename from src/fetch-manga.ts rename to src/mango/fetch-manga.ts index 0b1054c..6f431b0 100644 --- a/src/fetch-manga.ts +++ b/src/mango/fetch-manga.ts @@ -1,7 +1,7 @@ import { SeriesSource } from "@prisma/client"; -import { ScraperResult } from "./types/scraper"; +import { ScraperResult } from "../types/scraper"; import { dispatchToSidecar } from "./dispatcher"; -import mangadex from "./scrapers/mangadex"; +import mangadex from "../scrapers/mangadex"; const SIDE_CAR_SOURCES: SeriesSource[] = [ SeriesSource.AsuraScans, @@ -38,4 +38,4 @@ const fetchManga = async ( return results; }; -export default fetchManga; +export { fetchManga }; diff --git a/src/mango/jobs/check-for-manga-updates.ts b/src/mango/jobs/check-for-manga-updates.ts new file mode 100644 index 0000000..2fc5cbe --- /dev/null +++ b/src/mango/jobs/check-for-manga-updates.ts @@ -0,0 +1,90 @@ +import { fetchManga } from "../fetch-manga"; +import prisma from "../prisma"; +import client from "../client"; +import schedule from "node-schedule"; + +const checkForMangaUpdates = schedule.scheduleJob("*/30 * * * *", async () => { + console.log(`Checking for updates at ${new Date().toISOString()}`); + const series = await prisma.series.findMany({ + include: { + subscription: true, + }, + }); + + const guildsSeries = await prisma.guildsSeries.findMany({ + where: {}, + include: { + guild: true, + }, + }); + + const seriesUpdates = await fetchManga( + series.map((s) => ({ + url: s.url, + source: s.source, + })) + ); + + for (const update of seriesUpdates) { + const serie = series.find((s) => s.name === update.title); + if (!serie) { + console.log(`Could not find serie ${update.title} - for update ${update.chapterUrl}`); + continue; + } + // Parse float here since sometimes we'll have partial chapters + // For example we'll have 97, 98, **98.5**, 99, 100 - so we need to parse + if (parseFloat(update.latestChapter) > parseFloat(serie.latestChapter)) { + console.log(`New chapter for ${serie.name} - ${update.chapterUrl}`); + const relevantGuilds = guildsSeries.filter((gs) => gs.seriesId === serie.id); + + for (const guild of relevantGuilds) { + if (!guild.guild.updatesChannelId) { + // Can't post updates if they don't have a channel set + continue; + } + const channel = client.channels.cache.get(guild.guild.updatesChannelId); + + if (channel && channel.isTextBased()) { + const ok = await channel.send( + `New chapter of ${serie.name} is out! ${update.chapterUrl}\n${serie.subscription + .map((s) => `<@${s.userId}>`) + .join(" ")}` + ); + ok + ? console.log(`Posted update for ${serie.name} in ${guild.guild.name}`) + : console.log(`Failed to post update for ${serie.name} in ${guild.guild.name}`); + } + } + + await prisma.series.update({ + where: { + id: serie.id, + }, + data: { + latestChapter: update.latestChapter, + lastCheckedAt: new Date(), + imageUrl: update.imageUrl, + }, + }); + } else { + // console.log(`No new chapter for ${serie.name}`); + await prisma.series.update({ + where: { + id: serie.id, + }, + data: { + lastCheckedAt: new Date(), + imageUrl: update.imageUrl, + }, + }); + } + } + + console.log( + `Finished checking for updates at ${new Date().toISOString()}, next check at ${checkForMangaUpdates + .nextInvocation() + .toISOString()}` + ); +}); + +export { checkForMangaUpdates }; diff --git a/src/prisma.ts b/src/mango/prisma.ts similarity index 100% rename from src/prisma.ts rename to src/mango/prisma.ts diff --git a/src/sidecar.ts b/src/mango/sidecar.ts similarity index 91% rename from src/sidecar.ts rename to src/mango/sidecar.ts index bd67288..cd37cb2 100644 --- a/src/sidecar.ts +++ b/src/mango/sidecar.ts @@ -3,13 +3,13 @@ import puppeteer from "puppeteer-extra"; import { DEFAULT_INTERCEPT_RESOLUTION_PRIORITY } from "puppeteer"; import StealthPlugin from "puppeteer-extra-plugin-stealth"; import AdBlocker from "puppeteer-extra-plugin-adblocker"; -import mangasee from "./scrapers/mangasee"; -import asura from "./scrapers/asura"; -import reaper from "./scrapers/reaper"; -import weebcentral from "./scrapers/weebcentral"; -import { Task } from "./types/task"; +import mangasee from "../scrapers/mangasee"; +import asura from "../scrapers/asura"; +import reaper from "../scrapers/reaper"; +import weebcentral from "../scrapers/weebcentral"; +import { Task } from "../types/task"; import { SeriesSource } from "@prisma/client"; -import { ScraperResult } from "./types/scraper"; +import { ScraperResult } from "../types/scraper"; import fs from "fs"; puppeteer.use(StealthPlugin()); puppeteer.use( diff --git a/src/update-catalog.ts b/src/mango/update-catalog.ts similarity index 100% rename from src/update-catalog.ts rename to src/mango/update-catalog.ts diff --git a/yarn.lock b/yarn.lock index 46b046f..c314cef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -136,15 +136,15 @@ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.4.2.tgz#ba2b7faeb227c76e423e88f962afe6a031319f3f" integrity sha512-fqeucJ3LH0e1eyFdT0zRx+oETLancu5+n4lhiYECyEz6H2RDskPJHJYHkVc0LhkU4Uv7fuEnppKU3nVKNzMh8g== -"@puppeteer/browsers@2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.3.0.tgz#791ea7d80450fea24eb19fb1d70c367ad4e08cae" - integrity sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA== +"@puppeteer/browsers@2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.6.1.tgz#d75aec5010cae377c5e4742bf5e4f62a79c21315" + integrity sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg== dependencies: - debug "^4.3.5" + debug "^4.4.0" extract-zip "^2.0.1" progress "^2.0.3" - proxy-agent "^6.4.0" + proxy-agent "^6.5.0" semver "^7.6.3" tar-fs "^3.0.6" unbzip2-stream "^1.4.3" @@ -283,13 +283,18 @@ resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz#84c5a3f8d648842cec5cc649b88df599af32ed88" integrity sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ== -agent-base@^7.0.2, agent-base@^7.1.0: +agent-base@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== dependencies: debug "^4.3.4" +agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -419,13 +424,12 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chromium-bidi@0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.4.tgz#627d76bae2819d59b61a413babe9664e0a16b71d" - integrity sha512-8zoq6ogmhQQkAKZVKO2ObFTl4uOkqoX1PlKQX3hZQ5E9cbUotcAb7h4pTNVAGGv8Z36PF3CtdOriEp/Rz82JqQ== +chromium-bidi@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.11.0.tgz#9c3c42ee7b42d8448e9fce8d649dc8bfbcc31153" + integrity sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA== dependencies: mitt "3.0.1" - urlpattern-polyfill "10.0.0" zod "3.23.8" cliui@^8.0.1: @@ -506,12 +510,12 @@ debug@4, debug@^4.1.1, debug@^4.3.4: dependencies: ms "2.1.2" -debug@^4.3.5, debug@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== +debug@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" deepmerge@^4.2.2: version "4.3.1" @@ -527,10 +531,10 @@ degenerator@^5.0.0: escodegen "^2.1.0" esprima "^4.0.1" -devtools-protocol@0.0.1312386: - version "0.0.1312386" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz#5ab824d6f1669ec6c6eb0fba047e73601d969052" - integrity sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA== +devtools-protocol@0.0.1367902: + version "0.0.1367902" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz#7333bfc4466c5a54a4c6de48a9dfbcb4b811660c" + integrity sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg== discord-api-types@0.37.50: version "0.37.50" @@ -745,20 +749,12 @@ http-proxy-agent@^7.0.1: agent-base "^7.1.0" debug "^4.3.4" -https-proxy-agent@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" - integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== - dependencies: - agent-base "^7.0.2" - debug "4" - -https-proxy-agent@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "4" ieee754@^1.1.13: @@ -787,15 +783,13 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ip@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" is-arrayish@^0.2.1: version "0.2.1" @@ -841,6 +835,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -955,6 +954,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + netmask@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" @@ -983,27 +987,26 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -pac-proxy-agent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" - integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== +pac-proxy-agent@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz#da7c3b5c4cccc6655aaafb701ae140fb23f15df2" + integrity sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" - agent-base "^7.0.2" + agent-base "^7.1.2" debug "^4.3.4" get-uri "^6.0.1" http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.2" - pac-resolver "^7.0.0" - socks-proxy-agent "^8.0.2" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" -pac-resolver@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.0.tgz#79376f1ca26baf245b96b34c339d79bff25e900c" - integrity sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg== +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== dependencies: degenerator "^5.0.0" - ip "^1.1.8" netmask "^2.0.2" parent-module@^1.0.0: @@ -1050,19 +1053,19 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -proxy-agent@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" - integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== +proxy-agent@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "^4.3.4" http-proxy-agent "^7.0.1" - https-proxy-agent "^7.0.3" + https-proxy-agent "^7.0.6" lru-cache "^7.14.1" - pac-proxy-agent "^7.0.1" + pac-proxy-agent "^7.1.0" proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.2" + socks-proxy-agent "^8.0.5" proxy-from-env@^1.1.0: version "1.1.0" @@ -1077,15 +1080,16 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -puppeteer-core@23.0.2: - version "23.0.2" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.0.2.tgz#343c8d003e609620febfe35f76847a0014cdc97c" - integrity sha512-MvOHn+g1TYkAR2oVd/bf/YWXKqFTJmkhyyurYgxkrjh8rBOL1ZH5VyOsLJi0bLO7/yoipAmk1gFZEx9HUJnaoA== +puppeteer-core@23.11.0: + version "23.11.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.11.0.tgz#1d49f5c254b140e5021bc15cbe3a9c5916baccbc" + integrity sha512-fr5Xp8KeZGRiLrYmosAxPAObi1vmb09vmwak9lqS7KvKMbcN+mk+bDpnDKXPd7QN9b7b/mb9Fgp0A6+024XbVA== dependencies: - "@puppeteer/browsers" "2.3.0" - chromium-bidi "0.6.4" - debug "^4.3.6" - devtools-protocol "0.0.1312386" + "@puppeteer/browsers" "2.6.1" + chromium-bidi "0.11.0" + debug "^4.4.0" + devtools-protocol "0.0.1367902" + typed-query-selector "^2.12.0" ws "^8.18.0" puppeteer-extra-plugin-adblocker@^2.13.6: @@ -1145,16 +1149,17 @@ puppeteer-extra@^3.3.6: debug "^4.1.1" deepmerge "^4.2.2" -puppeteer@^23.0.2: - version "23.0.2" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.0.2.tgz#73391e87407da4ae6d630e156f42623a5a7619cd" - integrity sha512-I/l1P8s8brcLG+oW9AwF8hUaOSGGJcGKMflXRgULUH0S3ABptlLI9ZKjqWDo8ipY6v789ZKd+bNKtcCwpTh5Ww== +puppeteer@^23.9.0: + version "23.11.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.11.0.tgz#9f99f4bdf752a20d778780c003da7fcf0f351135" + integrity sha512-UaHfTIcg02bTahmZjrjrpU8efyjNeItrNvANu+DdnYMEcQ24X8LOkBWv2Z4bqDzkOzFymqJkADS0bdSDMUNi1A== dependencies: - "@puppeteer/browsers" "2.3.0" - chromium-bidi "0.6.4" + "@puppeteer/browsers" "2.6.1" + chromium-bidi "0.11.0" cosmiconfig "^9.0.0" - devtools-protocol "0.0.1312386" - puppeteer-core "23.0.2" + devtools-protocol "0.0.1367902" + puppeteer-core "23.11.0" + typed-query-selector "^2.12.0" queue-tick@^1.0.1: version "1.0.1" @@ -1198,21 +1203,21 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" - integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "^4.3.4" - socks "^2.7.1" + socks "^2.8.3" -socks@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== dependencies: - ip "^2.0.0" + ip-address "^9.0.5" smart-buffer "^4.2.0" sorted-array-functions@^1.3.0: @@ -1225,6 +1230,11 @@ source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -1335,6 +1345,11 @@ tslib@^2.0.1, tslib@^2.6.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +typed-query-selector@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz#92b65dbc0a42655fccf4aeb1a08b1dddce8af5f2" + integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== + unbzip2-stream@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" @@ -1365,11 +1380,6 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -urlpattern-polyfill@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" - integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"