From 3a5bd94de04841ceee92df4a16f296a0121285a6 Mon Sep 17 00:00:00 2001 From: Etorix <92535668+EtorixDev@users.noreply.github.com> Date: Fri, 10 Apr 2026 13:42:53 -0700 Subject: [PATCH 001/247] Questify: Send terminal on last heartbeat. (#965) --- src/equicordplugins/questify/index.tsx | 32 +++++++++++++++++++-- src/equicordplugins/questify/utils/misc.tsx | 4 +-- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index b9c9b41c3..616f3ab16 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -282,6 +282,14 @@ function QuestTileContextMenu(children: React.ReactNode[], props: { quest: any; clearInterval(interval.progressTimeout); clearTimeout(interval.rerenderTimeout); activeQuestIntervals.delete(props.quest.id); + + if (interval.type === "play") { + void reportPlayGameQuestProgress(refreshQuest(props.quest), true, QuestifyLogger, { + attempts: 3, + delay: 2500, + }); + } + resetQuestsToResume(props.quest); rerenderQuests(); } @@ -820,9 +828,18 @@ async function startPlayGameProgressTracking(quest: Quest, target: { raw: number } } - function handleQuestComplete(): void { + async function sendTerminalHeartbeat(): Promise { + await reportPlayGameQuestProgress(refreshQuest(quest), true, QuestifyLogger, { + attempts: 3, + delay: 2500, + }); + } + + async function handleQuestComplete(): Promise { clearTrackingTimers(); activeQuestIntervals.delete(quest.id); + + await sendTerminalHeartbeat(); QuestifyLogger.info(`[${getFormattedNow()}] Quest ${questName} completed.`); if (settings.store.notifyOnQuestComplete) { @@ -855,7 +872,7 @@ async function startPlayGameProgressTracking(quest: Quest, target: { raw: number } if (result.completed || result.progress >= questTarget) { - handleQuestComplete(); + await handleQuestComplete(); return; } @@ -899,7 +916,7 @@ async function startPlayGameProgressTracking(quest: Quest, target: { raw: number } if (initial.completed || initial.progress >= questTarget) { - handleQuestComplete(); + await handleQuestComplete(); return; } @@ -1988,6 +2005,15 @@ export default definePlugin({ } activeQuestIntervals.forEach((intervalData, questId) => { + const quest = QuestsStore.getQuest(questId); + + if (intervalData.type === "play" && quest) { + void reportPlayGameQuestProgress(refreshQuest(quest), true, QuestifyLogger, { + attempts: 3, + delay: 2500, + }); + } + clearInterval(intervalData.progressTimeout); clearTimeout(intervalData.rerenderTimeout); activeQuestIntervals.delete(questId); diff --git a/src/equicordplugins/questify/utils/misc.tsx b/src/equicordplugins/questify/utils/misc.tsx index fa91de5f3..7f7eb1b31 100644 --- a/src/equicordplugins/questify/utils/misc.tsx +++ b/src/equicordplugins/questify/utils/misc.tsx @@ -346,14 +346,14 @@ export async function reportPlayGameQuestProgress(quest: Quest, terminal: boolea if (!quest.userStatus?.enrolledAt) { logger?.warn(`[${getFormattedNow()}] Cannot send heartbeat for unenrolled Quest ${questName}.`); return { progress: null, completed: false }; - } else if (quest.userStatus?.completedAt) { + } else if (quest.userStatus?.completedAt && !terminal) { return { progress: null, completed: true }; } const maxAttempts = options?.attempts ?? 1; const delay = options?.delay ?? 2500; const timeout = options?.timeout ?? 10000; - const streamKey = options?.streamKey ?? `call:${quest.id}:1`; + const streamKey = options?.streamKey; const applicationId = options?.applicationId ?? quest.config.application.id; const questPlayType = quest.config.taskConfigV2?.tasks.PLAY_ON_DESKTOP || quest.config.taskConfigV2?.tasks.PLAY_ON_XBOX || quest.config.taskConfigV2?.tasks.PLAY_ON_PLAYSTATION || quest.config.taskConfigV2?.tasks.PLAY_ACTIVITY; From dd71aaa31f122c70dcbd8564364d9f80289ba163 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Fri, 10 Apr 2026 21:28:58 -0400 Subject: [PATCH 002/247] PlatformSpoofer: Fix Broken Spoofing --- src/equicordplugins/platformSpoofer/index.tsx | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/equicordplugins/platformSpoofer/index.tsx b/src/equicordplugins/platformSpoofer/index.tsx index aab45545a..e15a5df17 100644 --- a/src/equicordplugins/platformSpoofer/index.tsx +++ b/src/equicordplugins/platformSpoofer/index.tsx @@ -62,18 +62,17 @@ export default definePlugin({ patches: [ { find: "_doIdentify(){", - replacement: { - match: /(\[IDENTIFY\].*let.{0,5}=\{.*properties:)(.*),presence/, - replace: "$1{...$2,...$self.getPlatform(true)},presence" - } + replacement: [ + { + match: /window._ws=null,null!=\i/, + replace: "false" + }, + { + match: /(?<="GatewaySocket"\)\}\),properties:)(\i)/, + replace: "{...$1,...$self.getPlatform(true)}" + }, + ] }, - { - find: '("AppSkeleton");', - replacement: { - match: /(?<=\.isPlatformEmbedded.{0,50}\i\)\)\}.{0,30})\i\?\i\.\i\.set\(.{0,10}:/, - replace: "" - } - } ], getPlatform(bypass, userId?: any) { const platform = settings.store.platform ?? "desktop"; From c78050d542a05676c00f67e1583efb0518afe0d0 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Fri, 10 Apr 2026 21:30:29 -0400 Subject: [PATCH 003/247] ReviewDB: Fix Showing Warning Last --- src/plugins/reviewDB/components/ReviewsView.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/reviewDB/components/ReviewsView.tsx b/src/plugins/reviewDB/components/ReviewsView.tsx index e858d13b8..2564eff20 100644 --- a/src/plugins/reviewDB/components/ReviewsView.tsx +++ b/src/plugins/reviewDB/components/ReviewsView.tsx @@ -66,10 +66,11 @@ export default function ReviewsView({ fallbackValue: null, deps: [refetchSignal, signal, page], onSuccess: data => { - if (settings.store.hideBlockedUsers) - data!.reviews = data!.reviews?.filter(r => !RelationshipStore.isBlocked(r.sender.discordID)); + if (settings.store.hideBlockedUsers) data!.reviews = data!.reviews?.filter(r => !RelationshipStore.isBlocked(r.sender.discordID)); + const systemReviews = data!.reviews.filter(r => r.type === ReviewType.System); + const normalReviews = data!.reviews.filter(r => r.type !== ReviewType.System); - data!.reviews.reverse(); + data!.reviews = [...systemReviews, ...normalReviews.reverse()]; scrollToTop?.(); onFetchReviews(data!); } From 32f7f66fc505cb680feb9f39f6b748d59f1917a8 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Fri, 10 Apr 2026 21:43:54 -0400 Subject: [PATCH 004/247] Experiments: Update Copy Patch --- src/plugins/experiments/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index 3e39182be..9c1802577 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -71,7 +71,7 @@ export default definePlugin({ replace: "$self.WarningCard()," }, { - match: /(?<=marginBottom:16)(?=\},)/, + match: /(?<=,marginBottom:16)(?=\},children:\[)/, replace: ',flexDirection:"row",alignItems:"center"' } ] From 785bf059e9c7d0eee6f365f1b402736c3ed5491d Mon Sep 17 00:00:00 2001 From: Jake <134332787+justjxke@users.noreply.github.com> Date: Sun, 12 Apr 2026 03:50:10 +0100 Subject: [PATCH 005/247] feat: reset logs on client restart for MLE (#968) * feat: read the branch name * how did i miss this lmfao --- .../components/LogsModal.tsx | 6 +++--- src/equicordplugins/messageLoggerEnhanced/db.ts | 15 ++++++++------- .../messageLoggerEnhanced/index.tsx | 16 ++++++++++++++++ .../messageLoggerEnhanced/settings.tsx | 12 +++++++++--- .../messageLoggerEnhanced/utils/LimitedMap.ts | 4 ++++ .../messageLoggerEnhanced/utils/settingsUtils.ts | 6 +++--- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx b/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx index 06727dba8..1d28a6348 100644 --- a/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx @@ -16,8 +16,8 @@ import { type User } from "@vencord/discord-types"; import { find, findByCode, findByCodeLazy } from "@webpack"; import { Alerts, ChannelStore, ContextMenuApi, FluxDispatcher, GuildStore, Menu, NavigationRouter, React, TabBar, TextInput, Tooltip, useMemo, useRef, useState } from "@webpack/common"; -import { clearMessagesIDB, DBMessageRecord, deleteMessageIDB, deleteMessagesBulkIDB } from "../db"; -import { cl, settings } from "../index"; +import { DBMessageRecord, deleteMessageIDB, deleteMessagesBulkIDB } from "../db"; +import { clearLogs, cl, settings } from "../index"; import { LoggedMessage, LoggedMessageJSON } from "../types"; import { messageJsonToMessageClass } from "../utils"; import { importLogs } from "../utils/settingsUtils"; @@ -147,7 +147,7 @@ export function LogsModal({ modalProps, initalQuery }: Props) { confirmVariant: "critical-primary", cancelText: "Cancel", onConfirm: async () => { - await clearMessagesIDB(); + await clearLogs(); reset(); } diff --git a/src/equicordplugins/messageLoggerEnhanced/db.ts b/src/equicordplugins/messageLoggerEnhanced/db.ts index 31c34ef45..4fae28348 100644 --- a/src/equicordplugins/messageLoggerEnhanced/db.ts +++ b/src/equicordplugins/messageLoggerEnhanced/db.ts @@ -304,14 +304,15 @@ export async function deleteMessagesBulkIDB(message_ids: string[]) { }); } -export async function clearMessagesIDB() { +export async function clearMessagesIDB(showToast = true) { cachedMessages.clear(); + await withDb(void 0, database => database.clear("messages")); - return withDb(void 0, database => database.clear("messages")).then(() => { - Toasts.show({ - type: Toasts.Type.MESSAGE, - message: "Cleared message log database and cache.", - id: Toasts.genId() - }); + if (!showToast) return; + + Toasts.show({ + type: Toasts.Type.MESSAGE, + message: "Cleared message log database and cache.", + id: Toasts.genId() }); } diff --git a/src/equicordplugins/messageLoggerEnhanced/index.tsx b/src/equicordplugins/messageLoggerEnhanced/index.tsx index cf5a537f8..e8b3cdab9 100644 --- a/src/equicordplugins/messageLoggerEnhanced/index.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/index.tsx @@ -36,8 +36,15 @@ export const Flogger = new Logger("MessageLoggerEnhanced", "#f26c6c"); export const cacheSentMessages = new LimitedMap(); export const cl = classNameFactory("vc-msg-logger-enhanced-"); +let didClearLogsOnStartup = false; + const cacheThing = findByPropsLazy("commit", "getOrCreate"); +export async function clearLogs(showToast = true) { + await idb.clearMessagesIDB(showToast); + cacheSentMessages.clear(); +} + let oldGetMessage: typeof MessageStore.getMessage; const handledMessageIds = new Set(); @@ -396,6 +403,15 @@ export default definePlugin({ Native.init(); + if (settings.store.clearLogsOnRestart && !didClearLogsOnStartup) { + try { + await clearLogs(false); + didClearLogsOnStartup = true; + } catch (e) { + Flogger.error("Failed to clear logs on restart", e); + } + } + const { imageCacheDir, logsDir } = await Native.getSettings(); settings.store.imageCacheDir = imageCacheDir; settings.store.logsDir = logsDir; diff --git a/src/equicordplugins/messageLoggerEnhanced/settings.tsx b/src/equicordplugins/messageLoggerEnhanced/settings.tsx index c573acff8..fce7de8b8 100644 --- a/src/equicordplugins/messageLoggerEnhanced/settings.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/settings.tsx @@ -11,10 +11,9 @@ import { OptionType } from "@utils/types"; import { Alerts, useState } from "@webpack/common"; import { Settings } from "Vencord"; -import { Native } from "."; +import { clearLogs, Native } from "."; import { ImageCacheDir, LogsDir } from "./components/FolderSelectInput"; import { openLogModal } from "./components/LogsModal"; -import { clearMessagesIDB } from "./db"; import { blockedExts } from "./list"; import { DEFAULT_IMAGE_CACHE_DIR } from "./utils/constants"; import { exportLogs, importLogs } from "./utils/settingsUtils"; @@ -260,6 +259,13 @@ export const settings = definePluginSettings({ component: ExportLogsButton }, + clearLogsOnRestart: { + type: OptionType.BOOLEAN, + description: "Clear logs when Discord restarts.", + default: false, + restartNeeded: true, + }, + openLogs: { type: OptionType.COMPONENT, description: "Open Logs", @@ -298,7 +304,7 @@ export const settings = definePluginSettings({ confirmText: "Clear", cancelText: "Cancel", onConfirm: async () => { - await clearMessagesIDB(); + await clearLogs(); }, })} > diff --git a/src/equicordplugins/messageLoggerEnhanced/utils/LimitedMap.ts b/src/equicordplugins/messageLoggerEnhanced/utils/LimitedMap.ts index a0b381e75..c027d3869 100644 --- a/src/equicordplugins/messageLoggerEnhanced/utils/LimitedMap.ts +++ b/src/equicordplugins/messageLoggerEnhanced/utils/LimitedMap.ts @@ -33,4 +33,8 @@ export class LimitedMap { get(key: K) { return this.map.get(key); } + + clear() { + this.map.clear(); + } } diff --git a/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts b/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts index 1f89770c5..64c6d9d03 100644 --- a/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts +++ b/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts @@ -21,8 +21,8 @@ import { chooseFile as chooseFileWeb } from "@utils/web"; import { Toasts } from "@webpack/common"; import { showSaveFilePicker } from "native-file-system-adapter"; -import { Native } from ".."; -import { addMessagesBulkIDB, clearMessagesIDB, iterateAllMessagesIDB } from "../db"; +import { Native, clearLogs } from ".."; +import { addMessagesBulkIDB, iterateAllMessagesIDB } from "../db"; import { LoggedMessageJSON } from "../types"; export async function importLogs() { @@ -34,7 +34,7 @@ export async function importLogs() { for await (const logItems of iterateLogItems()) { if (!cleared) { - await clearMessagesIDB(); + await clearLogs(false); cleared = true; } From 61341888d825a195afdecedf0b5c4245b72aaf92 Mon Sep 17 00:00:00 2001 From: creations Date: Sat, 11 Apr 2026 22:55:17 -0400 Subject: [PATCH 006/247] remake messageTranslate, fix gifcollections bug (#967) * remake message translations plugin, fix only show gifs for gifcollections * Update index.tsx --------- Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com> --- src/equicordplugins/gifCollections/index.tsx | 4 +- .../messageTranslate/index.tsx | 133 ++++++++++++------ .../messageTranslate/settings.ts | 72 ++++++++++ .../messageTranslate/styles.css | 9 ++ src/equicordplugins/messageTranslate/types.ts | 21 +++ .../messageTranslate/utils/translate.ts | 81 +++++++++++ 6 files changed, 275 insertions(+), 45 deletions(-) create mode 100644 src/equicordplugins/messageTranslate/settings.ts create mode 100644 src/equicordplugins/messageTranslate/styles.css create mode 100644 src/equicordplugins/messageTranslate/types.ts create mode 100644 src/equicordplugins/messageTranslate/utils/translate.ts diff --git a/src/equicordplugins/gifCollections/index.tsx b/src/equicordplugins/gifCollections/index.tsx index 54fb969a0..8bfc180d7 100644 --- a/src/equicordplugins/gifCollections/index.tsx +++ b/src/equicordplugins/gifCollections/index.tsx @@ -6,7 +6,7 @@ import "./style.css"; -import { Devs, EquicordDevs } from "@utils/constants"; +import { EquicordDevs } from "@utils/constants"; import definePlugin from "@utils/types"; import { FluxDispatcher } from "@webpack/common"; @@ -157,7 +157,7 @@ export default definePlugin({ oldTrendingCat = instance.props.trendingCategories; } if (settings.store.onlyShowCollections) { - instance.props.trendingCategories = [...this.sortedCollections(), ...instance.props.favorites]; + instance.props.trendingCategories = this.sortedCollections(); } else if (oldTrendingCat != null) { instance.props.trendingCategories = [...this.sortedCollections(), ...oldTrendingCat]; } diff --git a/src/equicordplugins/messageTranslate/index.tsx b/src/equicordplugins/messageTranslate/index.tsx index 6384b6ee9..68adbbd0b 100644 --- a/src/equicordplugins/messageTranslate/index.tsx +++ b/src/equicordplugins/messageTranslate/index.tsx @@ -4,64 +4,111 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { definePluginSettings } from "@api/Settings"; -import { Devs } from "@utils/constants"; -import definePlugin, { OptionType } from "@utils/types"; +import "./styles.css"; -const settings = definePluginSettings( - { - targetLanguage: { - type: OptionType.STRING, - description: "The language messages should be translated to", - default: "en", - restartNeeded: true - }, - confidenceRequirement: { - type: OptionType.STRING, - description: "The confidence required to translated the message. Best not to edit unless you know what you're doing", - default: "0.8", - restartNeeded: true - }, - }); +import { EquicordDevs } from "@utils/constants"; +import { classNameFactory } from "@utils/css"; +import definePlugin from "@utils/types"; +import { ChannelStore, FluxDispatcher, MessageStore, UserStore } from "@webpack/common"; -async function translateAPI(sourceLang: string, targetLang: string, text: string): Promise { +import { getIgnoredChannels, getIgnoredGuilds, getIgnoredUsers, settings } from "./settings"; +import { MessageWithContent } from "./types"; +import { clearCache, getCached, hasFailed, isInProgress, translate } from "./utils/translate"; - const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=${sourceLang}&tl=${targetLang}&dt=t&dj=1&q=${encodeURIComponent(text)}`; - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Failed to translate "${text}" from ${sourceLang} to ${targetLang}: ${response.status} ${response.statusText}`); +const cl = classNameFactory("mt-"); +const translatedMessages = new Map(); + +function shouldTranslate(message: MessageWithContent): boolean { + if (!message.content || typeof message.content !== "string") return false; + if (hasFailed(message.id, message.content)) return false; + + if (settings.store.skipOwnMessages) { + const currentUserId = UserStore.getCurrentUser()?.id; + if (currentUserId && message.author?.id === currentUserId) return false; } - return await response.json(); + if (settings.store.skipBotMessages && message.author?.bot) return false; + + if (message.author && getIgnoredUsers().has(message.author.id)) return false; + if (message.channel_id && getIgnoredChannels().has(message.channel_id)) return false; + + const guildId = message.channel_id ? ChannelStore.getChannel(message.channel_id)?.guild_id : null; + if (guildId && getIgnoredGuilds().has(guildId)) return false; + + return true; } -async function TranslateMessage(string) { - // there may be a better way to do this lmao - if (string.includes("(Translated)")) return string; +function triggerReRender(message: MessageWithContent) { + const current = MessageStore.getMessage(message.channel_id, message.id); + if (!current) return; - const response = await translateAPI("auto", settings.store.targetLanguage, string); - - if (response.src === settings.store.targetLanguage || response.confidence < settings.store.confidenceRequirement) return string; - - const { sentences }: { sentences: { trans?: string; }[]; } = await response; - const translatedText = sentences.map(s => s?.trans).filter(Boolean).join(""); - - return `${translatedText} *(Translated)*`; + FluxDispatcher.dispatch({ + type: "MESSAGE_UPDATE", + message: current, + }); } export default definePlugin({ name: "MessageTranslate", - description: "Auto translate messages to your language", - authors: [Devs.Samwich], + description: "Auto translate messages to your language with caching, per-channel toggles, and more options.", + authors: [EquicordDevs.creations], settings, - TranslateMessage: TranslateMessage, + patches: [ { find: '.CUSTOM_GIFT?""', - replacement: { - match: /renderContentOnly:\i}=\i;/, - replace: "$&$self.TranslateMessage(arguments[0].message.content).then(response => arguments[0].message.content = response);" - } + replacement: [ + { + match: /message:(\i),message:\{id:\i\}.{0,200}renderContentOnly:\i\}=\i;/, + replace: "$&$1=$self.transformMessage($1);", + }, + { + match: /childrenMessageContent:(\i),/g, + replace: "childrenMessageContent:$self.wrapContent($1,arguments[0].message.id),", + }, + ], }, - ] + ], + + transformMessage(message: MessageWithContent): MessageWithContent { + if (!settings.store.autoTranslate || !shouldTranslate(message)) { + translatedMessages.delete(message.id); + return message; + } + + const cached = getCached(message.id); + if (cached) { + if (cached.original !== message.content) { + clearCache(message.id); + translatedMessages.delete(message.id); + return message; + } + translatedMessages.set(message.id, cached.sourceLang); + return Object.assign(Object.create(Object.getPrototypeOf(message)), message, { + content: cached.translated, + }) as MessageWithContent; + } + + translatedMessages.delete(message.id); + if (!isInProgress(message.id)) { + translate(message.id, message.content).then(result => { + if (result) triggerReRender(message); + }); + } + + return message; + }, + + wrapContent(content: any, messageId: string) { + const sourceLang = translatedMessages.get(messageId); + if (!sourceLang) return content; + return ( + <> + {content} + {settings.store.showIndicator && ( +
translated from {sourceLang}
+ )} + + ); + }, }); diff --git a/src/equicordplugins/messageTranslate/settings.ts b/src/equicordplugins/messageTranslate/settings.ts new file mode 100644 index 000000000..491240737 --- /dev/null +++ b/src/equicordplugins/messageTranslate/settings.ts @@ -0,0 +1,72 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { definePluginSettings } from "@api/Settings"; +import { OptionType } from "@utils/types"; + +export const settings = definePluginSettings({ + targetLanguage: { + type: OptionType.STRING, + description: "Target language code for translations (e.g. en, es, fr, de, ja).", + default: "en", + }, + confidenceRequirement: { + type: OptionType.NUMBER, + description: "Minimum confidence (0 to 1) required to show a translation.", + default: 0.8, + }, + autoTranslate: { + type: OptionType.BOOLEAN, + description: "Automatically translate messages as they appear.", + default: true, + }, + skipOwnMessages: { + type: OptionType.BOOLEAN, + description: "Do not translate your own messages.", + default: true, + }, + skipBotMessages: { + type: OptionType.BOOLEAN, + description: "Do not translate bot messages.", + default: false, + }, + ignoredGuilds: { + type: OptionType.STRING, + description: "Comma-separated list of server IDs to not translate in.", + default: "", + }, + ignoredChannels: { + type: OptionType.STRING, + description: "Comma-separated list of channel IDs to not translate in.", + default: "", + }, + ignoredUsers: { + type: OptionType.STRING, + description: "Comma-separated list of user IDs to not translate.", + default: "", + }, + showIndicator: { + type: OptionType.BOOLEAN, + description: "Append a small (translated) indicator to translated messages.", + default: true, + }, +}); + +function parseIdList(value: string): Set { + return new Set(value.split(",").map(s => s.trim()).filter(Boolean)); +} + +export function getIgnoredGuilds(): Set { + return parseIdList(settings.store.ignoredGuilds); +} + +export function getIgnoredChannels(): Set { + return parseIdList(settings.store.ignoredChannels); +} + +export function getIgnoredUsers(): Set { + return parseIdList(settings.store.ignoredUsers); +} diff --git a/src/equicordplugins/messageTranslate/styles.css b/src/equicordplugins/messageTranslate/styles.css new file mode 100644 index 000000000..14cd820e6 --- /dev/null +++ b/src/equicordplugins/messageTranslate/styles.css @@ -0,0 +1,9 @@ +.mt-indicator { + color: var(--text-muted); + font-style: italic; + font-weight: 400; + font-size: 0.7rem; + line-height: 1; + margin-top: 0.15em; + opacity: 0.75; +} diff --git a/src/equicordplugins/messageTranslate/types.ts b/src/equicordplugins/messageTranslate/types.ts new file mode 100644 index 000000000..d6cb8f1f5 --- /dev/null +++ b/src/equicordplugins/messageTranslate/types.ts @@ -0,0 +1,21 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import type { Message } from "@vencord/discord-types"; + +export interface TranslateResponse { + src: string; + confidence: number; + sentences: { trans?: string; }[]; +} + +export interface CachedTranslation { + original: string; + translated: string; + sourceLang: string; +} + +export type MessageWithContent = Message & { content: string; }; diff --git a/src/equicordplugins/messageTranslate/utils/translate.ts b/src/equicordplugins/messageTranslate/utils/translate.ts new file mode 100644 index 000000000..612b26c1a --- /dev/null +++ b/src/equicordplugins/messageTranslate/utils/translate.ts @@ -0,0 +1,81 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Logger } from "@utils/Logger"; + +import { settings } from "../settings"; +import { CachedTranslation, TranslateResponse } from "../types"; + +const logger = new Logger("MessageTranslate"); + +const translationCache = new Map(); +const inProgress = new Set(); +const failed = new Map(); + +export function getCached(messageId: string): CachedTranslation | undefined { + return translationCache.get(messageId); +} + +export function hasFailed(messageId: string, text: string): boolean { + return failed.get(messageId) === text; +} + +export function isInProgress(messageId: string): boolean { + return inProgress.has(messageId); +} + +export function clearCache(messageId: string) { + translationCache.delete(messageId); + failed.delete(messageId); +} + +async function fetchTranslation(text: string, targetLang: string): Promise { + const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=${targetLang}&dt=t&dj=1&q=${encodeURIComponent(text)}`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(`Translation API returned ${response.status} ${response.statusText}`); + } + + return await response.json(); +} + +export async function translate(messageId: string, text: string): Promise { + if (inProgress.has(messageId)) return null; + if (translationCache.has(messageId)) return translationCache.get(messageId)!; + + inProgress.add(messageId); + + try { + const targetLang = settings.store.targetLanguage; + const response = await fetchTranslation(text, targetLang); + + if (response.src === targetLang || response.confidence < settings.store.confidenceRequirement) { + failed.set(messageId, text); + return null; + } + + const translatedText = response.sentences.map(s => s.trans).filter(Boolean).join(""); + if (!translatedText || translatedText === text) { + failed.set(messageId, text); + return null; + } + + const entry: CachedTranslation = { + original: text, + translated: translatedText, + sourceLang: response.src, + }; + translationCache.set(messageId, entry); + return entry; + } catch (e) { + logger.error("Translation failed", e); + failed.set(messageId, text); + return null; + } finally { + inProgress.delete(messageId); + } +} From ad51504d6dd5a948d0b59327572e219f34c644ae Mon Sep 17 00:00:00 2001 From: morsz <143611535+morsznetik@users.noreply.github.com> Date: Sun, 12 Apr 2026 06:30:47 +0200 Subject: [PATCH 007/247] add custom status timeouts (#969) * add custom status timeouts patch the native status menu so idle, dnd, and invisible can use configurable timeout presets without replacing discord's ui add a settings driven preset editor with reorder controls, movable forever support, and per status direct click defaults while keeping the preset list as the single source of truth and using discord's native timed status action Signed-off-by: morsz * clean up custom status timeouts * framework * Update index.tsx --------- Signed-off-by: morsz Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com> Co-authored-by: creations --- .../customStatusTimeouts/index.tsx | 115 ++++++++++++++++++ src/utils/constants.ts | 4 + 2 files changed, 119 insertions(+) create mode 100644 src/equicordplugins/customStatusTimeouts/index.tsx diff --git a/src/equicordplugins/customStatusTimeouts/index.tsx b/src/equicordplugins/customStatusTimeouts/index.tsx new file mode 100644 index 000000000..90b8eed4b --- /dev/null +++ b/src/equicordplugins/customStatusTimeouts/index.tsx @@ -0,0 +1,115 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { definePluginSettings } from "@api/Settings"; +import { EquicordDevs } from "@utils/constants"; +import definePlugin, { OptionType } from "@utils/types"; + +const Millis = { + HALF_SECOND: 500, + SECOND: 1e3, + MINUTE: 6e4, + HOUR: 36e5, + DAY: 864e5, + WEEK: 6048e5, + DAYS_30: 2592e6 +}; + +const settings = definePluginSettings({ + showForeverOnTop: { + type: OptionType.BOOLEAN, + description: "Show the Forever option at the top of the list instead of the bottom.", + restartNeeded: true, + default: true + }, + extraSeconds: { + type: OptionType.STRING, + description: "Extra seconds to add, separated by a comma (e.g. 5, 10, 30)", + restartNeeded: true, + default: "15, 30, 45" + }, + extraMinutes: { + type: OptionType.STRING, + description: "Extra minutes to add, separated by a comma (e.g. 5, 10, 30)", + restartNeeded: true, + default: "5, 10, 30" + }, + extraHours: { + type: OptionType.STRING, + description: "Extra hours to add, separated by a comma (e.g. 2, 4, 6, 12)", + restartNeeded: true, + default: "2, 4, 6, 12" + }, + extraDays: { + type: OptionType.STRING, + description: "Extra days to add, separated by a comma (e.g. 1, 2)", + restartNeeded: true, + default: "1, 2" + }, +}); + +export default definePlugin({ + name: "CustomStatusTimeouts", + description: "Adds configurable timeout presets to the status (presence) menu.", + authors: [EquicordDevs.Kiri, EquicordDevs.thororen], + settings, + patches: [ + { + find: "#{intl::DURATION_FOREVER}", + replacement: { + match: /\[\{duration.*?#{intl::DURATION_FOREVER}\)\}\]/, + replace: "$self.buildTimeouts($&)" + } + } + ], + buildTimeouts(existing) { + const parse = (str: string) => str.split(",").map(s => Number(s.trim())).filter(Boolean); + + const seconds = parse(settings.store.extraSeconds); + const minutes = parse(settings.store.extraMinutes); + const hours = parse(settings.store.extraHours); + const days = parse(settings.store.extraDays); + // I was testing weeks and months and for some reason random ones didnt apply look below for the working ones + // tested weeks between 1-12 working weeks were 1, 2, 3, 8, 9, 10 the rest didnt work + // tested months between 1-12 working months were 2, 4, 10, 12 the rest didnt work + // for months I only tested evens except for 1 so I hardcoded them to avoid user complaints + const weeks = [1, 2, 3]; + const months = [2, 4]; + + const extra = [ + ...seconds.map(s => ({ + duration: s * Millis.SECOND, + label: () => `For ${s} ${s === 1 ? "Second" : "Seconds"}` + })), + ...minutes.map(m => ({ + duration: m * Millis.MINUTE, + label: () => `For ${m} ${m === 1 ? "Minute" : "Minutes"}` + })), + ...hours.map(h => ({ + duration: h * Millis.HOUR, + label: () => `For ${h} ${h === 1 ? "Hour" : "Hours"}` + })), + ...days.map(d => ({ + duration: d * Millis.DAY, + label: () => `For ${d} ${d === 1 ? "Day" : "Days"}` + })), + ...weeks.map(w => ({ + duration: w * Millis.WEEK, + label: () => `For ${w} ${w === 1 ? "Week" : "Weeks"}` + })), + ...months.map(m => ({ + duration: m * Millis.DAYS_30, + label: () => `For ${m} ${m === 1 ? "Month" : "Months"}` + })), + ]; + + return [...existing, ...extra].sort((a, b) => { + if (a.duration === undefined) return settings.store.showForeverOnTop ? -1 : 1; + if (b.duration === undefined) return settings.store.showForeverOnTop ? 1 : -1; + return a.duration - b.duration; + }); + } +}); diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 1540f350b..96f90bd78 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1284,6 +1284,10 @@ export const EquicordDevs = Object.freeze({ name: "Ape", id: 722832640360841308n, }, + Kiri: { + name: "Kiri", + id: 310525496771346434n, + }, } satisfies Record); // iife so #__PURE__ works correctly From 028f2c2bb03e0d37505de7173cf591d334795cfb Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sun, 12 Apr 2026 12:19:44 -0400 Subject: [PATCH 008/247] IRememberYou: Remove Invite Stuff --- .../iRememberYou/components/data.tsx | 42 +------------------ 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/src/equicordplugins/iRememberYou/components/data.tsx b/src/equicordplugins/iRememberYou/components/data.tsx index 4d75730bb..6d5250f7e 100644 --- a/src/equicordplugins/iRememberYou/components/data.tsx +++ b/src/equicordplugins/iRememberYou/components/data.tsx @@ -6,7 +6,7 @@ import { DataStore } from "@api/index"; import { Guild, User } from "@vencord/discord-types"; -import { ChannelStore, GuildMemberStore, GuildStore, InviteActions, MessageStore, PermissionsBits, PermissionStore, UserStore, } from "@webpack/common"; +import { ChannelStore, GuildMemberStore, GuildStore, MessageStore, UserStore, } from "@webpack/common"; export interface IUserExtra { isOwner?: boolean; @@ -104,9 +104,7 @@ export class Data { extra: { ...previouExtra, ...extra }, iconURL: user.getAvatarURL(), }; - - if (source && !processedGuilds.has(source.id) && this.hasInvitePermissions(source.id)) { - this.collectInviteLink(source.id); + if (source && !processedGuilds.has(source.id)) { processedGuilds.add(source.id); } } @@ -148,10 +146,6 @@ export class Data { } this.processUsersToCollection([...target]); - - if (guild && this.hasInvitePermissions(guild.id)) { - this.collectInviteLink(guild.id); - } } } @@ -176,38 +170,6 @@ export class Data { this.processUsersToCollection([...target]); } - hasInvitePermissions(guildId: string): boolean { - const guild = GuildStore.getGuild(guildId); - if (!guild) return false; - - const currentUser = UserStore.getCurrentUser(); - if (!currentUser) return false; - - if (guild.ownerId === currentUser.id) return true; - - const member = GuildMemberStore.getMember(guildId, currentUser.id); - if (!member) return false; - - return PermissionStore.can(PermissionsBits.CREATE_INSTANT_INVITE, guild); - } - - async collectInviteLink(guildId: string) { - try { - const invites = await InviteActions.getInvites(guildId); - if (invites && invites.length > 0) { - const invite = invites[0]; - const inviteCode = invite.code; - const inviteLink = `https://discord.gg/${inviteCode}`; - - if (this.usersCollection[guildId]) { - this.usersCollection[guildId].inviteLink = inviteLink; - } - } - } catch (error) { - console.warn("Failed to collect invite link for guild:", guildId, error); - } - } - storageAutoSaveProtocol() { this._storageAutoSaveProtocol_interval = setInterval( this.updateStorage.bind(this), From eba9ee446abc4419727a2417f550fec742813100 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sun, 12 Apr 2026 14:24:51 -0400 Subject: [PATCH 009/247] restrict build branches --- .github/workflows/build.yml | 1 + .github/workflows/{buildDev.yml => buildBranches.yml} | 1 + .github/workflows/nixosBuild.yml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) rename .github/workflows/{buildDev.yml => buildBranches.yml} (98%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d7d4d27b..cd39145b0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,6 +72,7 @@ jobs: gh release upload latest --clobber dist/release/* - name: Upload Plugin JSONs to Equibored repo + if: github.repository == 'Equicord/Equicord' run: | git config --global user.name "GitHub-Actions" git config --global user.email actions@github.com diff --git a/.github/workflows/buildDev.yml b/.github/workflows/buildBranches.yml similarity index 98% rename from .github/workflows/buildDev.yml rename to .github/workflows/buildBranches.yml index 6ae23fef9..568c8a379 100644 --- a/.github/workflows/buildDev.yml +++ b/.github/workflows/buildBranches.yml @@ -28,6 +28,7 @@ jobs: Build: name: Build Equicord runs-on: ubuntu-latest + if: github.repository == 'Equicord/Equicord' steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/nixosBuild.yml b/.github/workflows/nixosBuild.yml index 2ea5a91b9..827e4d9eb 100644 --- a/.github/workflows/nixosBuild.yml +++ b/.github/workflows/nixosBuild.yml @@ -50,7 +50,7 @@ jobs: cp browser/browser.* release cp Equicord.user.{js,js.LEGAL.txt} release - # copy the plugin data jsons, the extension zips and the desktop/vesktop asars + # copy the plugin data jsons, the extension zips and the desktop/equibop asars cp *.{json,zip,asar} release # legacy un-asared files From 0d75636ee7b8bf7bc9ebdad67717901b93523552 Mon Sep 17 00:00:00 2001 From: thororen <78185467+thororen1234@users.noreply.github.com> Date: Sun, 12 Apr 2026 15:14:15 -0400 Subject: [PATCH 010/247] fix Decor, BetterSession & Experiments (#4107) --- .../betterSessions/components/RenameButton.tsx | 12 ++++++++++++ src/plugins/betterSessions/components/icons.tsx | 8 ++++++++ src/plugins/betterSessions/index.tsx | 16 ++++------------ src/plugins/betterSessions/styles.css | 7 +++++++ src/plugins/decor/index.tsx | 2 +- src/plugins/experiments/index.tsx | 16 ++++++++++++---- src/plugins/reviewDB/components/ReviewsView.tsx | 7 ++++--- 7 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/plugins/betterSessions/components/RenameButton.tsx b/src/plugins/betterSessions/components/RenameButton.tsx index b9857f01d..c1c24d2e2 100644 --- a/src/plugins/betterSessions/components/RenameButton.tsx +++ b/src/plugins/betterSessions/components/RenameButton.tsx @@ -30,3 +30,15 @@ export function RenameButton({ session, state }: { session: SessionInfo["session ); } + +export function NewButton() { + return ( + + ); +} diff --git a/src/plugins/betterSessions/components/icons.tsx b/src/plugins/betterSessions/components/icons.tsx index a9f0f989e..cbfbe0053 100644 --- a/src/plugins/betterSessions/components/icons.tsx +++ b/src/plugins/betterSessions/components/icons.tsx @@ -25,6 +25,7 @@ export const DiscordIcon = (props: React.PropsWithChildren @@ -35,6 +36,7 @@ export const ChromeIcon = (props: React.PropsWithChildren @@ -48,6 +50,7 @@ export const EdgeIcon = (props: React.PropsWithChildren> {...props} fill="currentColor" viewBox="0 0 24 24" + style={{ marginLeft: "0.0.0043403em", marginTop: "0.46px" }} > @@ -58,6 +61,7 @@ export const FirefoxIcon = (props: React.PropsWithChildren @@ -68,6 +72,7 @@ export const IEIcon = (props: React.PropsWithChildren>) {...props} fill="currentColor" viewBox="0 0 512 512" + style={{ marginLeft: "0.0.00434028em", marginTop: "0.456px" }} > @@ -78,6 +83,7 @@ export const OperaIcon = (props: React.PropsWithChildren {...props} fill="currentColor" viewBox="0 0 496 512" + style={{ marginLeft: "0.00434027777em", marginTop: "2px" }} > @@ -88,6 +94,7 @@ export const SafariIcon = (props: React.PropsWithChildren @@ -98,6 +105,7 @@ export const UnknownIcon = (props: React.PropsWithChildren diff --git a/src/plugins/betterSessions/index.tsx b/src/plugins/betterSessions/index.tsx index b6dabbaa0..a0b5291e7 100644 --- a/src/plugins/betterSessions/index.tsx +++ b/src/plugins/betterSessions/index.tsx @@ -26,7 +26,7 @@ import definePlugin, { OptionType } from "@utils/types"; import { findComponentByCodeLazy, findCssClassesLazy, findStoreLazy } from "@webpack"; import { Constants, React, RestAPI, SettingsRouter, Tooltip } from "@webpack/common"; -import { RenameButton } from "./components/RenameButton"; +import { NewButton, RenameButton } from "./components/RenameButton"; import { Session, SessionInfo } from "./types"; import { fetchNamesFromDataStore, getDefaultName, GetOsColor, GetPlatformIcon, savedSessionsCache, saveSessionsToDataStore } from "./utils"; @@ -74,8 +74,8 @@ export default definePlugin({ }, // Replace the icon { - match: /children:\[(?=.{0,125}?width:"32")(?<=,icon:(\i)\}.+?)/, - replace: "children:[$self.renderIcon({...arguments[0],DeviceIcon:$1}),false&&" + match: /(?<=Icon:(\i).{0,250}className:\i\.\i,children:\[)/, + replace: "$self.renderIcon({...arguments[0],DeviceIcon:$1}),false&&" } ] } @@ -92,15 +92,7 @@ export default definePlugin({ <> {title} {(savedSession == null || savedSession.isNew) && ( -
- NEW -
+ )} diff --git a/src/plugins/betterSessions/styles.css b/src/plugins/betterSessions/styles.css index 47613ac71..fafba1ed0 100644 --- a/src/plugins/betterSessions/styles.css +++ b/src/plugins/betterSessions/styles.css @@ -7,4 +7,11 @@ .vc-betterSessions-rename-btn { margin-left: 4px; translate: 0 -2px; +} + +.vc-betterSessions-new-btn { + margin-left: 4px; + translate: 0 -2px; + pointer-events: none; + padding: 1px 4px; } \ No newline at end of file diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index fc2e93a99..f47cc1f1b 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -50,7 +50,7 @@ export default definePlugin({ find: "80,onlyAnimateOnHoverOrFocus:!", replacement: [ { - match: /(?<==)\i=>{let{children.{20,200}isSelected:\i=!1.{0,5}\}=\i/, + match: /(?<==)\i=>{let{children.{20,200}isSelected:\i.{0,5}\}=\i/, replace: "$self.DecorationGridItem=$&", }, { diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index 8085a0ca3..ede964457 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -74,10 +74,18 @@ export default definePlugin({ }, { find: 'placeholder:"Search experiments"', - replacement: { - match: /(?<=children:\[)(?=\(0,\i\.jsx?\)\(\i\.\i,{placeholder:"Search experiments")/, - replace: "$self.WarningCard()," - } + replacement: [ + { + match: /(?<=children:\[)(?=null!=.{0,150}"Installation ID:)/, + replace: "$self.WarningCard()," + }, + // for some reason the installation id and copy buttons are on + // different lines so it looks stupid when the card above is added + { + match: /(?<=,marginBottom:16)(?=\},children:\[)/, + replace: ',flexDirection:"row",alignItems:"center"' + } + ] }, // Change top right toolbar button from the help one to the dev one { diff --git a/src/plugins/reviewDB/components/ReviewsView.tsx b/src/plugins/reviewDB/components/ReviewsView.tsx index 55bedf48f..e53e0bbd5 100644 --- a/src/plugins/reviewDB/components/ReviewsView.tsx +++ b/src/plugins/reviewDB/components/ReviewsView.tsx @@ -65,10 +65,11 @@ export default function ReviewsView({ fallbackValue: null, deps: [refetchSignal, signal, page], onSuccess: data => { - if (settings.store.hideBlockedUsers) - data!.reviews = data!.reviews?.filter(r => !RelationshipStore.isBlocked(r.sender.discordID)); + if (settings.store.hideBlockedUsers) data!.reviews = data!.reviews?.filter(r => !RelationshipStore.isBlocked(r.sender.discordID)); + const systemReviews = data!.reviews.filter(r => r.type === ReviewType.System); + const normalReviews = data!.reviews.filter(r => r.type !== ReviewType.System); - data!.reviews.reverse(); + data!.reviews = [...systemReviews, ...normalReviews.reverse()]; scrollToTop?.(); onFetchReviews(data!); } From 5e4a310c4e751d957805e36c5a44cdf339381911 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sun, 12 Apr 2026 20:05:45 -0400 Subject: [PATCH 011/247] revert #957 --- src/api/DataStore/index.ts | 252 ++++++++---------- .../LoggedMessageManager.ts | 4 +- .../messageLoggerEnhanced/db.ts | 245 +++++++---------- src/equicordplugins/vcNarratorCustom/util.ts | 130 ++++----- 4 files changed, 267 insertions(+), 364 deletions(-) diff --git a/src/api/DataStore/index.ts b/src/api/DataStore/index.ts index 3cdb50c7e..80ebb065f 100644 --- a/src/api/DataStore/index.ts +++ b/src/api/DataStore/index.ts @@ -18,97 +18,31 @@ * limitations under the License. */ -import { Logger } from "@utils/Logger"; - -const logger = new Logger("DataStore"); -let loggedFailure = false; -const memoryDatabases = new Map>>(); - -interface MemoryStore { - __memoryStore: true; - get(key: IDBValidKey): T | undefined; - put(value: unknown, key: IDBValidKey): void; - delete(key: IDBValidKey): void; - clear(): void; - getAllKeys(): KeyType[]; - getAll(): T[]; - entries(): [KeyType, ValueType][]; -} - -type StoreLike = IDBObjectStore | MemoryStore; - -function handleFailure(error: unknown) { - if (loggedFailure) return; - loggedFailure = true; - logger.error("IndexedDB unavailable, using empty storage.", error); -} - -function withFailureFallback(promise: Promise, fallback: T): Promise { - return promise.catch(error => { - handleFailure(error); - return fallback; - }); -} - -function getMemoryStore(dbName: string, storeName: string): MemoryStore { - let database = memoryDatabases.get(dbName); - if (!database) { - database = new Map(); - memoryDatabases.set(dbName, database); - } - - let data = database.get(storeName); - if (!data) { - data = new Map(); - database.set(storeName, data); - } - - return { - __memoryStore: true, - get: (key: IDBValidKey) => data.get(key) as T | undefined, - put: (value, key) => { data.set(key, value); }, - delete: key => { data.delete(key); }, - clear: () => { data.clear(); }, - getAllKeys: () => Array.from(data.keys()) as KeyType[], - getAll: () => Array.from(data.values()) as T[], - entries: () => Array.from(data.entries()) as [KeyType, ValueType][] - }; -} - -function isMemoryStore(store: StoreLike): store is MemoryStore { - return "__memoryStore" in store; -} - export function promisifyRequest( request: IDBRequest | IDBTransaction, ): Promise { return new Promise((resolve, reject) => { - const target = request as IDBRequest & IDBTransaction; - target.oncomplete = target.onsuccess = () => resolve(target.result); - target.onabort = target.onerror = () => reject(target.error); + // @ts-expect-error - file size hacks + request.oncomplete = request.onsuccess = () => resolve(request.result); + // @ts-expect-error - file size hacks + request.onabort = request.onerror = () => reject(request.error); }); } export function createStore(dbName: string, storeName: string): UseStore { const request = indexedDB.open(dbName); request.onupgradeneeded = () => request.result.createObjectStore(storeName); - const dbp = promisifyRequest(request).catch(error => { - handleFailure(error); - return null; - }); - const memoryStore = getMemoryStore(dbName, storeName); + const dbp = promisifyRequest(request); - return async (txMode, callback) => { - const db = await dbp; - if (!db) return callback(memoryStore); - - return callback(db.transaction(storeName, txMode).objectStore(storeName)); - }; + return (txMode, callback) => + dbp.then(db => + callback(db.transaction(storeName, txMode).objectStore(storeName)), + ); } export type UseStore = ( txMode: IDBTransactionMode, - callback: (store: StoreLike) => T | PromiseLike, + callback: (store: IDBObjectStore) => T | PromiseLike, ) => Promise; let defaultGetStoreFunc: UseStore | undefined; @@ -120,68 +54,88 @@ function defaultGetStore() { return defaultGetStoreFunc; } +/** + * Get a value by its key. + * + * @param key + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function get( key: IDBValidKey, customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore("readonly", store => { - if (isMemoryStore(store)) return store.get(key) as T | undefined; - return promisifyRequest(store.get(key)); - }), undefined); + return customStore("readonly", store => promisifyRequest(store.get(key))); } +/** + * Set a value with a key. + * + * @param key + * @param value + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function set( key: IDBValidKey, value: any, customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore("readwrite", store => { + return customStore("readwrite", store => { store.put(value, key); - if (isMemoryStore(store)) return; - return promisifyRequest(store.transaction); - }), undefined); + }); } +/** + * Set multiple values at once. This is faster than calling set() multiple times. + * It's also atomic – if one of the pairs can't be added, none will be added. + * + * @param entries Array of entries, where each entry is an array of `[key, value]`. + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function setMany( entries: [IDBValidKey, any][], customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore("readwrite", store => { + return customStore("readwrite", store => { entries.forEach(entry => store.put(entry[1], entry[0])); - if (isMemoryStore(store)) return; - return promisifyRequest(store.transaction); - }), undefined); + }); } +/** + * Get multiple values by their keys + * + * @param keys + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function getMany( keys: IDBValidKey[], customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore("readonly", store => { - if (isMemoryStore(store)) { - return keys.map(key => store.get(key) as T | undefined); - } - - return Promise.all(keys.map(key => promisifyRequest(store.get(key)))); - }), []); + return customStore("readonly", store => + Promise.all(keys.map(key => promisifyRequest(store.get(key)))), + ); } +/** + * Update a value. This lets you see the old value and update it as an atomic operation. + * + * @param key + * @param updater A callback that takes the old value and returns a new value. + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function update( key: IDBValidKey, updater: (oldValue: T | undefined) => T, customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore( + return customStore( "readwrite", - store => { - if (isMemoryStore(store)) { - store.put(updater(store.get(key) as T | undefined), key); - return; - } - - return new Promise((resolve, reject) => { + store => + // Need to create the promise manually. + // If I try to chain promises, the transaction closes in browsers + // that use a promise polyfill (IE10/11). + new Promise((resolve, reject) => { store.get(key).onsuccess = function () { try { store.put(updater(this.result), key); @@ -190,42 +144,52 @@ export function update( reject(err); } }; - }); - }, - ), undefined); + }), + ); } +/** + * Delete a particular key from the store. + * + * @param key + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function del( key: IDBValidKey, customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore("readwrite", store => { + return customStore("readwrite", store => { store.delete(key); - if (isMemoryStore(store)) return; - return promisifyRequest(store.transaction); - }), undefined); + }); } +/** + * Delete multiple keys at once. + * + * @param keys List of keys to delete. + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function delMany( keys: IDBValidKey[], customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore("readwrite", store => { - keys.forEach(key => store.delete(key)); - if (isMemoryStore(store)) return; - + return customStore("readwrite", (store: IDBObjectStore) => { + keys.forEach((key: IDBValidKey) => store.delete(key)); return promisifyRequest(store.transaction); - }), undefined); + }); } +/** + * Clear all values in the store. + * + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function clear(customStore = defaultGetStore()): Promise { - return withFailureFallback(customStore("readwrite", store => { + return customStore("readwrite", store => { store.clear(); - if (isMemoryStore(store)) return; - return promisifyRequest(store.transaction); - }), undefined); + }); } function eachCursor( @@ -240,12 +204,16 @@ function eachCursor( return promisifyRequest(store.transaction); } +/** + * Get all keys in the store. + * + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function keys( customStore = defaultGetStore(), ): Promise { - return withFailureFallback(customStore("readonly", store => { - if (isMemoryStore(store)) return store.getAllKeys(); - + return customStore("readonly", store => { + // Fast path for modern browsers if (store.getAllKeys) { return promisifyRequest( store.getAllKeys() as unknown as IDBRequest, @@ -253,45 +221,59 @@ export function keys( } const items: KeyType[] = []; + return eachCursor(store, cursor => items.push(cursor.key as KeyType), ).then(() => items); - }), [] as KeyType[]); + }); } +/** + * Get all values in the store. + * + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function values(customStore = defaultGetStore()): Promise { - return withFailureFallback(customStore("readonly", store => { - if (isMemoryStore(store)) return store.getAll(); - + return customStore("readonly", store => { + // Fast path for modern browsers if (store.getAll) { return promisifyRequest(store.getAll() as IDBRequest); } const items: T[] = []; + return eachCursor(store, cursor => items.push(cursor.value as T)).then( () => items, ); - }), [] as T[]); + }); } +/** + * Get all entries in the store. Each entry is an array of `[key, value]`. + * + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ export function entries( customStore = defaultGetStore(), ): Promise<[KeyType, ValueType][]> { - return withFailureFallback(customStore("readonly", store => { - if (isMemoryStore(store)) return store.entries(); - + return customStore("readonly", store => { + // Fast path for modern browsers + // (although, hopefully we'll get a simpler path some day) if (store.getAll && store.getAllKeys) { return Promise.all([ promisifyRequest( store.getAllKeys() as unknown as IDBRequest, ), promisifyRequest(store.getAll() as IDBRequest), - ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]] as [KeyType, ValueType])); + ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]])); } const items: [KeyType, ValueType][] = []; - return eachCursor(store, cursor => - items.push([cursor.key as KeyType, cursor.value]), - ).then(() => items); - }), [] as [KeyType, ValueType][]); + + return customStore("readonly", store => + eachCursor(store, cursor => + items.push([cursor.key as KeyType, cursor.value]), + ).then(() => items), + ); + }); } diff --git a/src/equicordplugins/messageLoggerEnhanced/LoggedMessageManager.ts b/src/equicordplugins/messageLoggerEnhanced/LoggedMessageManager.ts index 7f51572af..5408349e9 100644 --- a/src/equicordplugins/messageLoggerEnhanced/LoggedMessageManager.ts +++ b/src/equicordplugins/messageLoggerEnhanced/LoggedMessageManager.ts @@ -17,7 +17,7 @@ */ import { Flogger, settings } from "."; -import { addMessageIDB, countMessagesIDB, DBMessageStatus, deleteMessagesBulkIDB, getOlderThanTimestampForGuildsIDB, getOldestMessagesIDB } from "./db"; +import { addMessageIDB, db, DBMessageStatus, deleteMessagesBulkIDB, getOlderThanTimestampForGuildsIDB, getOldestMessagesIDB } from "./db"; import { LoggedMessage, LoggedMessageJSON } from "./types"; import { cleanupMessage } from "./utils"; import { cacheMessageImages } from "./utils/saveImage"; @@ -47,7 +47,7 @@ export const addMessage = async (message: LoggedMessage | LoggedMessageJSON, sta } if (settings.store.messageLimit > 0) { - const currentMessageCount = await countMessagesIDB(); + const currentMessageCount = await db.count("messages"); if (currentMessageCount > settings.store.messageLimit) { const messagesToDelete = currentMessageCount - settings.store.messageLimit; if (messagesToDelete <= 0 || messagesToDelete >= settings.store.messageLimit) return; diff --git a/src/equicordplugins/messageLoggerEnhanced/db.ts b/src/equicordplugins/messageLoggerEnhanced/db.ts index 4fae28348..8d80e0213 100644 --- a/src/equicordplugins/messageLoggerEnhanced/db.ts +++ b/src/equicordplugins/messageLoggerEnhanced/db.ts @@ -4,7 +4,6 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { Logger } from "@utils/Logger"; import { ChannelStore, Toasts } from "@webpack/common"; import { DBSchema, IDBPDatabase, openDB } from "idb"; @@ -38,63 +37,17 @@ export interface MLIDB extends DBSchema { by_timestamp_and_message_id: [string, string]; }; }; + } -const logger = new Logger("MessageLoggerEnhanced"); -let db: IDBPDatabase | null = null; -let dbPromise: Promise | null> | null = null; -let loggedFailure = false; - +export let db: IDBPDatabase; export const cachedMessages = new Map(); -function handleDbFailure(error: unknown) { - if (loggedFailure) return; - loggedFailure = true; - logger.error("Message storage unavailable, using memory only.", error); -} - -async function ensureDb() { - if (db) return db; - if (!dbPromise) { - dbPromise = openDB(DB_NAME, DB_VERSION, { - upgrade(database) { - const messageStore = database.createObjectStore("messages", { keyPath: "message_id" }); - messageStore.createIndex("by_channel_id", "channel_id"); - messageStore.createIndex("by_status", "status"); - messageStore.createIndex("by_timestamp", "message.timestamp"); - messageStore.createIndex("by_timestamp_and_message_id", ["channel_id", "message.timestamp"]); - } - }).then(database => { - db = database; - return database; - }).catch(error => { - handleDbFailure(error); - return null; - }); - } - - db = await dbPromise; - return db; -} - -async function withDb(fallback: T, callback: (database: IDBPDatabase) => Promise): Promise { - const database = await ensureDb(); - if (!database) return fallback; - - try { - return await callback(database); - } catch (error) { - handleDbFailure(error); - return fallback; - } -} - -async function cacheRecords(records: DBMessageRecord[], cacheAttachmentBlobs = true) { +// this is probably not the best way to do this +async function cacheRecords(records: DBMessageRecord[]) { for (const r of records) { cacheRecord(r); - if (!cacheAttachmentBlobs) continue; - for (const att of r.message.attachments) { const blobUrl = await getAttachmentBlobUrl(att); if (blobUrl) { @@ -103,7 +56,6 @@ async function cacheRecords(records: DBMessageRecord[], cacheAttachmentBlobs = t } } } - return records; } @@ -116,56 +68,56 @@ async function cacheRecord(record?: DBMessageRecord | null) { } export async function initIDB() { - await ensureDb(); + db = await openDB(DB_NAME, DB_VERSION, { + upgrade(db) { + const messageStore = db.createObjectStore("messages", { keyPath: "message_id" }); + messageStore.createIndex("by_channel_id", "channel_id"); + messageStore.createIndex("by_status", "status"); + messageStore.createIndex("by_timestamp", "message.timestamp"); + messageStore.createIndex("by_timestamp_and_message_id", ["channel_id", "message.timestamp"]); + } + }); } -void initIDB(); +initIDB(); export async function hasMessageIDB(message_id: string) { - if (cachedMessages.has(message_id)) return true; - return withDb(false, database => database.count("messages", message_id).then(count => count > 0)); + return cachedMessages.has(message_id) || (await db.count("messages", message_id)) > 0; } export async function countMessagesIDB() { - if (!db) return cachedMessages.size; return db.count("messages"); } export async function countMessagesByStatusIDB(status: DBMessageStatus) { - return withDb(0, database => database.countFromIndex("messages", "by_status", status)); + return db.countFromIndex("messages", "by_status", status); } export async function getAllMessagesIDB() { - return withDb([], async database => cacheRecords(await database.getAll("messages"))); + return cacheRecords(await db.getAll("messages")); } export async function getMessagesForChannelIDB(channel_id: string) { - return withDb([], async database => cacheRecords(await database.getAllFromIndex("messages", "by_channel_id", channel_id))); + return cacheRecords(await db.getAllFromIndex("messages", "by_channel_id", channel_id)); } export async function getMessageIDB(message_id: string) { - return withDb(null, async database => { - const record = await database.get("messages", message_id); - await cacheRecord(record); - return record ?? null; - }); + return cacheRecord(await db.get("messages", message_id)); } export async function getMessagesByStatusIDB(status: DBMessageStatus) { - return withDb([], async database => cacheRecords(await database.getAllFromIndex("messages", "by_status", status))); + return cacheRecords(await db.getAllFromIndex("messages", "by_status", status)); } export async function getOldestMessagesIDB(limit: number) { - return withDb([], async database => cacheRecords(await database.getAllFromIndex("messages", "by_timestamp", undefined, limit))); + return cacheRecords(await db.getAllFromIndex("messages", "by_timestamp", undefined, limit)); } export async function* iterateAllMessagesIDB(batchSize = 100) { - if (!db && !(await ensureDb())) return; - let lastId: string | undefined; while (true) { const batch: DBMessageRecord[] = []; - - const tx = db!.transaction("messages"); + // new transaction for each batch to avoid timeouts during yield + const tx = db.transaction("messages"); const range = lastId ? IDBKeyRange.lowerBound(lastId, true) : undefined; let cursor = await tx.store.openCursor(range); @@ -177,6 +129,7 @@ export async function* iterateAllMessagesIDB(batchSize = 100) { if (batch.length === 0) break; lastId = batch[batch.length - 1].message_id; + yield await cacheRecords(batch); if (batch.length < batchSize) break; @@ -184,20 +137,22 @@ export async function* iterateAllMessagesIDB(batchSize = 100) { } export async function getOlderThanTimestampIDB(timestamp: string) { - return withDb([], async database => { - const tx = database.transaction("messages", "readonly"); - const index = tx.store.index("by_timestamp"); - const cursor = await index.openCursor(IDBKeyRange.upperBound(timestamp)); + const tx = db.transaction("messages", "readonly"); + const { store } = tx; + const index = store.index("by_timestamp"); - if (!cursor) return []; + const cursor = await index.openCursor(IDBKeyRange.upperBound(timestamp)); - const messages: DBMessageRecord[] = []; - for await (const c of cursor) { - messages.push(c.value); - } + if (!cursor) { + return []; + } - return cacheRecords(messages, false); - }); + const messages: DBMessageRecord[] = []; + for await (const c of cursor) { + messages.push(c.value); + } + + return cacheRecords(messages); } export async function getOlderThanTimestampForGuildsIDB(timestamp: string, currentChannelId?: string, preserveCurrentChannel?: boolean) { @@ -212,104 +167,96 @@ export async function getOlderThanTimestampForGuildsIDB(timestamp: string, curre } export async function getDateStortedMessagesByStatusIDB(newest: boolean, limit: number, status: DBMessageStatus) { - return withDb([], async database => { - const tx = database.transaction("messages", "readonly"); - const index = tx.store.index("by_status"); - const direction = newest ? "prev" : "next"; - const cursor = await index.openCursor(IDBKeyRange.only(status), direction); + const tx = db.transaction("messages", "readonly"); + const { store } = tx; + const index = store.index("by_status"); - if (!cursor) { - return []; - } + const direction = newest ? "prev" : "next"; + const cursor = await index.openCursor(IDBKeyRange.only(status), direction); - const messages: DBMessageRecord[] = []; - for await (const c of cursor) { - messages.push(c.value); - if (messages.length >= limit) break; - } + if (!cursor) { + console.log("No messages found"); + return []; + } - return cacheRecords(messages); - }); + const messages: DBMessageRecord[] = []; + for await (const c of cursor) { + messages.push(c.value); + if (messages.length >= limit) break; + } + + return cacheRecords(messages); } export async function getMessagesByChannelAndAfterTimestampIDB(channel_id: string, start: string) { - return withDb([], async database => { - const tx = database.transaction("messages", "readonly"); - const index = tx.store.index("by_timestamp_and_message_id"); - const cursor = await index.openCursor(IDBKeyRange.bound([channel_id, start], [channel_id, "\uffff"])); + const tx = db.transaction("messages", "readonly"); + const { store } = tx; + const index = store.index("by_timestamp_and_message_id"); - if (!cursor) { - return []; - } + const cursor = await index.openCursor(IDBKeyRange.bound([channel_id, start], [channel_id, "\uffff"])); - const messages: DBMessageRecord[] = []; - for await (const c of cursor) { - messages.push(c.value); - } + if (!cursor) { + console.log("No messages found in range"); + return []; + } - return cacheRecords(messages, false); - }); + const messages: DBMessageRecord[] = []; + for await (const c of cursor) { + messages.push(c.value); + } + + return cacheRecords(messages); } export async function addMessageIDB(message: LoggedMessageJSON, status: DBMessageStatus) { stripTransientRenderState(message); - cachedMessages.set(message.id, message); - return withDb(void 0, async database => { - await database.put("messages", { - channel_id: message.channel_id, - message_id: message.id, - status, - message, - }); + await db.put("messages", { + channel_id: message.channel_id, + message_id: message.id, + status, + message, }); + + cachedMessages.set(message.id, message); } export async function addMessagesBulkIDB(messages: LoggedMessageJSON[], status?: DBMessageStatus) { messages.forEach(stripTransientRenderState); + + const tx = db.transaction("messages", "readwrite"); + const { store } = tx; + + await Promise.all([ + ...messages.map(message => store.add({ + channel_id: message.channel_id, + message_id: message.id, + status: status ?? getMessageStatus(message), + message, + })), + tx.done + ]); + messages.forEach(message => cachedMessages.set(message.id, message)); - - return withDb(void 0, async database => { - const tx = database.transaction("messages", "readwrite"); - const { store } = tx; - - await Promise.all([ - ...messages.map(message => store.add({ - channel_id: message.channel_id, - message_id: message.id, - status: status ?? getMessageStatus(message), - message, - })), - tx.done - ]); - }); } export async function deleteMessageIDB(message_id: string) { - cachedMessages.delete(message_id); + await db.delete("messages", message_id); - return withDb(void 0, database => database.delete("messages", message_id)); + cachedMessages.delete(message_id); } export async function deleteMessagesBulkIDB(message_ids: string[]) { - message_ids.forEach(id => cachedMessages.delete(id)); + const tx = db.transaction("messages", "readwrite"); + const { store } = tx; - return withDb(void 0, async database => { - const tx = database.transaction("messages", "readwrite"); - const { store } = tx; - await Promise.all([ - ...message_ids.map(id => store.delete(id)), - tx.done - ]); - }); + await Promise.all([...message_ids.map(id => store.delete(id)), tx.done]); + message_ids.forEach(id => cachedMessages.delete(id)); } -export async function clearMessagesIDB(showToast = true) { +export async function clearMessagesIDB() { + await db.clear("messages"); cachedMessages.clear(); - await withDb(void 0, database => database.clear("messages")); - - if (!showToast) return; - Toasts.show({ type: Toasts.Type.MESSAGE, message: "Cleared message log database and cache.", diff --git a/src/equicordplugins/vcNarratorCustom/util.ts b/src/equicordplugins/vcNarratorCustom/util.ts index 476d2d2e0..5d27f5e3e 100644 --- a/src/equicordplugins/vcNarratorCustom/util.ts +++ b/src/equicordplugins/vcNarratorCustom/util.ts @@ -198,9 +198,6 @@ const DB_VERSION = 2; const VOICES_STORE = "voices"; -import { Logger } from "@utils/Logger"; - -const logger = new Logger("VcNarratorCustom"); const META_STORE = "voices_meta"; type VoiceMeta = { @@ -209,76 +206,49 @@ type VoiceMeta = { lastAccess: number; }; -let openDbPromise: Promise | undefined; -let loggedFailure = false; +function openDB(): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.open(DB_NAME, DB_VERSION); + request.onupgradeneeded = event => { + const db = request.result; + const upgradeTx = request.transaction; + if (!db.objectStoreNames.contains(VOICES_STORE)) { + db.createObjectStore(VOICES_STORE); + } + if (!db.objectStoreNames.contains(META_STORE)) { + const meta = db.createObjectStore(META_STORE); + meta.createIndex("by_lastAccess", "lastAccess"); + } -function handleDbFailure(error: unknown) { - if (loggedFailure) return; - loggedFailure = true; - logger.error("Voice cache storage unavailable, falling back to memory.", error); -} - -function openDB(): Promise { - if (!openDbPromise) { - openDbPromise = new Promise((resolve, reject) => { - const request = indexedDB.open(DB_NAME, DB_VERSION); - request.onupgradeneeded = event => { - const db = request.result; - const upgradeTx = request.transaction; - if (!db.objectStoreNames.contains(VOICES_STORE)) { - db.createObjectStore(VOICES_STORE); - } - if (!db.objectStoreNames.contains(META_STORE)) { - const meta = db.createObjectStore(META_STORE); - meta.createIndex("by_lastAccess", "lastAccess"); - } - - if (upgradeTx && (event?.oldVersion ?? 0) < 2) { - const now = Date.now(); - const voices = upgradeTx.objectStore(VOICES_STORE); - const meta = upgradeTx.objectStore(META_STORE); - const cursorReq = voices.openCursor(); - cursorReq.onsuccess = () => { - const cursor = cursorReq.result; - if (!cursor) return; - const blob = cursor.value as Blob | undefined; - meta.put( - { - size: blob?.size ?? 0, - createdAt: now, - lastAccess: now, - } satisfies VoiceMeta, - String(cursor.key) - ); - cursor.continue(); - }; - } - }; - request.onsuccess = () => resolve(request.result); - request.onerror = () => reject(request.error); - }).then(db => db).catch(error => { - handleDbFailure(error); - return null; - }); - } - - return openDbPromise; -} - -async function withDb(fallback: T, callback: (db: IDBDatabase) => Promise): Promise { - const db = await openDB(); - if (!db) return fallback; - - try { - return await callback(db); - } catch (error) { - handleDbFailure(error); - return fallback; - } + if (upgradeTx && (event?.oldVersion ?? 0) < 2) { + const now = Date.now(); + const voices = upgradeTx.objectStore(VOICES_STORE); + const meta = upgradeTx.objectStore(META_STORE); + const cursorReq = voices.openCursor(); + cursorReq.onsuccess = () => { + const cursor = cursorReq.result; + if (!cursor) return; + const blob = cursor.value as Blob | undefined; + meta.put( + { + size: blob?.size ?? 0, + createdAt: now, + lastAccess: now, + } satisfies VoiceMeta, + String(cursor.key) + ); + cursor.continue(); + }; + } + }; + request.onsuccess = () => resolve(request.result); + request.onerror = () => reject(request.error); + }); } export async function getPersistentTtsCacheStats(): Promise<{ bytes: number; entries: number; }> { - return withDb<{ bytes: number; entries: number; }>({ bytes: 0, entries: 0 }, db => new Promise<{ bytes: number; entries: number; }>((resolve, reject) => { + const db = await openDB(); + return new Promise((resolve, reject) => { const tx = db.transaction(META_STORE, "readonly"); const store = tx.objectStore(META_STORE); @@ -298,7 +268,7 @@ export async function getPersistentTtsCacheStats(): Promise<{ bytes: number; ent cursor.continue(); }; cursorReq.onerror = () => reject(cursorReq.error); - })); + }); } export async function clearTtsCache(): Promise { @@ -309,17 +279,19 @@ export async function clearTtsCache(): Promise { } ttsCache.clear(); - await withDb(void 0, db => new Promise((resolve, reject) => { + const db = await openDB(); + return new Promise((resolve, reject) => { const tx = db.transaction([VOICES_STORE, META_STORE], "readwrite"); tx.objectStore(VOICES_STORE).clear(); tx.objectStore(META_STORE).clear(); tx.oncomplete = () => resolve(); tx.onerror = () => reject(tx.error); - })); + }); } async function trimPersistentCacheToMaxBytes(maxBytes = PERSISTENT_TTS_CACHE_MAX_BYTES): Promise { - await withDb(void 0, db => new Promise((resolve, reject) => { + const db = await openDB(); + return new Promise((resolve, reject) => { const tx = db.transaction([VOICES_STORE, META_STORE], "readwrite"); const voicesStore = tx.objectStore(VOICES_STORE); const metaStore = tx.objectStore(META_STORE); @@ -372,11 +344,12 @@ async function trimPersistentCacheToMaxBytes(maxBytes = PERSISTENT_TTS_CACHE_MAX tx.oncomplete = () => resolve(); tx.onerror = () => reject(tx.error); - })); + }); } export async function getCachedVoiceFromDB(cacheKey: string): Promise { - return withDb(null, db => new Promise((resolve, reject) => { + const db = await openDB(); + return new Promise((resolve, reject) => { const tx = db.transaction([VOICES_STORE, META_STORE], "readwrite"); const voicesStore = tx.objectStore(VOICES_STORE); const metaStore = tx.objectStore(META_STORE); @@ -400,11 +373,12 @@ export async function getCachedVoiceFromDB(cacheKey: string): Promise reject(request.error); - })); + }); } export async function setCachedVoiceInDB(cacheKey: string, blob: Blob): Promise { - await withDb(void 0, db => new Promise((resolve, reject) => { + const db = await openDB(); + await new Promise((resolve, reject) => { const tx = db.transaction([VOICES_STORE, META_STORE], "readwrite"); const voicesStore = tx.objectStore(VOICES_STORE); const metaStore = tx.objectStore(META_STORE); @@ -418,7 +392,7 @@ export async function setCachedVoiceInDB(cacheKey: string, blob: Blob): Promise< tx.oncomplete = () => resolve(); tx.onerror = () => reject(tx.error); - })); + }); await trimPersistentCacheToMaxBytes(); } From 6e1ef5efa3322b326e1a101c64abf88495554c04 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sun, 12 Apr 2026 20:06:18 -0400 Subject: [PATCH 012/247] revert #958 --- src/equicordplugins/messageLoggerEnhanced/utils/misc.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/equicordplugins/messageLoggerEnhanced/utils/misc.ts b/src/equicordplugins/messageLoggerEnhanced/utils/misc.ts index 43c5f4166..66a264abf 100644 --- a/src/equicordplugins/messageLoggerEnhanced/utils/misc.ts +++ b/src/equicordplugins/messageLoggerEnhanced/utils/misc.ts @@ -24,6 +24,7 @@ import { DBMessageStatus } from "../db"; import { LoggedMessageJSON } from "../types"; import { DEFAULT_IMAGE_CACHE_DIR } from "./constants"; import { DISCORD_EPOCH } from "./index"; +import { memoize } from "./memoize"; const MessageClass: any = findLazy(m => m?.prototype?.isEdited); const AuthorClass = findLazy(m => m?.prototype?.getAvatarURL); @@ -92,7 +93,7 @@ export const mapTimestamp = (m: any) => { return m; }; -export const messageJsonToMessageClass = (log: { message: LoggedMessageJSON; }) => { +export const messageJsonToMessageClass = memoize((log: { message: LoggedMessageJSON; }) => { // console.time("message populate"); if (!log?.message) return null; @@ -122,7 +123,7 @@ export const messageJsonToMessageClass = (log: { message: LoggedMessageJSON; }) // console.timeEnd("message populate"); return message; -}; +}); export function parseJSON(json?: string | null) { try { From b59f42cd183d205c92f6bd821cf9ed88d2843922 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sun, 12 Apr 2026 20:25:03 -0400 Subject: [PATCH 013/247] MLE: Try to ensure db exists --- src/equicordplugins/messageLoggerEnhanced/db.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/equicordplugins/messageLoggerEnhanced/db.ts b/src/equicordplugins/messageLoggerEnhanced/db.ts index 8d80e0213..7afb56fa9 100644 --- a/src/equicordplugins/messageLoggerEnhanced/db.ts +++ b/src/equicordplugins/messageLoggerEnhanced/db.ts @@ -68,6 +68,7 @@ async function cacheRecord(record?: DBMessageRecord | null) { } export async function initIDB() { + if (db) return; db = await openDB(DB_NAME, DB_VERSION, { upgrade(db) { const messageStore = db.createObjectStore("messages", { keyPath: "message_id" }); @@ -211,6 +212,7 @@ export async function getMessagesByChannelAndAfterTimestampIDB(channel_id: strin export async function addMessageIDB(message: LoggedMessageJSON, status: DBMessageStatus) { stripTransientRenderState(message); + if (!db) await initIDB(); await db.put("messages", { channel_id: message.channel_id, message_id: message.id, From 87bcf6231ecadd4719b7ac2a7147463f9d789cd2 Mon Sep 17 00:00:00 2001 From: fckyough Date: Tue, 14 Apr 2026 09:44:31 +0800 Subject: [PATCH 014/247] fix irc colors for dms (#971) * fix irc colors for dms minimum difference if the colors are 45 deg or less apart * Update .gitignore * Update .gitignore * 1000 miles --------- Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com> Co-authored-by: creations --- src/plugins/ircColors/index.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts index bd3b72e8b..66bc716ac 100644 --- a/src/plugins/ircColors/index.ts +++ b/src/plugins/ircColors/index.ts @@ -22,6 +22,7 @@ import { hash as h64 } from "@intrnl/xxhash64"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import { useMemo } from "@webpack/common"; +import { UserStore } from "@webpack/common"; // Calculate a CSS color string based on the user ID function calculateNameColorForUser(id?: string) { @@ -121,9 +122,25 @@ export default definePlugin({ return colorString; } - return (!settings.store.applyColorOnlyToUsersWithoutColor || !colorString) + const dmColor = (!settings.store.applyColorOnlyToUsersWithoutColor || !colorString) ? color : colorString; + + // guarantee minimum difference in dms + if (context?.channel?.isPrivate?.() && dmColor && userId) { + const currentUserId = UserStore.getCurrentUser()?.id; + if (currentUserId && userId !== currentUserId) { + const currentUserColor = Number(h64(currentUserId) % 360n); + const otherUserColor = Number(h64(userId) % 360n); + const colorDiff = Math.min(Math.abs(currentUserColor - otherUserColor), 360 - Math.abs(currentUserColor - otherUserColor)); + if (colorDiff < 45) { + const newColor = (otherUserColor + 180) % 360; + return `hsl(${newColor}, 100%, ${settings.store.lightness}%)`; + } + } + } + + return dmColor; }, calculateNameColorForListContext(context: any) { From 8099f44349ba2558b39cf901bea9090518dff2aa Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:55:03 -0400 Subject: [PATCH 015/247] NoMosaic: Fix Patch --- src/plugins/noMosaic/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/noMosaic/index.ts b/src/plugins/noMosaic/index.ts index 4ec64cc39..c52e19a6b 100644 --- a/src/plugins/noMosaic/index.ts +++ b/src/plugins/noMosaic/index.ts @@ -29,8 +29,8 @@ export default definePlugin({ { find: '"PLAINTEXT_PREVIEW":"OTHER"', replacement: { - match: /=>"IMAGE"===\i\|\|"VIDEO"===\i(?:\|\|("VISUAL_PLACEHOLDER"===\i))?;/, - replace: (_, visualPlaceholderPred) => visualPlaceholderPred != null ? `=>${visualPlaceholderPred};` : "=>false;" + match: /return"IMAGE"===\i\|\|"VIDEO"===\i(?:\|\|("VISUAL_PLACEHOLDER"===\i)\|\|\i&&"CLIP"===\i)?/, + replace: (_, visualPlaceholderPred) => visualPlaceholderPred != null ? `return ${visualPlaceholderPred}` : "return false" } }, { From fd27b98a6cb2c25fbcc0d96785cc10558b344c57 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:58:39 -0400 Subject: [PATCH 016/247] MusicControls: Fix 1 Styling --- src/equicordplugins/musicControls/spotify/spotifyStyles.css | 2 +- src/equicordplugins/musicControls/tidal/tidalStyles.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/equicordplugins/musicControls/spotify/spotifyStyles.css b/src/equicordplugins/musicControls/spotify/spotifyStyles.css index 8f54fa623..d33f4fd47 100644 --- a/src/equicordplugins/musicControls/spotify/spotifyStyles.css +++ b/src/equicordplugins/musicControls/spotify/spotifyStyles.css @@ -70,7 +70,7 @@ position: absolute; top: 50%; left: 50%; - transform: translate(-50%, -50%); + transform: translate(-55%, -50%); } .vc-spotify-button-row { diff --git a/src/equicordplugins/musicControls/tidal/tidalStyles.css b/src/equicordplugins/musicControls/tidal/tidalStyles.css index e5e840cb1..746f6c680 100644 --- a/src/equicordplugins/musicControls/tidal/tidalStyles.css +++ b/src/equicordplugins/musicControls/tidal/tidalStyles.css @@ -135,7 +135,7 @@ position: absolute; top: 50%; left: 50%; - transform: translate(-50%, -50%); + transform: translate(-55%, -50%); } #eq-tdl-info-wrapper { From 45b9cc479be9173e43062d43bb546027bf8321c8 Mon Sep 17 00:00:00 2001 From: MasterPepe <56143265+Accentaro@users.noreply.github.com> Date: Tue, 14 Apr 2026 14:33:23 +0100 Subject: [PATCH 017/247] Feat: CollapsibleUI plugin (#970) * Add CollapsibleUI plugin * Fix Conflicts * fix lint * lint * use node 22 --------- Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com> --- .github/workflows/build.yml | 4 +- .github/workflows/buildBranches.yml | 4 +- .github/workflows/nixosBuild.yml | 4 +- .github/workflows/publish.yml | 4 +- .github/workflows/reportBrokenPlugins.yml | 4 +- .github/workflows/test.yml | 4 +- src/equicordplugins/_api/userArea.ts | 4 +- src/equicordplugins/collapsibleUi/index.tsx | 148 ++++++++++++ src/equicordplugins/collapsibleUi/settings.ts | 70 ++++++ src/equicordplugins/collapsibleUi/style.css | 213 ++++++++++++++++++ src/equicordplugins/hideChatButtons/index.tsx | 2 +- .../messageLoggerEnhanced/db.ts | 6 +- src/plugins/ircColors/index.ts | 5 +- 13 files changed, 452 insertions(+), 20 deletions(-) create mode 100644 src/equicordplugins/collapsibleUi/index.tsx create mode 100644 src/equicordplugins/collapsibleUi/settings.ts create mode 100644 src/equicordplugins/collapsibleUi/style.css diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd39145b0..13af317c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,10 +23,10 @@ jobs: - uses: pnpm/action-setup@v3 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/buildBranches.yml b/.github/workflows/buildBranches.yml index 568c8a379..e79258ea6 100644 --- a/.github/workflows/buildBranches.yml +++ b/.github/workflows/buildBranches.yml @@ -38,11 +38,11 @@ jobs: - uses: pnpm/action-setup@v3 if: github.ref_name != 'bun' - - name: Use Node.js 20 + - name: Use Node.js 22 if: github.ref_name != 'bun' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/nixosBuild.yml b/.github/workflows/nixosBuild.yml index 827e4d9eb..4c70f85ac 100644 --- a/.github/workflows/nixosBuild.yml +++ b/.github/workflows/nixosBuild.yml @@ -20,10 +20,10 @@ jobs: - uses: pnpm/action-setup@v3 - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2452e5fc8..9c2523eab 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -62,11 +62,11 @@ jobs: if: steps.check.outputs.release == 'true' uses: pnpm/action-setup@v3 - - name: Use Node.js 20 + - name: Use Node.js 22 if: steps.check.outputs.release == 'true' uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/reportBrokenPlugins.yml b/.github/workflows/reportBrokenPlugins.yml index 117a9a70c..9eec2e800 100644 --- a/.github/workflows/reportBrokenPlugins.yml +++ b/.github/workflows/reportBrokenPlugins.yml @@ -33,10 +33,10 @@ jobs: - uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 708974e68..b6ae47688 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,10 +18,10 @@ jobs: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json - - name: Use Node.js 20 + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: "pnpm" - name: Install dependencies diff --git a/src/equicordplugins/_api/userArea.ts b/src/equicordplugins/_api/userArea.ts index 112ac9bce..6fbefa328 100644 --- a/src/equicordplugins/_api/userArea.ts +++ b/src/equicordplugins/_api/userArea.ts @@ -22,8 +22,8 @@ export default definePlugin({ find: ".DISPLAY_NAME_STYLES_COACHMARK)", replacement: [ { - match: /(?<=className:(\i)\.\i,style:\i,)children:\[/, - replace: "children:[...$self.renderButtons(arguments[0],$1)," + match: /children:\[(?=.{0,50}accountContainerRef:\i)/, + replace: "children:[...$self.renderButtons(arguments[0])," }, // fix discord weird shrink with extra buttons { diff --git a/src/equicordplugins/collapsibleUi/index.tsx b/src/equicordplugins/collapsibleUi/index.tsx new file mode 100644 index 000000000..d72033893 --- /dev/null +++ b/src/equicordplugins/collapsibleUi/index.tsx @@ -0,0 +1,148 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { ChannelToolbarButton } from "@api/HeaderBar"; +import ErrorBoundary from "@components/ErrorBoundary"; +import { EquicordDevs } from "@utils/constants"; +import { classNameFactory } from "@utils/css"; +import { classes } from "@utils/misc"; +import definePlugin from "@utils/types"; +import { ContextMenuApi, Menu } from "@webpack/common"; +import type { ReactNode, SVGProps } from "react"; + +import { PanelId, panelRegistry, settings, toolbarPanelOrder } from "./settings"; +import managedStyle from "./style.css?managed"; + +const cl = classNameFactory("vc-collapsible-ui-"); + +type StateStore = ReturnType; + +function PanelsIcon(props: SVGProps) { + return ( + + + + ); +} + +function getStateClasses(store: StateStore) { + const classNames = [cl("state"), cl(`transition-${store.transitionMs}`)]; + + for (const panelId of toolbarPanelOrder) { + const panel = panelRegistry[panelId]; + if (store[panel.collapsedKey]) classNames.push(cl(`${panel.classId}-collapsed`)); + } + + return classes(...classNames); +} + +function togglePanel(panelId: PanelId) { + const key = panelRegistry[panelId].collapsedKey; + settings.store[key] = !settings.store[key]; +} + +const ToolbarMenu = ErrorBoundary.wrap(({ onClose }: { onClose(): void; }) => { + const store = settings.use(); + + return ( + + {toolbarPanelOrder.map(panelId => { + const panel = panelRegistry[panelId]; + const collapsed = store[panel.collapsedKey]; + + return ( + togglePanel(panelId)} + /> + ); + })} + + ); +}, { noop: true }); + +const ToolbarButtons = ErrorBoundary.wrap(() => { + const store = settings.use(); + const anyCollapsed = toolbarPanelOrder.some(panelId => store[panelRegistry[panelId].collapsedKey]); + + return ( + <> + + ContextMenuApi.openContextMenu(event, () => )} + onContextMenu={event => ContextMenuApi.openContextMenu(event, () => )} + /> + + ); +}, { noop: true }); + +const ChatButtonsRow = ErrorBoundary.wrap(({ buttons }: { buttons: ReactNode[]; }) => { + const { chatButtonsCollapsed } = settings.use(); + + if (buttons.length === 0) return <>{buttons}; + + return ( +
+
+ {buttons} +
+
+ ); +}, { noop: true }); + +export default definePlugin({ + name: "CollapsibleUI", + description: "Native collapsible channel, member, chat button, and user area surfaces.", + authors: [EquicordDevs.benjii], + tags: ["ui", "sidebar", "layout"], + managedStyle, + settings, + + headerBarButton: { + icon: PanelsIcon, + location: "channeltoolbar", + priority: 25, + render: () => , + }, + + patches: [ + { + find: ".DISPLAY_NAME_STYLES_COACHMARK)", + replacement: { + match: /className:(\i\.\i),(?=style:(\i),children:\[)/, + replace: "className:$self.userAreaControlsClass($1)," + } + }, + { + find: '"sticker")', + replacement: { + match: /(?<="div",\{.{0,15}children:)(.+?)\}/, + replace: "$self.wrapChatButtons($1)}" + } + } + ], + + wrapChatButtons(buttons: ReactNode[]) { + if (!Array.isArray(buttons) || buttons.length === 0) return buttons; + return ; + }, + + userAreaControlsClass(className: string) { + return classes(className, cl("user-area-controls")); + }, +}); diff --git a/src/equicordplugins/collapsibleUi/settings.ts b/src/equicordplugins/collapsibleUi/settings.ts new file mode 100644 index 000000000..dce2485b2 --- /dev/null +++ b/src/equicordplugins/collapsibleUi/settings.ts @@ -0,0 +1,70 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { definePluginSettings } from "@api/Settings"; +import { OptionType } from "@utils/types"; + +export const transitionMarkers = [0, 80, 120, 160, 200, 260, 320]; + +export const panelRegistry = { + channelList: { + id: "channelList", + classId: "channel-list", + label: "Channel List", + collapsedKey: "channelListCollapsed", + }, + membersList: { + id: "membersList", + classId: "members-list", + label: "Members List", + collapsedKey: "membersListCollapsed", + }, + chatButtons: { + id: "chatButtons", + classId: "chat-buttons", + label: "Message Buttons", + collapsedKey: "chatButtonsCollapsed", + }, + userArea: { + id: "userArea", + classId: "user-area", + label: "User Area", + collapsedKey: "userAreaCollapsed", + }, +} as const; + +export type PanelId = keyof typeof panelRegistry; + +export const toolbarPanelOrder = ["channelList", "membersList", "chatButtons", "userArea"] as const satisfies readonly PanelId[]; + +export const settings = definePluginSettings({ + transitionMs: { + type: OptionType.SLIDER, + description: "Panel transition speed in milliseconds.", + default: 160, + markers: transitionMarkers, + }, + channelListCollapsed: { + type: OptionType.BOOLEAN, + description: "Persist the channel list as collapsed.", + default: false, + }, + membersListCollapsed: { + type: OptionType.BOOLEAN, + description: "Persist the members list as collapsed.", + default: false, + }, + chatButtonsCollapsed: { + type: OptionType.BOOLEAN, + description: "Persist the message button row as collapsed.", + default: false, + }, + userAreaCollapsed: { + type: OptionType.BOOLEAN, + description: "Persist the user area as collapsed.", + default: false, + }, +}); diff --git a/src/equicordplugins/collapsibleUi/style.css b/src/equicordplugins/collapsibleUi/style.css new file mode 100644 index 000000000..0ff9d8cc3 --- /dev/null +++ b/src/equicordplugins/collapsibleUi/style.css @@ -0,0 +1,213 @@ +body:has(.vc-collapsible-ui-state) { + --vc-cui-chat-buttons-width: min(320px, 36vw); + --vc-cui-collapsed-size: 12px; + --vc-cui-hover-peek: 18px; + --vc-cui-hover-delay: 120ms; + --vc-cui-user-area-collapsed-width: 52px; + --vc-cui-transition: 160ms; + --vc-cui-ease: cubic-bezier(.2, 0, 0, 1); +} + +body:has(.vc-collapsible-ui-transition-0) { + --vc-cui-transition: 0ms; +} + +body:has(.vc-collapsible-ui-transition-80) { + --vc-cui-transition: 80ms; +} + +body:has(.vc-collapsible-ui-transition-120) { + --vc-cui-transition: 120ms; +} + +body:has(.vc-collapsible-ui-transition-160) { + --vc-cui-transition: 160ms; +} + +body:has(.vc-collapsible-ui-transition-200) { + --vc-cui-transition: 200ms; +} + +body:has(.vc-collapsible-ui-transition-260) { + --vc-cui-transition: 260ms; +} + +body:has(.vc-collapsible-ui-transition-320) { + --vc-cui-transition: 320ms; +} + +body:has(.vc-collapsible-ui-channel-list-collapsed):has([class*="sidebarList_"]:hover) [class*="sidebarList_"] { + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-channel-list-collapsed):has([class*="sidebarList_"]:hover) [class*="sidebarList_"] > * { + opacity: 1; + pointer-events: auto; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-channel-list-collapsed):not(:has([class*="sidebarList_"]:hover), :has([class*="sidebar_"] > [class*="panels_"]:hover)) [class*="sidebarList_"] { + width: var(--vc-cui-collapsed-size) !important; + inline-size: var(--vc-cui-collapsed-size) !important; + min-width: var(--vc-cui-collapsed-size) !important; + min-inline-size: var(--vc-cui-collapsed-size) !important; + max-width: var(--vc-cui-collapsed-size) !important; + max-inline-size: var(--vc-cui-collapsed-size) !important; + flex: 0 0 var(--vc-cui-collapsed-size) !important; + overflow: hidden !important; + transition: + width var(--vc-cui-transition) var(--vc-cui-ease), + inline-size var(--vc-cui-transition) var(--vc-cui-ease), + min-width var(--vc-cui-transition) var(--vc-cui-ease), + min-inline-size var(--vc-cui-transition) var(--vc-cui-ease), + max-width var(--vc-cui-transition) var(--vc-cui-ease), + max-inline-size var(--vc-cui-transition) var(--vc-cui-ease), + flex-basis var(--vc-cui-transition) var(--vc-cui-ease) !important; +} + +body:has(.vc-collapsible-ui-channel-list-collapsed):not(:has([class*="sidebarList_"]:hover), :has([class*="sidebar_"] > [class*="panels_"]:hover)) [class*="sidebarList_"] > * { + opacity: 0; + pointer-events: none; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); +} + +body:has(.vc-collapsible-ui-channel-list-collapsed):not(:has([class*="sidebar_"] > [class*="panels_"]:hover)) [class*="sidebar_"] > [class*="panels_"] { + width: var(--vc-cui-user-area-collapsed-width) !important; + inline-size: var(--vc-cui-user-area-collapsed-width) !important; + min-width: var(--vc-cui-user-area-collapsed-width) !important; + min-inline-size: var(--vc-cui-user-area-collapsed-width) !important; + max-width: var(--vc-cui-user-area-collapsed-width) !important; + max-inline-size: var(--vc-cui-user-area-collapsed-width) !important; + overflow: hidden !important; + transition: + width var(--vc-cui-transition) var(--vc-cui-ease), + inline-size var(--vc-cui-transition) var(--vc-cui-ease), + min-width var(--vc-cui-transition) var(--vc-cui-ease), + min-inline-size var(--vc-cui-transition) var(--vc-cui-ease), + max-width var(--vc-cui-transition) var(--vc-cui-ease), + max-inline-size var(--vc-cui-transition) var(--vc-cui-ease) !important; +} + +body:has(.vc-collapsible-ui-channel-list-collapsed):not(:has([class*="sidebar_"] > [class*="panels_"]:hover)) .vc-collapsible-ui-user-area-controls { + max-width: 0 !important; + min-width: 0 !important; + overflow: hidden !important; + opacity: 0; + pointer-events: none; + transition: + max-width var(--vc-cui-transition) var(--vc-cui-ease), + opacity var(--vc-cui-transition) var(--vc-cui-ease) !important; +} + +body:has(.vc-collapsible-ui-channel-list-collapsed):has([class*="sidebar_"] > [class*="panels_"]:hover) .vc-collapsible-ui-user-area-controls { + opacity: 1; + pointer-events: auto; +} + +body:has(.vc-collapsible-ui-members-list-collapsed) [class*="membersWrap"] { + overflow: hidden !important; + transition: + width var(--vc-cui-transition) var(--vc-cui-ease), + min-width var(--vc-cui-transition) var(--vc-cui-ease), + max-width var(--vc-cui-transition) var(--vc-cui-ease) !important; +} + +body:has(.vc-collapsible-ui-members-list-collapsed):has([class*="membersWrap"]:hover) [class*="membersWrap"], +body:has(.vc-collapsible-ui-members-list-collapsed):has([class*="membersWrap"]:focus-within) [class*="membersWrap"] { + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-members-list-collapsed):has([class*="membersWrap"]:hover) [class*="membersWrap"] > :where(*), +body:has(.vc-collapsible-ui-members-list-collapsed):has([class*="membersWrap"]:focus-within) [class*="membersWrap"] > :where(*) { + opacity: 1; + pointer-events: auto; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-members-list-collapsed):not(:has([class*="membersWrap"]:hover), :has([class*="membersWrap"]:focus-within)) [class*="membersWrap"] { + width: var(--vc-cui-collapsed-size) !important; + min-width: var(--vc-cui-collapsed-size) !important; + max-width: var(--vc-cui-collapsed-size) !important; +} + +body:has(.vc-collapsible-ui-members-list-collapsed):not(:has([class*="membersWrap"]:hover), :has([class*="membersWrap"]:focus-within)) [class*="membersWrap"] > :where(*) { + opacity: 0; + pointer-events: none; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); +} + +body:has(.vc-collapsible-ui-user-area-collapsed):has([class*="sidebar_"] > [class*="panels_"]:hover) [class*="sidebar_"] > [class*="panels_"] > :where(*), +body:has(.vc-collapsible-ui-user-area-collapsed):has([class*="sidebar_"] > [class*="panels_"]:focus-within) [class*="sidebar_"] > [class*="panels_"] > :where(*) { + opacity: 1; + pointer-events: auto; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); +} + +body:has(.vc-collapsible-ui-user-area-collapsed):not(:has([class*="sidebar_"] > [class*="panels_"]:hover), :has([class*="sidebar_"] > [class*="panels_"]:focus-within)) [class*="sidebar_"] > [class*="panels_"] { + height: var(--vc-cui-hover-peek) !important; + block-size: var(--vc-cui-hover-peek) !important; + min-height: var(--vc-cui-hover-peek) !important; + min-block-size: var(--vc-cui-hover-peek) !important; + max-height: var(--vc-cui-hover-peek) !important; + max-block-size: var(--vc-cui-hover-peek) !important; + overflow: hidden !important; + border-top-width: 0 !important; + padding-block: 0 !important; + transition: + height var(--vc-cui-transition) var(--vc-cui-ease), + block-size var(--vc-cui-transition) var(--vc-cui-ease), + min-height var(--vc-cui-transition) var(--vc-cui-ease), + min-block-size var(--vc-cui-transition) var(--vc-cui-ease), + max-height var(--vc-cui-transition) var(--vc-cui-ease), + max-block-size var(--vc-cui-transition) var(--vc-cui-ease), + padding var(--vc-cui-transition) var(--vc-cui-ease) !important; +} + +body:has(.vc-collapsible-ui-user-area-collapsed):not(:has([class*="sidebar_"] > [class*="panels_"]:hover), :has([class*="sidebar_"] > [class*="panels_"]:focus-within)) [class*="sidebar_"] > [class*="panels_"] > :where(*) { + opacity: 0; + pointer-events: none; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); +} + +.vc-collapsible-ui-chat-buttons { + display: flex; + align-items: center; + min-inline-size: 0; +} + +.vc-collapsible-ui-chat-buttons-collapsed { + min-inline-size: var(--vc-cui-hover-peek); +} + +.vc-collapsible-ui-chat-buttons-items { + display: flex; + align-items: center; + min-inline-size: 0; + max-inline-size: var(--vc-cui-chat-buttons-width); + overflow: hidden; + transition: + max-inline-size var(--vc-cui-transition) var(--vc-cui-ease), + opacity var(--vc-cui-transition) var(--vc-cui-ease), + margin var(--vc-cui-transition) var(--vc-cui-ease); +} + +.vc-collapsible-ui-chat-buttons-collapsed .vc-collapsible-ui-chat-buttons-items { + max-inline-size: 0; + opacity: 0; + pointer-events: none; +} + +.vc-collapsible-ui-chat-buttons-collapsed:hover .vc-collapsible-ui-chat-buttons-items { + max-inline-size: var(--vc-cui-chat-buttons-width); + opacity: 1; + pointer-events: auto; + transition-delay: var(--vc-cui-hover-delay); +} + +@media (prefers-reduced-motion: reduce) { + body:has(.vc-collapsible-ui-state) { + --vc-cui-transition: 0ms; + } +} diff --git a/src/equicordplugins/hideChatButtons/index.tsx b/src/equicordplugins/hideChatButtons/index.tsx index 9bdbfc98e..5f19fe715 100644 --- a/src/equicordplugins/hideChatButtons/index.tsx +++ b/src/equicordplugins/hideChatButtons/index.tsx @@ -74,7 +74,7 @@ function ButtonsInnerComponent({ buttons }: { buttons: ReactNode[]; }) { export default definePlugin({ name: "HideChatButtons", - description: "able to hide the chat buttons", + description: "Able to hide the chat buttons", settings: settings, authors: [EquicordDevs.iamme], patches: [ diff --git a/src/equicordplugins/messageLoggerEnhanced/db.ts b/src/equicordplugins/messageLoggerEnhanced/db.ts index 7afb56fa9..a9824e3dc 100644 --- a/src/equicordplugins/messageLoggerEnhanced/db.ts +++ b/src/equicordplugins/messageLoggerEnhanced/db.ts @@ -256,9 +256,11 @@ export async function deleteMessagesBulkIDB(message_ids: string[]) { message_ids.forEach(id => cachedMessages.delete(id)); } -export async function clearMessagesIDB() { - await db.clear("messages"); +export async function clearMessagesIDB(showToast = true) { cachedMessages.clear(); + await db.clear("messages"); + if (!showToast) return; + Toasts.show({ type: Toasts.Type.MESSAGE, message: "Cleared message log database and cache.", diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts index 66bc716ac..c1d41fbfe 100644 --- a/src/plugins/ircColors/index.ts +++ b/src/plugins/ircColors/index.ts @@ -21,8 +21,7 @@ import { getCustomColorString } from "@equicordplugins/customUserColors"; import { hash as h64 } from "@intrnl/xxhash64"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -import { useMemo } from "@webpack/common"; -import { UserStore } from "@webpack/common"; +import { useMemo, UserStore } from "@webpack/common"; // Calculate a CSS color string based on the user ID function calculateNameColorForUser(id?: string) { @@ -139,7 +138,7 @@ export default definePlugin({ } } } - + return dmColor; }, From faedaaf88ca931d299786ca5e214eb510f82e36e Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:35:33 -0400 Subject: [PATCH 018/247] use node 24 for workflows --- .github/workflows/build.yml | 4 ++-- .github/workflows/buildBranches.yml | 4 ++-- .github/workflows/nixosBuild.yml | 4 ++-- .github/workflows/publish.yml | 4 ++-- .github/workflows/reportBrokenPlugins.yml | 4 ++-- .github/workflows/test.yml | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 13af317c6..bd826a2eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,10 +23,10 @@ jobs: - uses: pnpm/action-setup@v3 - - name: Use Node.js 22 + - name: Use Node.js 24 uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/buildBranches.yml b/.github/workflows/buildBranches.yml index e79258ea6..46a3c4e73 100644 --- a/.github/workflows/buildBranches.yml +++ b/.github/workflows/buildBranches.yml @@ -38,11 +38,11 @@ jobs: - uses: pnpm/action-setup@v3 if: github.ref_name != 'bun' - - name: Use Node.js 22 + - name: Use Node.js 24 if: github.ref_name != 'bun' uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/nixosBuild.yml b/.github/workflows/nixosBuild.yml index 4c70f85ac..bd2c85c8a 100644 --- a/.github/workflows/nixosBuild.yml +++ b/.github/workflows/nixosBuild.yml @@ -20,10 +20,10 @@ jobs: - uses: pnpm/action-setup@v3 - - name: Use Node.js 22 + - name: Use Node.js 24 uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9c2523eab..694368312 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -62,11 +62,11 @@ jobs: if: steps.check.outputs.release == 'true' uses: pnpm/action-setup@v3 - - name: Use Node.js 22 + - name: Use Node.js 24 if: steps.check.outputs.release == 'true' uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/reportBrokenPlugins.yml b/.github/workflows/reportBrokenPlugins.yml index 9eec2e800..ef0225a1f 100644 --- a/.github/workflows/reportBrokenPlugins.yml +++ b/.github/workflows/reportBrokenPlugins.yml @@ -33,10 +33,10 @@ jobs: - uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json - - name: Use Node.js 22 + - name: Use Node.js 24 uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b6ae47688..21d7e8b6c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,10 +18,10 @@ jobs: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json - - name: Use Node.js 22 + - name: Use Node.js 24 uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies From 961670eb1e4069bf731d2715a2c661322244a297 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:38:18 -0400 Subject: [PATCH 019/247] Build Branches: Fix Bun Targeting --- .github/workflows/buildBranches.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/buildBranches.yml b/.github/workflows/buildBranches.yml index 46a3c4e73..f4e98b2ac 100644 --- a/.github/workflows/buildBranches.yml +++ b/.github/workflows/buildBranches.yml @@ -1,4 +1,4 @@ -name: Build +name: Build Branches on: push: @@ -65,9 +65,8 @@ jobs: pnpm generateVencordPluginJson dist/vencordplugins.json pnpm generateDevsList dist/devs.json - - uses: actions/checkout@v4 - if: github.ref_name == 'bun' - uses: oven-sh/setup-bun@v2 + if: github.ref_name == 'bun' with: bun-version: latest - name: Install dependencies From 9070e4ea39bfe77dcebfb0c457214515db03645a Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Tue, 14 Apr 2026 16:41:09 -0400 Subject: [PATCH 020/247] Fix Matches --- src/equicordplugins/betterActivities/index.tsx | 2 +- src/webpack/common/components.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/equicordplugins/betterActivities/index.tsx b/src/equicordplugins/betterActivities/index.tsx index bea8c1136..edb29a7c8 100644 --- a/src/equicordplugins/betterActivities/index.tsx +++ b/src/equicordplugins/betterActivities/index.tsx @@ -45,7 +45,7 @@ export default definePlugin({ // Show all activities in the user popout/sidebar find: /onOpenUserProfileModal:\i,onClose:\i\}\),null/, replacement: { - match: /((\i)=.{0,10}(\i)\.id\).*?,onInteraction:\i\}\),).{0,250}onClose:\i\}\)/, + match: /((\i)=.{0,10}(\i)\.id\).*?,onOpenUserProfileModal:\i\}\),).{0,250}onClose:\i\}\)/, replace: "$1$self.showAllActivitiesComponent({ activity: $2, user: $3 })" }, predicate: () => settings.store.userPopout diff --git a/src/webpack/common/components.ts b/src/webpack/common/components.ts index 2a1ca4efb..a5723c001 100644 --- a/src/webpack/common/components.ts +++ b/src/webpack/common/components.ts @@ -58,8 +58,8 @@ export const TooltipContainer = TooltipContainerComponent as never; export const TextInput = waitForComponent("TextInput", filters.componentByCode("#{intl::MAXIMUM_LENGTH_ERROR}", '"input"')); export const TextArea = waitForComponent("TextArea", filters.componentByCode("this.getPaddingRight()},id:")); -export const Select = waitForComponent("Select", filters.componentByCode('"Select"')); -export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('"SearchableSelect"')); +export const Select = waitForComponent("Select", filters.componentByCode('selectionMode:"single",onSelectionChange:', "isSelected:")); +export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('?"multiple":"single"')); export const Slider = waitForComponent("Slider", filters.componentByCode("markDash", "this.renderMark(")); export const Popout = waitForComponent("Popout", filters.componentByCode("ref:this.ref,", "renderPopout:this.renderPopout,")); export const Dialog = waitForComponent("Dialog", filters.componentByCode('role:"dialog",tabIndex:-1')); From 6451387b0667b17f033b652e10fbd846b038c7d7 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Tue, 14 Apr 2026 19:15:24 -0400 Subject: [PATCH 021/247] Fix Patches --- src/equicordplugins/dragify/index.tsx | 2 +- src/equicordplugins/questify/index.tsx | 2 +- src/equicordplugins/wallpaperFree/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/equicordplugins/dragify/index.tsx b/src/equicordplugins/dragify/index.tsx index ea819273e..d076ea7a7 100644 --- a/src/equicordplugins/dragify/index.tsx +++ b/src/equicordplugins/dragify/index.tsx @@ -155,7 +155,7 @@ export default definePlugin({ patches: [ // Voice user rows (voice channel sidebar list) { - find: '"system:click_outside","user:escape"', + find: ".VOICE_USER],shouldShow:", replacement: { match: /(?<=GuildChannelUserContextMenu.{0,150})"data-dnd-name":\i/, replace: "\"data-dragify-user\":!0,\"data-user-id\":arguments[0].user?.id,draggable:!0,onDragStart:e=>$self.onUserDragStart(e,arguments[0].user),$&" diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index 616f3ab16..cf0d1c4ab 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -1447,7 +1447,7 @@ export default definePlugin({ group: true, replacement: [ { - match: /(?<=\i\)&&"xs"===\i;)/, + match: /(?<=null&&"xs"===\i;)/, replace: "const shouldHideMembersListActivelyPlayingIcon=$self.shouldHideMembersListActivelyPlayingIcon();" }, { diff --git a/src/equicordplugins/wallpaperFree/index.tsx b/src/equicordplugins/wallpaperFree/index.tsx index 9545ef8e7..cfc8fe99e 100644 --- a/src/equicordplugins/wallpaperFree/index.tsx +++ b/src/equicordplugins/wallpaperFree/index.tsx @@ -39,7 +39,7 @@ export default definePlugin({ group: true, replacement: [ { - match: /return.{1,150},(?=keyboardModeEnabled)/, + match: /return.{1,200},(?=keyboardModeEnabled)/, replace: "const vcWallpaperFreeUrl=$self.WallpaperState(arguments[0].channel);$&vcWallpaperFreeUrl," }, { From 41a46cc06b503e701028af1b8873d321ad14ff99 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Tue, 14 Apr 2026 19:15:49 -0400 Subject: [PATCH 022/247] Remove NoDefaultHangStatus --- src/plugins/noDefaultHangStatus/README.md | 5 ----- src/plugins/noDefaultHangStatus/index.ts | 26 ----------------------- 2 files changed, 31 deletions(-) delete mode 100644 src/plugins/noDefaultHangStatus/README.md delete mode 100644 src/plugins/noDefaultHangStatus/index.ts diff --git a/src/plugins/noDefaultHangStatus/README.md b/src/plugins/noDefaultHangStatus/README.md deleted file mode 100644 index e6bc9f83a..000000000 --- a/src/plugins/noDefaultHangStatus/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# NoDefaultHangStatus - -Disable the default hang status when joining voice channels - -![Visualization](https://github.com/Vendicated/Vencord/assets/24937357/329a9742-236f-48f7-94ff-c3510eca505a) diff --git a/src/plugins/noDefaultHangStatus/index.ts b/src/plugins/noDefaultHangStatus/index.ts deleted file mode 100644 index 1301f0d25..000000000 --- a/src/plugins/noDefaultHangStatus/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2024 Vendicated and contributors - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { migrateSettingToPlugin } from "@api/Settings"; -import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; - -migrateSettingToPlugin("NoDefaultHangStatus", "EquicordHelper", "noDefaultHangStatus"); -export default definePlugin({ - name: "NoDefaultHangStatus", - description: "Disable the default hang status when joining voice channels", - authors: [Devs.D3SOX], - - patches: [ - { - find: ".CHILLING)", - replacement: { - match: /{enableHangStatus:(\i),/, - replace: "{_enableHangStatus:$1=false," - } - } - ] -}); From ecf6a37e1ec09d58cfd132d182c7f58e8dfba3b5 Mon Sep 17 00:00:00 2001 From: Key Date: Wed, 15 Apr 2026 06:41:36 +0100 Subject: [PATCH 023/247] FileUpload: add option to preserve original filename (#972) * feat(FileUpload): add option to preserve original filename * bleh --------- Co-authored-by: thororen <78185467+thororen1234@users.noreply.github.com> --- src/equicordplugins/fileUpload/settings.tsx | 13 +++++++++++++ src/equicordplugins/fileUpload/utils/upload.ts | 17 ++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/equicordplugins/fileUpload/settings.tsx b/src/equicordplugins/fileUpload/settings.tsx index b1aceb041..ab697c3fa 100644 --- a/src/equicordplugins/fileUpload/settings.tsx +++ b/src/equicordplugins/fileUpload/settings.tsx @@ -209,6 +209,12 @@ export const settings = definePluginSettings({ default: false, hidden: true }, + preserveOriginalFilename: { + type: OptionType.BOOLEAN, + description: "Preserve the original filename when uploading.", + default: true, + hidden: true + }, autoCopy: { type: OptionType.BOOLEAN, description: "Auto copy upload URL", @@ -508,6 +514,13 @@ export function SettingsComponent() { /> + + (store as { preserveOriginalFilename?: boolean; }).preserveOriginalFilename = v} + /> + + Date: Wed, 15 Apr 2026 08:58:42 -0400 Subject: [PATCH 024/247] ViewIcons: Fix Patch --- src/plugins/viewIcons/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/viewIcons/index.tsx b/src/plugins/viewIcons/index.tsx index 5dc2d0eda..573757bbf 100644 --- a/src/plugins/viewIcons/index.tsx +++ b/src/plugins/viewIcons/index.tsx @@ -196,7 +196,7 @@ export default definePlugin({ patches: [ // Avatar component used in User DMs "User Profile" popup in the right and User Profile Modal pfp { - find: "imageClassName:null!=", + find: ".AVATAR),{trackUserProfileAction:", replacement: { match: /avatarSrc:(\i),eventHandlers:(\i).+?"div",.{0,100}className:\i,/, replace: "$&style:{cursor:\"pointer\"},onClick:()=>{$self.openAvatar($1)},", From 38961f7844bb0b7cc012f9d35e1fc246d76bab55 Mon Sep 17 00:00:00 2001 From: thororen <78185467+thororen1234@users.noreply.github.com> Date: Wed, 15 Apr 2026 17:07:06 -0400 Subject: [PATCH 025/247] fix Select menus not showing (#4112) --- src/plugins/noDefaultHangStatus/README.md | 5 ----- src/plugins/noDefaultHangStatus/index.ts | 24 ----------------------- src/plugins/noMosaic/index.ts | 4 ++-- src/plugins/viewIcons/index.tsx | 2 +- src/webpack/common/components.ts | 4 ++-- 5 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 src/plugins/noDefaultHangStatus/README.md delete mode 100644 src/plugins/noDefaultHangStatus/index.ts diff --git a/src/plugins/noDefaultHangStatus/README.md b/src/plugins/noDefaultHangStatus/README.md deleted file mode 100644 index e6bc9f83a..000000000 --- a/src/plugins/noDefaultHangStatus/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# NoDefaultHangStatus - -Disable the default hang status when joining voice channels - -![Visualization](https://github.com/Vendicated/Vencord/assets/24937357/329a9742-236f-48f7-94ff-c3510eca505a) diff --git a/src/plugins/noDefaultHangStatus/index.ts b/src/plugins/noDefaultHangStatus/index.ts deleted file mode 100644 index 2245c9101..000000000 --- a/src/plugins/noDefaultHangStatus/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2024 Vendicated and contributors - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; - -export default definePlugin({ - name: "NoDefaultHangStatus", - description: "Disable the default hang status when joining voice channels", - authors: [Devs.D3SOX], - - patches: [ - { - find: ".CHILLING)", - replacement: { - match: /{enableHangStatus:(\i),/, - replace: "{_enableHangStatus:$1=false," - } - } - ] -}); diff --git a/src/plugins/noMosaic/index.ts b/src/plugins/noMosaic/index.ts index 4ec64cc39..c52e19a6b 100644 --- a/src/plugins/noMosaic/index.ts +++ b/src/plugins/noMosaic/index.ts @@ -29,8 +29,8 @@ export default definePlugin({ { find: '"PLAINTEXT_PREVIEW":"OTHER"', replacement: { - match: /=>"IMAGE"===\i\|\|"VIDEO"===\i(?:\|\|("VISUAL_PLACEHOLDER"===\i))?;/, - replace: (_, visualPlaceholderPred) => visualPlaceholderPred != null ? `=>${visualPlaceholderPred};` : "=>false;" + match: /return"IMAGE"===\i\|\|"VIDEO"===\i(?:\|\|("VISUAL_PLACEHOLDER"===\i)\|\|\i&&"CLIP"===\i)?/, + replace: (_, visualPlaceholderPred) => visualPlaceholderPred != null ? `return ${visualPlaceholderPred}` : "return false" } }, { diff --git a/src/plugins/viewIcons/index.tsx b/src/plugins/viewIcons/index.tsx index 0e9c6b7f6..17130e191 100644 --- a/src/plugins/viewIcons/index.tsx +++ b/src/plugins/viewIcons/index.tsx @@ -197,7 +197,7 @@ export default definePlugin({ patches: [ // Avatar component used in User DMs "User Profile" popup in the right and User Profile Modal pfp { - find: "imageClassName:null!=", + find: ".AVATAR),{trackUserProfileAction:", replacement: { match: /avatarSrc:(\i),eventHandlers:(\i).+?"div",.{0,100}className:\i,/, replace: "$&style:{cursor:\"pointer\"},onClick:()=>{$self.openAvatar($1)},", diff --git a/src/webpack/common/components.ts b/src/webpack/common/components.ts index 2a1ca4efb..98d453abf 100644 --- a/src/webpack/common/components.ts +++ b/src/webpack/common/components.ts @@ -58,8 +58,8 @@ export const TooltipContainer = TooltipContainerComponent as never; export const TextInput = waitForComponent("TextInput", filters.componentByCode("#{intl::MAXIMUM_LENGTH_ERROR}", '"input"')); export const TextArea = waitForComponent("TextArea", filters.componentByCode("this.getPaddingRight()},id:")); -export const Select = waitForComponent("Select", filters.componentByCode('"Select"')); -export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('"SearchableSelect"')); +export const Select = waitForComponent("Select", filters.componentByCode('selectionMode:"single",onSelectionChange:', "isSelected:")); +export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('?"multiple":"single",required:')); export const Slider = waitForComponent("Slider", filters.componentByCode("markDash", "this.renderMark(")); export const Popout = waitForComponent("Popout", filters.componentByCode("ref:this.ref,", "renderPopout:this.renderPopout,")); export const Dialog = waitForComponent("Dialog", filters.componentByCode('role:"dialog",tabIndex:-1')); From 541e50dcf45eefee104916dc64805439cb24a5f0 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Wed, 15 Apr 2026 23:09:10 +0200 Subject: [PATCH 026/247] 1.14.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 088ffe3ee..42821bdc0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vencord", "private": "true", - "version": "1.14.6", + "version": "1.14.7", "description": "The cutest Discord client mod", "homepage": "https://github.com/Vendicated/Vencord#readme", "bugs": { From a25f0fadfb6cbb58fc7da15612a63a37ce42a0c6 Mon Sep 17 00:00:00 2001 From: MasterPepe <56143265+Accentaro@users.noreply.github.com> Date: Thu, 16 Apr 2026 01:09:00 +0100 Subject: [PATCH 027/247] Fix HideChatButtons interop with CollapsibleUI (#975) Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com> Co-authored-by: creations --- src/equicordplugins/hideChatButtons/index.tsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/equicordplugins/hideChatButtons/index.tsx b/src/equicordplugins/hideChatButtons/index.tsx index 5f19fe715..2a942ecd5 100644 --- a/src/equicordplugins/hideChatButtons/index.tsx +++ b/src/equicordplugins/hideChatButtons/index.tsx @@ -8,7 +8,7 @@ import { ChatBarButton } from "@api/ChatButtons"; import { definePluginSettings } from "@api/Settings"; import { EquicordDevs } from "@utils/constants"; import definePlugin, { OptionType, StartAt } from "@utils/types"; -import { React, useEffect, useState } from "@webpack/common"; +import { useEffect, useState } from "@webpack/common"; import type { MouseEventHandler, ReactNode } from "react"; let hidechatbuttonsopen: boolean | undefined; @@ -50,8 +50,14 @@ function HideToggleButton(props: { open: boolean | undefined, onClick: MouseEven ); } -function ButtonsInnerComponent({ buttons }: { buttons: ReactNode[]; }) { - if (!buttons || buttons.every(x => (x as any)?.props?.disabled === true)) return null; +function ButtonsInnerComponent({ buttons }: { buttons: ReactNode; }) { + const buttonItems = Array.isArray(buttons) + ? buttons + : buttons == null + ? [] + : [buttons]; + + if (buttonItems.length === 0 || buttonItems.every(button => (button as any)?.props?.disabled === true)) return null; const [open, setOpen] = useState(hidechatbuttonsopen); @@ -66,7 +72,7 @@ function ButtonsInnerComponent({ buttons }: { buttons: ReactNode[]; }) { overflowX: "auto", overflowY: "hidden" }}> - {open && buttons.map((b, i) => {b})} + {open && buttons} setOpen(!open)} open={open} /> ); @@ -87,7 +93,7 @@ export default definePlugin({ } ], startAt: StartAt.Init, - buttonsInner(buttons: ReactNode[]) { + buttonsInner(buttons: ReactNode) { return ; }, start() { From 610c3719c80004c5641be20bcb2add90a0c48ad1 Mon Sep 17 00:00:00 2001 From: V Date: Thu, 16 Apr 2026 03:42:59 +0200 Subject: [PATCH 028/247] Introduce plugin tags for easier searching (#3553) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: sadan4 <117494111+sadan4@users.noreply.github.com> --- scripts/generatePluginList.ts | 11 ++- src/components/CheckedTextInput.tsx | 12 +-- .../settings/tabs/plugins/PluginModal.css | 22 +++++- .../settings/tabs/plugins/PluginModal.tsx | 22 ++++-- .../settings/tabs/plugins/index.tsx | 74 ++++++++++++------- .../settings/tabs/plugins/styles.css | 7 +- .../settings/tabs/sync/CloudTab.tsx | 2 +- .../accountPanelServerProfile/index.tsx | 1 + src/plugins/alwaysAnimate/index.ts | 1 + src/plugins/alwaysExpandRoles/index.ts | 1 + src/plugins/alwaysTrust/index.ts | 1 + src/plugins/anonymiseFileNames/index.tsx | 1 + src/plugins/appleMusic.desktop/index.tsx | 1 + src/plugins/arRPC.web/index.tsx | 1 + .../index.ts | 1 + src/plugins/betterFolders/index.tsx | 2 +- src/plugins/betterGifAltText/index.ts | 1 + src/plugins/betterGifPicker/index.ts | 1 + src/plugins/betterNotes/index.tsx | 1 + src/plugins/betterRoleContext/index.tsx | 1 + src/plugins/betterRoleDot/index.ts | 1 + src/plugins/betterSessions/index.tsx | 2 +- src/plugins/betterSettings/index.tsx | 1 + src/plugins/betterUploadButton/index.ts | 1 + src/plugins/biggerStreamPreview/index.tsx | 1 + src/plugins/blurNsfw/index.ts | 1 + src/plugins/callTimer/index.tsx | 1 + src/plugins/characterCounter/index.tsx | 1 + src/plugins/clearURLs/index.ts | 1 + src/plugins/clientTheme/index.tsx | 1 + src/plugins/colorSighted/index.ts | 1 + src/plugins/consoleJanitor/index.tsx | 1 + src/plugins/consoleShortcuts/index.ts | 1 + src/plugins/copyEmojiMarkdown/index.tsx | 1 + src/plugins/copyFileContents/index.tsx | 1 + src/plugins/copyStickerLinks/index.tsx | 1 + src/plugins/copyUserURLs/index.tsx | 1 + src/plugins/crashHandler/index.ts | 2 +- src/plugins/ctrlEnterSend/index.ts | 1 + src/plugins/customCommands/index.ts | 3 +- src/plugins/customIdle/index.ts | 1 + src/plugins/customRPC/index.tsx | 1 + src/plugins/dearrow/index.tsx | 1 + src/plugins/decor/index.tsx | 1 + src/plugins/devCompanion.dev/index.tsx | 1 + src/plugins/disableCallIdle/index.ts | 1 + src/plugins/dontRoundMyTimestamps/index.ts | 1 + src/plugins/experiments/index.tsx | 1 + src/plugins/expressionCloner/index.tsx | 5 +- src/plugins/f8break/index.ts | 1 + src/plugins/fakeNitro/index.tsx | 1 + src/plugins/fakeProfileThemes/index.tsx | 1 + src/plugins/favEmojiFirst/index.ts | 1 + src/plugins/favGifSearch/index.tsx | 1 + src/plugins/fixCodeblockGap/index.ts | 1 + src/plugins/fixImagesQuality/index.tsx | 1 + .../fixSpotifyEmbeds.desktop/index.tsx | 1 + src/plugins/fixYoutubeEmbeds.desktop/index.ts | 1 + src/plugins/forceOwnerCrown/index.ts | 1 + src/plugins/friendInvites/index.ts | 1 + src/plugins/friendsSince/index.tsx | 1 + src/plugins/fullSearchContext/index.tsx | 1 + src/plugins/fullUserInChatbox/index.tsx | 1 + src/plugins/gameActivityToggle/index.tsx | 1 + src/plugins/gifPaste/index.ts | 1 + src/plugins/greetStickerPicker/index.tsx | 1 + src/plugins/hideAttachments/index.tsx | 1 + src/plugins/iLoveSpam/index.ts | 1 + src/plugins/ignoreActivities/index.tsx | 1 + src/plugins/imageFilename/index.ts | 1 + src/plugins/imageLink/index.ts | 1 + src/plugins/imageZoom/index.tsx | 3 +- src/plugins/implicitRelationships/index.ts | 1 + src/plugins/ircColors/index.ts | 1 + src/plugins/keepCurrentChannel/index.ts | 1 + src/plugins/lastfmRichPresence/index.tsx | 1 + src/plugins/loadingQuotes/index.ts | 1 + src/plugins/memberCount/index.tsx | 1 + src/plugins/mentionAvatars/index.tsx | 1 + src/plugins/messageClickActions/index.ts | 1 + src/plugins/messageLatency/index.tsx | 1 + src/plugins/messageLinkEmbeds/index.tsx | 1 + src/plugins/messageLogger/index.tsx | 1 + src/plugins/moreQuickReactions/index.ts | 1 + src/plugins/mutualGroupDMs/index.tsx | 1 + src/plugins/newGuildSettings/index.tsx | 3 +- src/plugins/noBlockedMessages/index.ts | 1 + src/plugins/noDeepLinks.web/index.ts | 1 + src/plugins/noDevtoolsWarning/index.ts | 1 + src/plugins/noF1/index.ts | 1 + src/plugins/noMaskedUrlPaste/index.ts | 1 + src/plugins/noMosaic/index.ts | 3 +- src/plugins/noOnboardingDelay/index.ts | 1 + src/plugins/noPendingCount/index.ts | 1 + src/plugins/noProfileThemes/index.ts | 1 + src/plugins/noReplyMention/index.tsx | 1 + src/plugins/noServerEmojis/index.ts | 1 + .../noSystemBadge.discordDesktop/index.ts | 1 + src/plugins/noTypingAnimation/index.ts | 1 + src/plugins/noUnblockToJump/index.ts | 1 + src/plugins/notificationVolume/index.ts | 1 + src/plugins/onePingPerDM/index.ts | 1 + src/plugins/oneko/index.ts | 1 + src/plugins/openInApp/index.ts | 1 + src/plugins/overrideForumDefaults/index.tsx | 1 + src/plugins/pauseInvitesForever/index.tsx | 3 +- src/plugins/permissionFreeWill/index.ts | 1 + src/plugins/permissionsViewer/index.tsx | 1 + src/plugins/petpet/index.ts | 1 + src/plugins/pictureInPicture/index.tsx | 1 + src/plugins/pinDms/index.tsx | 1 + src/plugins/plainFolderIcon/index.ts | 1 + src/plugins/platformIndicators/index.tsx | 1 + src/plugins/previewMessage/index.tsx | 1 + src/plugins/quickMention/index.tsx | 1 + src/plugins/quickReply/index.ts | 1 + src/plugins/reactErrorDecoder/index.ts | 3 +- .../readAllNotificationsButton/index.tsx | 1 + src/plugins/relationshipNotifier/index.ts | 1 + src/plugins/replaceGoogleSearch/index.tsx | 1 + src/plugins/replyTimestamp/index.tsx | 1 + src/plugins/revealAllSpoilers/index.ts | 2 +- src/plugins/reverseImageSearch/index.tsx | 3 +- src/plugins/reviewDB/index.tsx | 1 + src/plugins/roleColorEverywhere/index.tsx | 1 + src/plugins/secretRingTone/index.ts | 1 + src/plugins/seeSummaries/index.tsx | 1 + src/plugins/sendTimestamps/index.tsx | 1 + src/plugins/serverInfo/index.tsx | 3 +- src/plugins/serverListIndicators/index.tsx | 1 + src/plugins/shikiCodeblocks.desktop/index.ts | 1 + src/plugins/showAllMessageButtons/index.ts | 1 + src/plugins/showConnections/index.tsx | 1 + src/plugins/showHiddenChannels/index.tsx | 1 + src/plugins/showHiddenThings/index.ts | 3 +- src/plugins/showMeYourName/index.tsx | 1 + src/plugins/showTimeoutDuration/index.tsx | 1 + src/plugins/silentMessageToggle/index.tsx | 1 + src/plugins/silentTyping/index.tsx | 1 + src/plugins/sortFriendRequests/index.tsx | 1 + src/plugins/spotifyControls/index.tsx | 1 + src/plugins/spotifyCrack/index.ts | 1 + src/plugins/spotifyShareCommands/index.ts | 1 + src/plugins/startupTimings/index.tsx | 1 + src/plugins/stickerPaste/index.ts | 1 + src/plugins/streamerModeOnStream/index.ts | 1 + src/plugins/superReactionTweaks/index.ts | 1 + src/plugins/textReplace/index.tsx | 1 + src/plugins/themeAttributes/index.ts | 1 + src/plugins/translate/index.tsx | 1 + src/plugins/typingIndicator/index.tsx | 1 + src/plugins/typingTweaks/index.tsx | 1 + src/plugins/unindent/index.ts | 1 + src/plugins/unlockedAvatarZoom/index.ts | 1 + src/plugins/unsuppressEmbeds/index.tsx | 1 + src/plugins/userMessagesPronouns/index.ts | 1 + src/plugins/userVoiceShow/index.tsx | 1 + src/plugins/usrbg/index.tsx | 1 + src/plugins/validReply/index.ts | 1 + src/plugins/validUser/index.tsx | 3 +- src/plugins/vcDoubleClick/index.ts | 1 + src/plugins/vcNarrator/index.tsx | 1 + src/plugins/vencordToolbox/index.tsx | 1 + src/plugins/viewIcons/index.tsx | 3 +- src/plugins/viewRaw/index.tsx | 1 + src/plugins/voiceDownload/index.tsx | 1 + src/plugins/voiceMessages/index.tsx | 1 + src/plugins/volumeBooster/index.ts | 1 + src/plugins/webContextMenus.web/index.ts | 1 + src/plugins/webKeybinds.web/index.ts | 1 + src/plugins/webScreenShareFixes.web/index.ts | 1 + src/plugins/whoReacted/index.tsx | 1 + src/plugins/xsOverlay/index.tsx | 3 +- src/plugins/youtubeAdblock.desktop/index.ts | 1 + src/utils/types.ts | 31 +++++++- 175 files changed, 313 insertions(+), 67 deletions(-) diff --git a/scripts/generatePluginList.ts b/scripts/generatePluginList.ts index 2f7ac7314..92bcba75e 100644 --- a/scripts/generatePluginList.ts +++ b/scripts/generatePluginList.ts @@ -33,6 +33,7 @@ interface PluginData { name: string; description: string; tags: string[]; + searchTerms: string[]; authors: Dev[]; dependencies: string[]; hasPatches: boolean; @@ -111,7 +112,8 @@ async function parseFile(fileName: string) { hasCommands: false, enabledByDefault: false, required: false, - tags: [] as string[] + tags: [] as string[], + searchTerms: [] as string[], } as PluginData; for (const prop of pluginObj.properties) { @@ -140,9 +142,10 @@ async function parseFile(fileName: string) { }); break; case "tags": - if (!isArrayLiteralExpression(value)) throw fail("tags is not an array literal"); - data.tags = value.elements.map(e => { - if (!isStringLiteral(e)) throw fail("tags array contains non-string literals"); + case "searchTerms": + if (!isArrayLiteralExpression(value)) throw fail(`${key} is not an array literal`); + data[key] = value.elements.map(e => { + if (!isStringLiteral(e)) throw fail(`${key} array contains non-string literals`); return e.text; }); break; diff --git a/src/components/CheckedTextInput.tsx b/src/components/CheckedTextInput.tsx index 8d37a5609..522540de4 100644 --- a/src/components/CheckedTextInput.tsx +++ b/src/components/CheckedTextInput.tsx @@ -16,13 +16,13 @@ * along with this program. If not, see . */ -import { React, TextInput } from "@webpack/common"; +import { React, TextInput, useState } from "@webpack/common"; interface TextInputProps { /** * WARNING: Changing this between renders will have no effect! */ - value: string; + initialValue: string; /** * This will only be called if the new value passed validate() */ @@ -39,13 +39,15 @@ interface TextInputProps { * A very simple wrapper around Discord's TextInput that validates input and shows * the user an error message and only calls your onChange when the input is valid */ -export function CheckedTextInput({ value: initialValue, onChange, validate }: TextInputProps) { - const [value, setValue] = React.useState(initialValue); - const [error, setError] = React.useState(); +export function CheckedTextInput({ initialValue, onChange, validate }: TextInputProps) { + const [value, setValue] = useState(initialValue); + const [error, setError] = useState(); function handleChange(v: string) { setValue(v); + const res = validate(v); + if (res === true) { setError(void 0); onChange(v); diff --git a/src/components/settings/tabs/plugins/PluginModal.css b/src/components/settings/tabs/plugins/PluginModal.css index a4a84391f..085b2bab6 100644 --- a/src/components/settings/tabs/plugins/PluginModal.css +++ b/src/components/settings/tabs/plugins/PluginModal.css @@ -3,9 +3,25 @@ } .vc-plugin-modal-info { - align-items: center; + display: flex; + gap: 1em; + justify-content: space-between; + align-items: start; } -.vc-plugin-modal-description { - flex-grow: 1; +.vc-plugin-modal-tags { + display: flex; + flex-wrap: wrap; + gap: 4px; + margin-block: 8px 16px; +} + +.vc-plugin-modal-tag { + align-items: center; + border: 1px solid var(--border-normal); + border-radius: 9999px; + display: flex; + justify-content: center; + padding: 6px 12px; + color: var(--text-default); } \ No newline at end of file diff --git a/src/components/settings/tabs/plugins/PluginModal.tsx b/src/components/settings/tabs/plugins/PluginModal.tsx index 05dbb4134..c67e39647 100644 --- a/src/components/settings/tabs/plugins/PluginModal.tsx +++ b/src/components/settings/tabs/plugins/PluginModal.tsx @@ -21,7 +21,6 @@ import "./PluginModal.css"; import { generateId } from "@api/Commands"; import { useSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; -import { Flex } from "@components/Flex"; import { debounce } from "@shared/debounce"; import { gitRemote } from "@shared/vencordUserAgent"; import { classNameFactory } from "@utils/css"; @@ -29,7 +28,7 @@ import { proxyLazy } from "@utils/lazy"; import { Margins } from "@utils/margins"; import { classes, isObjectEmpty } from "@utils/misc"; import { ModalCloseButton, ModalContent, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; -import { OptionType, Plugin } from "@utils/types"; +import { OptionType, Plugin, PluginTag } from "@utils/types"; import { User } from "@vencord/discord-types"; import { findCssClassesLazy } from "@webpack"; import { Clickable, FluxDispatcher, Forms, React, Text, Tooltip, useEffect, useMemo, UserStore, UserSummaryItem, UserUtils, useState } from "@webpack/common"; @@ -68,6 +67,16 @@ function makeDummyUser(user: { username: string; id?: string; avatar?: string; } return newUser; } +function PluginTags({ tags }: { tags: PluginTag[]; }) { + return ( +
+ {tags.map(tag => ( +
{tag}
+ ))} +
+ ); +} + export default function PluginModal({ plugin, onRestartNeeded, onClose, transitionState }: PluginModalProps) { const pluginSettings = useSettings([`plugins.${plugin.name}.*`]).plugins[plugin.name]; const hasSettings = Boolean(pluginSettings && plugin.options && !isObjectEmpty(plugin.options)); @@ -161,8 +170,11 @@ export default function PluginModal({ plugin, onRestartNeeded, onClose, transiti
- - {plugin.description} +
+
+ {plugin.description} + {!!plugin.tags?.length && } +
{!pluginMeta.userPlugin && (
)} - +
Authors
diff --git a/src/components/settings/tabs/plugins/index.tsx b/src/components/settings/tabs/plugins/index.tsx index 92fd34541..1ce0d862d 100644 --- a/src/components/settings/tabs/plugins/index.tsx +++ b/src/components/settings/tabs/plugins/index.tsx @@ -34,7 +34,8 @@ import { Logger } from "@utils/Logger"; import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; import { useAwaiter, useCleanupEffect } from "@utils/react"; -import { Alerts, Button, lodash, Parser, React, Select, TextInput, Tooltip, useMemo, useState } from "@webpack/common"; +import { PluginTag, PluginTags } from "@utils/types"; +import { Alerts, Button, lodash, Parser, React, SearchableSelect, Select, TextInput, Tooltip, useMemo, useRef, useState } from "@webpack/common"; import { JSX } from "react"; import Plugins, { ExcludedPlugins, PluginMeta } from "~plugins"; @@ -115,7 +116,8 @@ function ExcludedPluginsList({ search }: { search: string; }) { function PluginSettings() { const settings = useSettings(); - const changes = useMemo(() => new ChangeList(), []); + const changeRef = useRef>(null); + const changes = changeRef.current ??= new ChangeList(); useCleanupEffect(() => { if (changes.hasChanges) @@ -159,14 +161,13 @@ function PluginSettings() { const hasUserPlugins = useMemo(() => !IS_STANDALONE && Object.values(PluginMeta).some(m => m.userPlugin), []); - const [searchValue, setSearchValue] = useState({ value: "", status: SearchStatus.ALL }); + const [searchValue, setSearchValue] = useState({ value: "", tags: [] as PluginTag[], status: SearchStatus.ALL }); const search = searchValue.value.toLowerCase(); const onSearch = (query: string) => setSearchValue(prev => ({ ...prev, value: query })); - const onStatusChange = (status: SearchStatus) => setSearchValue(prev => ({ ...prev, status })); const pluginFilter = (plugin: typeof Plugins[keyof typeof Plugins]) => { - const { status } = searchValue; + const { status, tags } = searchValue; const enabled = isPluginEnabled(plugin.name); switch (status) { @@ -187,12 +188,14 @@ function PluginSettings() { break; } + if (tags.length && tags.some(t => !plugin.tags?.includes(t))) return false; + if (!search.length) return true; return ( plugin.name.toLowerCase().includes(search) || plugin.description.toLowerCase().includes(search) || - plugin.tags?.some(t => t.toLowerCase().includes(search)) + plugin.searchTerms?.some(t => t.toLowerCase().includes(search)) ); }; @@ -267,29 +270,43 @@ function PluginSettings() { Filters -
- - - -
- - setSearchValue(prev => ({ ...prev, status }))} + isSelected={v => v === searchValue.status} + closeOnSelect={true} + placeholder="Filter by Type" + /> + ({ label: tag, value: tag }))} + value={searchValue.tags} + onChange={tags => setSearchValue(prev => ({ ...prev, tags }))} + closeOnSelect={false} + placeholder="Filter by Tags" + multi + />
-
+
Plugins @@ -311,6 +328,7 @@ function PluginSettings() { Required Plugins +
{requiredPlugins.length ? requiredPlugins diff --git a/src/components/settings/tabs/plugins/styles.css b/src/components/settings/tabs/plugins/styles.css index 2685c6b1f..3241af6f5 100644 --- a/src/components/settings/tabs/plugins/styles.css +++ b/src/components/settings/tabs/plugins/styles.css @@ -45,7 +45,12 @@ display: grid; height: 40px; gap: 10px; - grid-template-columns: 1fr 150px; + grid-template-columns: 1fr 1fr; + align-items: center; +} + +.vc-plugins-filter-control { + height: 40px; } .vc-addon-badge { diff --git a/src/components/settings/tabs/sync/CloudTab.tsx b/src/components/settings/tabs/sync/CloudTab.tsx index 0f01dbd13..0a18fb91d 100644 --- a/src/components/settings/tabs/sync/CloudTab.tsx +++ b/src/components/settings/tabs/sync/CloudTab.tsx @@ -97,7 +97,7 @@ function CloudSetupSection() { { cloud.url = v; cloud.authenticated = false; diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index f7a5b5ea4..311988dea 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -62,6 +62,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AccountPanelServerProfile", description: "Right click your account panel in the bottom left to view your profile in the current server", + tags: ["Appearance", "Servers"], authors: [Devs.Nuckyz, Devs.relitrix], settings, diff --git a/src/plugins/alwaysAnimate/index.ts b/src/plugins/alwaysAnimate/index.ts index 8a057c981..d61dd0206 100644 --- a/src/plugins/alwaysAnimate/index.ts +++ b/src/plugins/alwaysAnimate/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "AlwaysAnimate", description: "Animates anything that can be animated", + tags: ["Appearance", "Fun"], authors: [Devs.FieryFlames], patches: [ diff --git a/src/plugins/alwaysExpandRoles/index.ts b/src/plugins/alwaysExpandRoles/index.ts index 2fff8a8de..c7899ecf0 100644 --- a/src/plugins/alwaysExpandRoles/index.ts +++ b/src/plugins/alwaysExpandRoles/index.ts @@ -24,6 +24,7 @@ migratePluginSettings("AlwaysExpandRoles", "ShowAllRoles"); export default definePlugin({ name: "AlwaysExpandRoles", description: "Always expands the role list in profile popouts", + tags: ["Appearance", "Roles"], authors: [Devs.surgedevs], patches: [ { diff --git a/src/plugins/alwaysTrust/index.ts b/src/plugins/alwaysTrust/index.ts index 0c89ae116..5d539c98c 100644 --- a/src/plugins/alwaysTrust/index.ts +++ b/src/plugins/alwaysTrust/index.ts @@ -38,6 +38,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AlwaysTrust", description: "Removes the annoying untrusted domain and suspicious file popup", + tags: ["Utility"], authors: [Devs.zt, Devs.Trwy], patches: [ { diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx index 6b4a5a9ab..4256616ae 100644 --- a/src/plugins/anonymiseFileNames/index.tsx +++ b/src/plugins/anonymiseFileNames/index.tsx @@ -68,6 +68,7 @@ export default definePlugin({ name: "AnonymiseFileNames", authors: [Devs.fawn], description: "Anonymise uploaded file names", + tags: ["Privacy", "Utility"], settings, patches: [ diff --git a/src/plugins/appleMusic.desktop/index.tsx b/src/plugins/appleMusic.desktop/index.tsx index f6fc9da93..d1b32c029 100644 --- a/src/plugins/appleMusic.desktop/index.tsx +++ b/src/plugins/appleMusic.desktop/index.tsx @@ -154,6 +154,7 @@ function getImageAsset(type: AssetImageType, data: TrackData) { export default definePlugin({ name: "AppleMusicRichPresence", description: "Discord rich presence for your Apple Music!", + tags: ["Activity", "Media"], authors: [Devs.RyanCaoDev], hidden: !IS_MAC, reporterTestable: ReporterTestable.None, diff --git a/src/plugins/arRPC.web/index.tsx b/src/plugins/arRPC.web/index.tsx index 538bfe314..7d54ddc36 100644 --- a/src/plugins/arRPC.web/index.tsx +++ b/src/plugins/arRPC.web/index.tsx @@ -40,6 +40,7 @@ let ws: WebSocket; export default definePlugin({ name: "WebRichPresence (arRPC)", description: "Client plugin for arRPC to enable RPC on Discord Web (experimental)", + tags: ["Activity", "Utility"], authors: [Devs.Ducko], reporterTestable: ReporterTestable.None, hidden: IS_VESKTOP || "legcord" in window, diff --git a/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts b/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts index faf238cd8..5a2026689 100644 --- a/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts +++ b/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts @@ -42,6 +42,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AutoDNDWhilePlaying", description: "Automatically updates your online status (online, idle, dnd) when launching games", + tags: ["Activity", "Utility"], authors: [Devs.thororen], settings, flux: { diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx index ad23c1e3d..8878b8d80 100644 --- a/src/plugins/betterFolders/index.tsx +++ b/src/plugins/betterFolders/index.tsx @@ -138,7 +138,7 @@ export default definePlugin({ name: "BetterFolders", description: "Shows server folders on dedicated sidebar and adds folder related improvements", authors: [Devs.juby, Devs.AutumnVN, Devs.Nuckyz], - + tags: ["Organisation", "Servers", "Appearance"], settings, patches: [ diff --git a/src/plugins/betterGifAltText/index.ts b/src/plugins/betterGifAltText/index.ts index 0a381e547..3b95f912e 100644 --- a/src/plugins/betterGifAltText/index.ts +++ b/src/plugins/betterGifAltText/index.ts @@ -24,6 +24,7 @@ export default definePlugin({ authors: [Devs.Ven], description: "Change GIF alt text from simply being 'GIF' to containing the gif tags / filename", + tags: ["Media", "Accessibility", "Customisation"], patches: [ { find: ".modalContext})};", diff --git a/src/plugins/betterGifPicker/index.ts b/src/plugins/betterGifPicker/index.ts index 2562a7208..aa9b09687 100644 --- a/src/plugins/betterGifPicker/index.ts +++ b/src/plugins/betterGifPicker/index.ts @@ -11,6 +11,7 @@ export default definePlugin({ name: "BetterGifPicker", description: "Makes the gif picker open the favourite category by default", authors: [Devs.Samwich], + tags: ["Emotes", "Customisation"], patches: [ { find: "renderHeaderContent(){", diff --git a/src/plugins/betterNotes/index.tsx b/src/plugins/betterNotes/index.tsx index 68aa70c61..465010cff 100644 --- a/src/plugins/betterNotes/index.tsx +++ b/src/plugins/betterNotes/index.tsx @@ -40,6 +40,7 @@ export default definePlugin({ name: "BetterNotesBox", description: "Hide notes or disable spellcheck (Configure in settings!!)", authors: [Devs.Ven], + tags: ["Customisation", "Utility"], settings, patches: [ diff --git a/src/plugins/betterRoleContext/index.tsx b/src/plugins/betterRoleContext/index.tsx index f9eae586d..61343418e 100644 --- a/src/plugins/betterRoleContext/index.tsx +++ b/src/plugins/betterRoleContext/index.tsx @@ -65,6 +65,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterRoleContext", description: "Adds options to copy role color / edit role / view role icon when right clicking roles in the user profile", + tags: ["Roles", "Appearance"], authors: [Devs.Ven, Devs.goodbee], dependencies: ["UserSettingsAPI"], diff --git a/src/plugins/betterRoleDot/index.ts b/src/plugins/betterRoleDot/index.ts index d2c8d3f31..03760ab68 100644 --- a/src/plugins/betterRoleDot/index.ts +++ b/src/plugins/betterRoleDot/index.ts @@ -26,6 +26,7 @@ export default definePlugin({ authors: [Devs.Ven, Devs.AutumnVN], description: "Copy role colour on RoleDot (accessibility setting) click. Also allows using both RoleDot and coloured names simultaneously", + tags: ["Roles", "Appearance"], patches: [ { diff --git a/src/plugins/betterSessions/index.tsx b/src/plugins/betterSessions/index.tsx index a0b5291e7..bfe1f59cf 100644 --- a/src/plugins/betterSessions/index.tsx +++ b/src/plugins/betterSessions/index.tsx @@ -56,7 +56,7 @@ export default definePlugin({ name: "BetterSessions", description: "Enhances the sessions (devices) menu. Allows you to view exact timestamps, give each session a custom name, and receive notifications about new sessions.", authors: [Devs.amia], - + tags: ["Notifications", "Customisation", "Utility"], settings: settings, patches: [ diff --git a/src/plugins/betterSettings/index.tsx b/src/plugins/betterSettings/index.tsx index 8ea90ffd6..d37fbe666 100644 --- a/src/plugins/betterSettings/index.tsx +++ b/src/plugins/betterSettings/index.tsx @@ -78,6 +78,7 @@ export default definePlugin({ name: "BetterSettings", description: "Enhances your settings-menu-opening experience", authors: [Devs.Kyuuhachi], + tags: ["Appearance", "Customisation", "Organisation"], settings, start() { diff --git a/src/plugins/betterUploadButton/index.ts b/src/plugins/betterUploadButton/index.ts index 9639dc60a..44fe643d2 100644 --- a/src/plugins/betterUploadButton/index.ts +++ b/src/plugins/betterUploadButton/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "BetterUploadButton", authors: [Devs.fawn, Devs.Ven], description: "Upload with a single click, open menu with right click", + tags: ["Utility", "Shortcuts"], patches: [ { find: ".CHAT_INPUT_BUTTON_NOTIFICATION,", diff --git a/src/plugins/biggerStreamPreview/index.tsx b/src/plugins/biggerStreamPreview/index.tsx index 2e8beb86a..a1e8959c9 100644 --- a/src/plugins/biggerStreamPreview/index.tsx +++ b/src/plugins/biggerStreamPreview/index.tsx @@ -89,6 +89,7 @@ export const userContextPatch: NavContextMenuPatchCallback = (children, { user } export default definePlugin({ name: "BiggerStreamPreview", description: "This plugin allows you to enlarge stream previews", + tags: ["Media", "Appearance"], authors: [Devs.phil], contextMenus: { "user-context": userContextPatch, diff --git a/src/plugins/blurNsfw/index.ts b/src/plugins/blurNsfw/index.ts index 1681f8c57..5db9fc2e6 100644 --- a/src/plugins/blurNsfw/index.ts +++ b/src/plugins/blurNsfw/index.ts @@ -41,6 +41,7 @@ function setCss() { export default definePlugin({ name: "BlurNSFW", description: "Blur attachments in NSFW channels until hovered", + tags: ["Privacy", "Appearance"], authors: [Devs.Ven], patches: [ diff --git a/src/plugins/callTimer/index.tsx b/src/plugins/callTimer/index.tsx index 6503568e8..7e7457663 100644 --- a/src/plugins/callTimer/index.tsx +++ b/src/plugins/callTimer/index.tsx @@ -51,6 +51,7 @@ function formatDuration(ms: number) { export default definePlugin({ name: "CallTimer", description: "Adds a timer to vcs", + tags: ["Voice", "Utility"], authors: [Devs.Ven], managedStyle: alignedChatInputFix, diff --git a/src/plugins/characterCounter/index.tsx b/src/plugins/characterCounter/index.tsx index 209924bc2..57b9c3f30 100644 --- a/src/plugins/characterCounter/index.tsx +++ b/src/plugins/characterCounter/index.tsx @@ -35,6 +35,7 @@ export default definePlugin({ name: "CharacterCounter", description: "Adds a character counter to the chat input", authors: [Devs.thororen], + tags: ["Utility"], settings, patches: [ { diff --git a/src/plugins/clearURLs/index.ts b/src/plugins/clearURLs/index.ts index 362706079..ed1d65962 100644 --- a/src/plugins/clearURLs/index.ts +++ b/src/plugins/clearURLs/index.ts @@ -50,6 +50,7 @@ interface RuleSet { export default definePlugin({ name: "ClearURLs", description: "Automatically removes tracking elements from URLs you send", + tags: ["Privacy", "Utility"], authors: [Devs.adryd, Devs.thororen], rules: [] as RuleSet[], diff --git a/src/plugins/clientTheme/index.tsx b/src/plugins/clientTheme/index.tsx index 984318e29..48e16971d 100644 --- a/src/plugins/clientTheme/index.tsx +++ b/src/plugins/clientTheme/index.tsx @@ -29,6 +29,7 @@ export default definePlugin({ name: "ClientTheme", authors: [Devs.Nuckyz], description: "Recreation of the old client theme experiment. Add a color to your Discord client theme", + tags: ["Appearance", "Customisation"], settings, startAt: StartAt.DOMContentLoaded, diff --git a/src/plugins/colorSighted/index.ts b/src/plugins/colorSighted/index.ts index 025cfb94e..0f9201632 100644 --- a/src/plugins/colorSighted/index.ts +++ b/src/plugins/colorSighted/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "ColorSighted", description: "Removes the colorblind-friendly icons from statuses, just like 2015-2017 Discord", authors: [Devs.lewisakura], + tags: ["Appearance", "Accessibility"], patches: [ { find: "Masks.STATUS_ONLINE", diff --git a/src/plugins/consoleJanitor/index.tsx b/src/plugins/consoleJanitor/index.tsx index d30d6ced3..2cde73cc9 100644 --- a/src/plugins/consoleJanitor/index.tsx +++ b/src/plugins/consoleJanitor/index.tsx @@ -108,6 +108,7 @@ export default definePlugin({ name: "ConsoleJanitor", description: "Disables annoying console messages/errors", authors: [Devs.Nuckyz, Devs.sadan], + tags: ["Developers", "Console", "Utility"], settings, startAt: StartAt.Init, diff --git a/src/plugins/consoleShortcuts/index.ts b/src/plugins/consoleShortcuts/index.ts index 3b35e89e4..a65ece9ae 100644 --- a/src/plugins/consoleShortcuts/index.ts +++ b/src/plugins/consoleShortcuts/index.ts @@ -243,6 +243,7 @@ export default definePlugin({ name: "ConsoleShortcuts", description: "Adds shorter Aliases for many things on the window. Run `shortcutList` for a list.", authors: [Devs.Ven], + tags: ["Developers", "Console", "Shortcuts", "Utility"], startAt: StartAt.Init, patches: [ diff --git a/src/plugins/copyEmojiMarkdown/index.tsx b/src/plugins/copyEmojiMarkdown/index.tsx index e03197fec..dfa46a350 100644 --- a/src/plugins/copyEmojiMarkdown/index.tsx +++ b/src/plugins/copyEmojiMarkdown/index.tsx @@ -51,6 +51,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CopyEmojiMarkdown", description: "Allows you to copy emojis as formatted string (<:blobcatcozy:1026533070955872337>)", + tags: ["Emotes", "Utility"], authors: [Devs.HappyEnderman, Devs.Vishnya], settings, diff --git a/src/plugins/copyFileContents/index.tsx b/src/plugins/copyFileContents/index.tsx index be7ec07a2..c74a5c544 100644 --- a/src/plugins/copyFileContents/index.tsx +++ b/src/plugins/copyFileContents/index.tsx @@ -22,6 +22,7 @@ const CheckMarkIcon = () => { export default definePlugin({ name: "CopyFileContents", description: "Adds a button to text file attachments to copy their contents", + tags: ["Utility"], authors: [Devs.Obsidian, Devs.Nuckyz], patches: [ { diff --git a/src/plugins/copyStickerLinks/index.tsx b/src/plugins/copyStickerLinks/index.tsx index 635b8d313..bc8fe8e90 100644 --- a/src/plugins/copyStickerLinks/index.tsx +++ b/src/plugins/copyStickerLinks/index.tsx @@ -87,6 +87,7 @@ const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { t export default definePlugin({ name: "CopyStickerLinks", description: "Adds the ability to copy & open Sticker links", + tags: ["Emotes", "Utility"], authors: [Devs.Ven, Devs.Byeoon], contextMenus: { "message": messageContextMenuPatch, diff --git a/src/plugins/copyUserURLs/index.tsx b/src/plugins/copyUserURLs/index.tsx index 744f7ccac..07ac0721d 100644 --- a/src/plugins/copyUserURLs/index.tsx +++ b/src/plugins/copyUserURLs/index.tsx @@ -47,6 +47,7 @@ export default definePlugin({ name: "CopyUserURLs", authors: [Devs.castdrian], description: "Adds a 'Copy User URL' option to the user context menu.", + tags: ["Utility", "Friends"], contextMenus: { "user-context": UserContextMenuPatch } diff --git a/src/plugins/crashHandler/index.ts b/src/plugins/crashHandler/index.ts index 4fd77c7af..04786132e 100644 --- a/src/plugins/crashHandler/index.ts +++ b/src/plugins/crashHandler/index.ts @@ -61,8 +61,8 @@ export default definePlugin({ name: "CrashHandler", description: "Utility plugin for handling and possibly recovering from crashes without a restart", authors: [Devs.Nuckyz], + tags: ["Utility", "Developers"], enabledByDefault: true, - settings, patches: [ diff --git a/src/plugins/ctrlEnterSend/index.ts b/src/plugins/ctrlEnterSend/index.ts index 7b0b26b9a..ba6eb3df6 100644 --- a/src/plugins/ctrlEnterSend/index.ts +++ b/src/plugins/ctrlEnterSend/index.ts @@ -12,6 +12,7 @@ export default definePlugin({ name: "CtrlEnterSend", authors: [Devs.UlyssesZhan], description: "Use Ctrl+Enter to send messages (customizable)", + tags: ["Shortcuts", "Chat"], settings: definePluginSettings({ submitRule: { description: "The way to send a message", diff --git a/src/plugins/customCommands/index.ts b/src/plugins/customCommands/index.ts index 37edf902a..fe22de6e4 100644 --- a/src/plugins/customCommands/index.ts +++ b/src/plugins/customCommands/index.ts @@ -91,8 +91,9 @@ migratePluginSettings("CustomCommands", "MessageTags"); export default definePlugin({ name: "CustomCommands", description: "Allows you to create custom slash commands / tags", - tags: ["MessageTags"], + searchTerms: ["MessageTags"], authors: [Devs.Ven, Devs.Luna,], + tags: ["Commands", "Customisation", "Utility"], settings, async start() { diff --git a/src/plugins/customIdle/index.ts b/src/plugins/customIdle/index.ts index 225386a0d..78665a51f 100644 --- a/src/plugins/customIdle/index.ts +++ b/src/plugins/customIdle/index.ts @@ -29,6 +29,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomIdle", description: "Allows you to set the time before Discord goes idle (or disable auto-idle)", + tags: ["Activity", "Customisation"], authors: [Devs.newwares], settings, patches: [ diff --git a/src/plugins/customRPC/index.tsx b/src/plugins/customRPC/index.tsx index d41c904d0..8c28ef45d 100644 --- a/src/plugins/customRPC/index.tsx +++ b/src/plugins/customRPC/index.tsx @@ -213,6 +213,7 @@ export async function setRpc(disable?: boolean) { export default definePlugin({ name: "CustomRPC", description: "Add a fully customisable Rich Presence (Game status) to your Discord profile", + tags: ["Activity", "Customisation"], authors: [Devs.captain, Devs.AutumnVN, Devs.nin0dev], dependencies: ["UserSettingsAPI"], // This plugin's patch is not important for functionality, so don't require a restart diff --git a/src/plugins/dearrow/index.tsx b/src/plugins/dearrow/index.tsx index 7cb60384e..f91c91d45 100644 --- a/src/plugins/dearrow/index.tsx +++ b/src/plugins/dearrow/index.tsx @@ -171,6 +171,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Dearrow", description: "Makes YouTube embed titles and thumbnails less sensationalist, powered by Dearrow", + tags: ["Media", "Utility"], authors: [Devs.Ven], settings, diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index f47cc1f1b..94e9a3e59 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -27,6 +27,7 @@ export interface AvatarDecoration { export default definePlugin({ name: "Decor", description: "Create and use your own custom avatar decorations, or pick your favorite from the presets.", + tags: ["Appearance", "Customisation"], authors: [Devs.FieryFlames], patches: [ // Patch MediaResolver to return correct URL for Decor avatar decorations diff --git a/src/plugins/devCompanion.dev/index.tsx b/src/plugins/devCompanion.dev/index.tsx index 472264d18..35ed0bf46 100644 --- a/src/plugins/devCompanion.dev/index.tsx +++ b/src/plugins/devCompanion.dev/index.tsx @@ -246,6 +246,7 @@ function initWs(isManual = false) { export default definePlugin({ name: "DevCompanion", description: "Dev Companion Plugin", + tags: ["Developers", "Utility"], authors: [Devs.Ven], reporterTestable: ReporterTestable.None, settings, diff --git a/src/plugins/disableCallIdle/index.ts b/src/plugins/disableCallIdle/index.ts index 216f1218c..523580e76 100644 --- a/src/plugins/disableCallIdle/index.ts +++ b/src/plugins/disableCallIdle/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableCallIdle", description: "Disables automatically getting kicked from a DM voice call after 3 minutes and being moved to an AFK voice channel.", + tags: ["Voice", "Utility"], authors: [Devs.Nuckyz], patches: [ { diff --git a/src/plugins/dontRoundMyTimestamps/index.ts b/src/plugins/dontRoundMyTimestamps/index.ts index 4c432c73f..7d8cb9b14 100644 --- a/src/plugins/dontRoundMyTimestamps/index.ts +++ b/src/plugins/dontRoundMyTimestamps/index.ts @@ -24,6 +24,7 @@ export default definePlugin({ name: "DontRoundMyTimestamps", authors: [Devs.Lexi], description: "Always rounds relative timestamps down, so 7.6y becomes 7y instead of 8y", + tags: ["Appearance", "Utility"], start() { moment.relativeTimeRounding(Math.floor); diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index ede964457..69a063891 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -47,6 +47,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Experiments", description: "Enable Access to Experiments & other dev-only features in Discord!", + tags: ["Developers", "Utility"], authors: [ Devs.Megu, Devs.Ven, diff --git a/src/plugins/expressionCloner/index.tsx b/src/plugins/expressionCloner/index.tsx index cc33448c5..9dff27d13 100644 --- a/src/plugins/expressionCloner/index.tsx +++ b/src/plugins/expressionCloner/index.tsx @@ -230,7 +230,7 @@ function CloneModal({ data }: { data: Sticker | Emoji; }) { <> Custom Name { data.name = v; setName(v); @@ -409,7 +409,8 @@ migratePluginSettings("ExpressionCloner", "EmoteCloner"); export default definePlugin({ name: "ExpressionCloner", description: "Allows you to clone Emotes & Stickers to your own server (right click them)", - tags: ["StickerCloner", "EmoteCloner", "EmojiCloner"], + tags: ["Emotes", "Servers"], + searchTerms: ["StickerCloner", "EmoteCloner", "EmojiCloner"], authors: [Devs.Ven, Devs.Nuckyz], contextMenus: { "message": messageContextMenuPatch, diff --git a/src/plugins/f8break/index.ts b/src/plugins/f8break/index.ts index 89dd2c92f..5b1b118ce 100644 --- a/src/plugins/f8break/index.ts +++ b/src/plugins/f8break/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "F8Break", description: "Pause the client when you press F8 with DevTools (+ breakpoints) open.", + tags: ["Developers", "Shortcuts"], authors: [Devs.lewisakura], start() { diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx index 13a5b5e82..1e6b9ef9f 100644 --- a/src/plugins/fakeNitro/index.tsx +++ b/src/plugins/fakeNitro/index.tsx @@ -174,6 +174,7 @@ export default definePlugin({ name: "FakeNitro", authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven, Devs.fawn, Devs.captain, Devs.Nuckyz, Devs.AutumnVN, Devs.sadan], description: "Allows you to send fake emojis/stickers, use nitro themes, and stream in nitro quality", + tags: ["Emotes", "Appearance", "Customisation", "Chat"], dependencies: ["MessageEventsAPI"], settings, diff --git a/src/plugins/fakeProfileThemes/index.tsx b/src/plugins/fakeProfileThemes/index.tsx index 76826d9d8..319ce2750 100644 --- a/src/plugins/fakeProfileThemes/index.tsx +++ b/src/plugins/fakeProfileThemes/index.tsx @@ -196,6 +196,7 @@ function SettingsAboutComponent() { export default definePlugin({ name: "FakeProfileThemes", description: "Allows profile theming by hiding the colors in your bio thanks to invisible 3y3 encoding", + tags: ["Appearance", "Customisation"], authors: [Devs.Alyxia, Devs.Remty], patches: [ { diff --git a/src/plugins/favEmojiFirst/index.ts b/src/plugins/favEmojiFirst/index.ts index 8d8172900..11692b9fd 100644 --- a/src/plugins/favEmojiFirst/index.ts +++ b/src/plugins/favEmojiFirst/index.ts @@ -37,6 +37,7 @@ export default definePlugin({ name: "FavoriteEmojiFirst", authors: [Devs.Aria, Devs.Ven], description: "Puts your favorite emoji first in the emoji autocomplete.", + tags: ["Emotes", "Customisation"], patches: [ { find: "renderResults({results:", diff --git a/src/plugins/favGifSearch/index.tsx b/src/plugins/favGifSearch/index.tsx index 0847c54b3..2a3d14728 100644 --- a/src/plugins/favGifSearch/index.tsx +++ b/src/plugins/favGifSearch/index.tsx @@ -84,6 +84,7 @@ export default definePlugin({ name: "FavoriteGifSearch", authors: [Devs.Aria], description: "Adds a search bar to favorite gifs.", + tags: ["Media", "Customisation"], patches: [ { diff --git a/src/plugins/fixCodeblockGap/index.ts b/src/plugins/fixCodeblockGap/index.ts index 721175fe7..ed9a98b5a 100644 --- a/src/plugins/fixCodeblockGap/index.ts +++ b/src/plugins/fixCodeblockGap/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "FixCodeblockGap", description: "Removes the gap between codeblocks and text below it", + tags: ["Appearance"], authors: [Devs.Grzesiek11], patches: [ { diff --git a/src/plugins/fixImagesQuality/index.tsx b/src/plugins/fixImagesQuality/index.tsx index 98945c933..a10adb27e 100644 --- a/src/plugins/fixImagesQuality/index.tsx +++ b/src/plugins/fixImagesQuality/index.tsx @@ -24,6 +24,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FixImagesQuality", description: "Improves quality of images by loading them at their original resolution", + tags: ["Media", "Appearance"], authors: [Devs.Nuckyz, Devs.Ven], settings, diff --git a/src/plugins/fixSpotifyEmbeds.desktop/index.tsx b/src/plugins/fixSpotifyEmbeds.desktop/index.tsx index c5b42742a..4ca6f5fe3 100644 --- a/src/plugins/fixSpotifyEmbeds.desktop/index.tsx +++ b/src/plugins/fixSpotifyEmbeds.desktop/index.tsx @@ -23,5 +23,6 @@ export default definePlugin({ name: "FixSpotifyEmbeds", description: "Fixes spotify embeds being incredibly loud by letting you customise the volume", authors: [Devs.Ven], + tags: ["Media", "Customisation"], settings, }); diff --git a/src/plugins/fixYoutubeEmbeds.desktop/index.ts b/src/plugins/fixYoutubeEmbeds.desktop/index.ts index 55486d763..404b38d9d 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/index.ts +++ b/src/plugins/fixYoutubeEmbeds.desktop/index.ts @@ -10,5 +10,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "FixYoutubeEmbeds", description: "Bypasses youtube videos being blocked from display on Discord (for example by UMG)", + tags: ["Media", "Utility"], authors: [Devs.coolelectronics] }); diff --git a/src/plugins/forceOwnerCrown/index.ts b/src/plugins/forceOwnerCrown/index.ts index f7e4b4701..17997568a 100644 --- a/src/plugins/forceOwnerCrown/index.ts +++ b/src/plugins/forceOwnerCrown/index.ts @@ -25,6 +25,7 @@ export default definePlugin({ name: "ForceOwnerCrown", description: "Force the owner crown next to usernames even if the server is large.", authors: [Devs.D3SOX, Devs.Nickyux], + tags: ["Roles", "Appearance", "Servers"], patches: [ { find: "#{intl::GUILD_OWNER}),children:", diff --git a/src/plugins/friendInvites/index.ts b/src/plugins/friendInvites/index.ts index 0af611bc9..ec677e297 100644 --- a/src/plugins/friendInvites/index.ts +++ b/src/plugins/friendInvites/index.ts @@ -26,6 +26,7 @@ const FriendInvites = findByPropsLazy("createFriendInvite"); export default definePlugin({ name: "FriendInvites", description: "Create and manage friend invite links via slash commands (/create friend invite, /view friend invites, /revoke friend invites).", + tags: ["Friends", "Commands"], authors: [Devs.afn, Devs.Dziurwa], commands: [ { diff --git a/src/plugins/friendsSince/index.tsx b/src/plugins/friendsSince/index.tsx index 6197d0c30..f246cd910 100644 --- a/src/plugins/friendsSince/index.tsx +++ b/src/plugins/friendsSince/index.tsx @@ -22,6 +22,7 @@ const Section = findComponentByCodeLazy("headingVariant:", '"section"', "heading export default definePlugin({ name: "FriendsSince", description: "Shows when you became friends with someone in the user popout", + tags: ["Friends"], authors: [Devs.Elvyra, Devs.Antti], patches: [ // DM User Sidebar diff --git a/src/plugins/fullSearchContext/index.tsx b/src/plugins/fullSearchContext/index.tsx index 2f20cd53b..672552d9f 100644 --- a/src/plugins/fullSearchContext/index.tsx +++ b/src/plugins/fullSearchContext/index.tsx @@ -81,6 +81,7 @@ migratePluginSettings("FullSearchContext", "SearchReply"); export default definePlugin({ name: "FullSearchContext", description: "Makes the message context menu in message search results have all options you'd expect", + tags: ["Utility"], authors: [Devs.Ven, Devs.Aria], patches: [{ diff --git a/src/plugins/fullUserInChatbox/index.tsx b/src/plugins/fullUserInChatbox/index.tsx index 9ac4f811d..dfed0036e 100644 --- a/src/plugins/fullUserInChatbox/index.tsx +++ b/src/plugins/fullUserInChatbox/index.tsx @@ -23,6 +23,7 @@ interface UserMentionComponentProps { export default definePlugin({ name: "FullUserInChatbox", description: "Makes the user mention in the chatbox have more functionalities, like left/right clicking", + tags: ["Shortcuts", "Utility"], authors: [Devs.sadan], patches: [ diff --git a/src/plugins/gameActivityToggle/index.tsx b/src/plugins/gameActivityToggle/index.tsx index 102ee3cf4..4f39dc1ff 100644 --- a/src/plugins/gameActivityToggle/index.tsx +++ b/src/plugins/gameActivityToggle/index.tsx @@ -104,6 +104,7 @@ function GameActivityToggleButton(props: { nameplate?: any; }) { export default definePlugin({ name: "GameActivityToggle", description: "Adds a button next to the mic and deafen button to toggle game activity.", + tags: ["Activity", "Shortcuts"], authors: [Devs.Nuckyz, Devs.RuukuLada], dependencies: ["UserSettingsAPI"], settings, diff --git a/src/plugins/gifPaste/index.ts b/src/plugins/gifPaste/index.ts index 4e520d122..40479790e 100644 --- a/src/plugins/gifPaste/index.ts +++ b/src/plugins/gifPaste/index.ts @@ -24,6 +24,7 @@ import { ExpressionPickerStore } from "@webpack/common"; export default definePlugin({ name: "GifPaste", description: "Makes picking a gif in the gif picker insert a link into the chatbox instead of instantly sending it", + tags: ["Media", "Chat"], authors: [Devs.Ven], patches: [{ diff --git a/src/plugins/greetStickerPicker/index.tsx b/src/plugins/greetStickerPicker/index.tsx index db20bd3dd..216498e24 100644 --- a/src/plugins/greetStickerPicker/index.tsx +++ b/src/plugins/greetStickerPicker/index.tsx @@ -153,6 +153,7 @@ function GreetMenu({ channel, message }: { message: Message, channel: Channel; } export default definePlugin({ name: "GreetStickerPicker", description: "Allows you to use any greet sticker instead of only the random one by right-clicking the 'Wave to say hi!' button", + tags: ["Emotes", "Customisation"], authors: [Devs.Ven], settings, diff --git a/src/plugins/hideAttachments/index.tsx b/src/plugins/hideAttachments/index.tsx index 0895ec864..b8a729e6e 100644 --- a/src/plugins/hideAttachments/index.tsx +++ b/src/plugins/hideAttachments/index.tsx @@ -55,6 +55,7 @@ async function toggleHide(channelId: string, messageId: string) { export default definePlugin({ name: "HideMedia", description: "Hide attachments and embeds for individual messages via hover button", + tags: ["Chat", "Appearance"], authors: [Devs.Ven], dependencies: ["MessageUpdaterAPI"], diff --git a/src/plugins/iLoveSpam/index.ts b/src/plugins/iLoveSpam/index.ts index e30417455..4dd8c7117 100644 --- a/src/plugins/iLoveSpam/index.ts +++ b/src/plugins/iLoveSpam/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "iLoveSpam", description: "Do not hide messages from 'likely spammers'", + tags: ["Utility", "Chat"], authors: [Devs.botato, Devs.Nyako], patches: [ { diff --git a/src/plugins/ignoreActivities/index.tsx b/src/plugins/ignoreActivities/index.tsx index 223382c45..63668d695 100644 --- a/src/plugins/ignoreActivities/index.tsx +++ b/src/plugins/ignoreActivities/index.tsx @@ -229,6 +229,7 @@ export default definePlugin({ name: "IgnoreActivities", authors: [Devs.Nuckyz, Devs.Kylie], description: "Ignore activities from showing up on your status ONLY. You can configure which ones are specifically ignored from the Registered Games and Activities tabs, or use the general settings below", + tags: ["Activity", "Privacy", "Customisation"], dependencies: ["UserSettingsAPI"], settings, diff --git a/src/plugins/imageFilename/index.ts b/src/plugins/imageFilename/index.ts index 77717e5b5..d421fb43a 100644 --- a/src/plugins/imageFilename/index.ts +++ b/src/plugins/imageFilename/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "ImageFilename", authors: [Devs.Ven], description: "Display the file name of images & GIFs as a tooltip when hovering over them", + tags: ["Media", "Utility"], settings, patches: [ diff --git a/src/plugins/imageLink/index.ts b/src/plugins/imageLink/index.ts index 08d3a0247..0d01cb1d3 100644 --- a/src/plugins/imageLink/index.ts +++ b/src/plugins/imageLink/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ImageLink", description: "Never hide image links in messages, even if it's the only content", + tags: ["Media", "Appearance"], authors: [Devs.Kyuuhachi, Devs.Sqaaakoi], patches: [ diff --git a/src/plugins/imageZoom/index.tsx b/src/plugins/imageZoom/index.tsx index 4bdfe4378..b1a6972f9 100644 --- a/src/plugins/imageZoom/index.tsx +++ b/src/plugins/imageZoom/index.tsx @@ -156,8 +156,9 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => export default definePlugin({ name: "ImageZoom", description: "Lets you zoom in to images and gifs. Use scroll wheel to zoom in and shift + scroll wheel to increase lens radius / size", + tags: ["Media", "Utility"], authors: [Devs.Aria], - tags: ["ImageUtilities"], + searchTerms: ["ImageUtilities"], managedStyle, diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts index 9e0a3e234..18adf29dc 100644 --- a/src/plugins/implicitRelationships/index.ts +++ b/src/plugins/implicitRelationships/index.ts @@ -26,6 +26,7 @@ import { Settings } from "Vencord"; export default definePlugin({ name: "ImplicitRelationships", description: "Shows your implicit relationships in the Friends tab.", + tags: ["Friends", "Servers"], authors: [Devs.Dolfies], patches: [ // Counts header diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts index fbe5431bc..950c1a87c 100644 --- a/src/plugins/ircColors/index.ts +++ b/src/plugins/ircColors/index.ts @@ -59,6 +59,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "IrcColors", description: "Makes username colors in chat unique, like in IRC clients", + tags: ["Appearance", "Customisation"], authors: [Devs.Grzesiek11, Devs.jamesbt365], settings, diff --git a/src/plugins/keepCurrentChannel/index.ts b/src/plugins/keepCurrentChannel/index.ts index 92a389eb4..61c585aaa 100644 --- a/src/plugins/keepCurrentChannel/index.ts +++ b/src/plugins/keepCurrentChannel/index.ts @@ -43,6 +43,7 @@ let previousCache: PreviousChannel | undefined; export default definePlugin({ name: "KeepCurrentChannel", description: "Attempt to navigate to the channel you were in before switching accounts or loading Discord.", + tags: ["Utility", "Organisation"], authors: [Devs.Nuckyz], patches: [ diff --git a/src/plugins/lastfmRichPresence/index.tsx b/src/plugins/lastfmRichPresence/index.tsx index 4848b7438..3d3275a90 100644 --- a/src/plugins/lastfmRichPresence/index.tsx +++ b/src/plugins/lastfmRichPresence/index.tsx @@ -179,6 +179,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LastFMRichPresence", description: "Little plugin for Last.fm rich presence", + tags: ["Activity", "Media"], authors: [Devs.dzshn, Devs.RuiNtD, Devs.blahajZip, Devs.archeruwu], settings, diff --git a/src/plugins/loadingQuotes/index.ts b/src/plugins/loadingQuotes/index.ts index 3b9896b58..134db49d9 100644 --- a/src/plugins/loadingQuotes/index.ts +++ b/src/plugins/loadingQuotes/index.ts @@ -57,6 +57,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LoadingQuotes", description: "Replace Discords loading quotes", + tags: ["Appearance", "Fun", "Customisation"], authors: [Devs.Ven, Devs.KraXen72, Devs.UlyssesZhan], settings, diff --git a/src/plugins/memberCount/index.tsx b/src/plugins/memberCount/index.tsx index 83c4f85ef..7f94cece4 100644 --- a/src/plugins/memberCount/index.tsx +++ b/src/plugins/memberCount/index.tsx @@ -62,6 +62,7 @@ export const cl = classNameFactory("vc-membercount-"); export default definePlugin({ name: "MemberCount", description: "Shows the number of online members, total members, and users in voice channels on the server — in the member list and tooltip.", + tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Commandtechno, Devs.Apexo], settings, diff --git a/src/plugins/mentionAvatars/index.tsx b/src/plugins/mentionAvatars/index.tsx index 4e79da5cf..185582daf 100644 --- a/src/plugins/mentionAvatars/index.tsx +++ b/src/plugins/mentionAvatars/index.tsx @@ -45,6 +45,7 @@ function DefaultRoleIcon() { export default definePlugin({ name: "MentionAvatars", description: "Shows user avatars and role icons inside mentions", + tags: ["Appearance", "Customisation"], authors: [Devs.Ven, Devs.SerStars], patches: [{ diff --git a/src/plugins/messageClickActions/index.ts b/src/plugins/messageClickActions/index.ts index b9eb718d1..b0a9e67da 100644 --- a/src/plugins/messageClickActions/index.ts +++ b/src/plugins/messageClickActions/index.ts @@ -59,6 +59,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "MessageClickActions", description: "Hold Backspace and click to delete, double click to edit/reply", + tags: ["Chat", "Shortcuts"], authors: [Devs.Ven], settings, diff --git a/src/plugins/messageLatency/index.tsx b/src/plugins/messageLatency/index.tsx index 4c451a1e5..2520497ee 100644 --- a/src/plugins/messageLatency/index.tsx +++ b/src/plugins/messageLatency/index.tsx @@ -29,6 +29,7 @@ const DISCORD_KT_DELAY = 1471228928; export default definePlugin({ name: "MessageLatency", description: "Displays an indicator for messages that took ≥n seconds to send", + tags: ["Chat", "Utility"], authors: [Devs.arHSM], settings: definePluginSettings({ diff --git a/src/plugins/messageLinkEmbeds/index.tsx b/src/plugins/messageLinkEmbeds/index.tsx index 941891204..7dee0a9d4 100644 --- a/src/plugins/messageLinkEmbeds/index.tsx +++ b/src/plugins/messageLinkEmbeds/index.tsx @@ -367,6 +367,7 @@ function AutomodEmbedAccessory(props: MessageEmbedProps): JSX.Element | null { export default definePlugin({ name: "MessageLinkEmbeds", description: "Adds a preview to messages that link another message", + tags: ["Chat", "Appearance"], authors: [Devs.TheSun, Devs.Ven, Devs.RyanCaoDev], dependencies: ["MessageAccessoriesAPI", "MessageUpdaterAPI", "UserSettingsAPI"], diff --git a/src/plugins/messageLogger/index.tsx b/src/plugins/messageLogger/index.tsx index ef32ad514..5988fa201 100644 --- a/src/plugins/messageLogger/index.tsx +++ b/src/plugins/messageLogger/index.tsx @@ -144,6 +144,7 @@ export function parseEditContent(content: string, message: Message) { export default definePlugin({ name: "MessageLogger", description: "Temporarily logs deleted and edited messages.", + tags: ["Chat", "Utility"], authors: [Devs.rushii, Devs.Ven, Devs.AutumnVN, Devs.Nickyux, Devs.Kyuuhachi], dependencies: ["MessageUpdaterAPI"], diff --git a/src/plugins/moreQuickReactions/index.ts b/src/plugins/moreQuickReactions/index.ts index 9b8e7b761..e18ffe63f 100644 --- a/src/plugins/moreQuickReactions/index.ts +++ b/src/plugins/moreQuickReactions/index.ts @@ -20,6 +20,7 @@ export default definePlugin({ name: "MoreQuickReactions", description: "Increases the number of reactions available in the Quick React hover menu", authors: [Devs.iamme], + tags: ["Emotes", "Reactions", "Customisation", "Shortcuts"], settings, get reactionCount() { diff --git a/src/plugins/mutualGroupDMs/index.tsx b/src/plugins/mutualGroupDMs/index.tsx index 63746e06b..ea2bca17f 100644 --- a/src/plugins/mutualGroupDMs/index.tsx +++ b/src/plugins/mutualGroupDMs/index.tsx @@ -86,6 +86,7 @@ const IS_PATCHED = Symbol("MutualGroupDMs.Patched"); export default definePlugin({ name: "MutualGroupDMs", description: "Shows mutual group dms in profiles", + tags: ["Friends", "Appearance"], authors: [Devs.amia], patches: [ diff --git a/src/plugins/newGuildSettings/index.tsx b/src/plugins/newGuildSettings/index.tsx index 7d8687d30..553861e0c 100644 --- a/src/plugins/newGuildSettings/index.tsx +++ b/src/plugins/newGuildSettings/index.tsx @@ -118,7 +118,8 @@ function applyDefaultSettings(guildId: string | null) { export default definePlugin({ name: "NewGuildSettings", description: "Automatically mute new servers and change various other settings upon joining", - tags: ["MuteNewGuild", "mute", "server"], + tags: ["Servers", "Customisation"], + searchTerms: ["MuteNewGuild", "mute", "server"], authors: [Devs.Glitch, Devs.Nuckyz, Devs.carince, Devs.Mopi, Devs.GabiRP], contextMenus: { "guild-context": makeContextMenuPatch(false), diff --git a/src/plugins/noBlockedMessages/index.ts b/src/plugins/noBlockedMessages/index.ts index 39c718a9c..9f14a088a 100644 --- a/src/plugins/noBlockedMessages/index.ts +++ b/src/plugins/noBlockedMessages/index.ts @@ -50,6 +50,7 @@ export default definePlugin({ name: "NoBlockedMessages", description: "Hides all blocked/ignored messages from chat completely", authors: [Devs.rushii, Devs.Samu, Devs.jamesbt365], + tags: ["Accessibility", "Chat"], settings, patches: [ diff --git a/src/plugins/noDeepLinks.web/index.ts b/src/plugins/noDeepLinks.web/index.ts index e217308ad..f68c9aef8 100644 --- a/src/plugins/noDeepLinks.web/index.ts +++ b/src/plugins/noDeepLinks.web/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableDeepLinks", description: "Disables Discord's stupid deep linking feature which tries to force you to use their Desktop App", + tags: ["Utility"], authors: [Devs.Ven], required: true, diff --git a/src/plugins/noDevtoolsWarning/index.ts b/src/plugins/noDevtoolsWarning/index.ts index 5c35fa67b..d5dcad53c 100644 --- a/src/plugins/noDevtoolsWarning/index.ts +++ b/src/plugins/noDevtoolsWarning/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "NoDevtoolsWarning", description: "Disables the 'HOLD UP' banner in the console. As a side effect, also prevents Discord from hiding your token, which prevents random logouts.", authors: [Devs.Ven], + tags: ["Developers", "Console"], patches: [{ find: "setDevtoolsCallbacks", replacement: { diff --git a/src/plugins/noF1/index.ts b/src/plugins/noF1/index.ts index a40be5acc..36e088e46 100644 --- a/src/plugins/noF1/index.ts +++ b/src/plugins/noF1/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoF1", description: "Disables F1 help bind.", + tags: ["Utility"], authors: [Devs.Cyn], patches: [ { diff --git a/src/plugins/noMaskedUrlPaste/index.ts b/src/plugins/noMaskedUrlPaste/index.ts index 64f522cae..fc10f8970 100644 --- a/src/plugins/noMaskedUrlPaste/index.ts +++ b/src/plugins/noMaskedUrlPaste/index.ts @@ -11,6 +11,7 @@ export default definePlugin({ name: "NoMaskedUrlPaste", authors: [Devs.CatNoir], description: "Pasting a link while having text selected will not paste as masked URL", + tags: ["Chat", "Utility"], patches: [ { find: ".selection,preventEmojiSurrogates:", diff --git a/src/plugins/noMosaic/index.ts b/src/plugins/noMosaic/index.ts index c52e19a6b..b360e1ea1 100644 --- a/src/plugins/noMosaic/index.ts +++ b/src/plugins/noMosaic/index.ts @@ -21,7 +21,8 @@ export default definePlugin({ name: "NoMosaic", authors: [Devs.AutumnVN], description: "Removes Discord image mosaic", - tags: ["image", "mosaic", "media"], + tags: ["Media", "Appearance", "Chat"], + searchTerms: ["image", "mosaic", "media"], settings, diff --git a/src/plugins/noOnboardingDelay/index.ts b/src/plugins/noOnboardingDelay/index.ts index 285109761..b5f963463 100644 --- a/src/plugins/noOnboardingDelay/index.ts +++ b/src/plugins/noOnboardingDelay/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoOnboardingDelay", description: "Skips the slow and annoying onboarding delay", + tags: ["Utility", "Servers"], authors: [Devs.nekohaxx], patches: [ { diff --git a/src/plugins/noPendingCount/index.ts b/src/plugins/noPendingCount/index.ts index b1a7ffad8..5bede8b49 100644 --- a/src/plugins/noPendingCount/index.ts +++ b/src/plugins/noPendingCount/index.ts @@ -47,6 +47,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NoPendingCount", description: "Removes the ping count of incoming friend requests, message requests, and nitro offers.", + tags: ["Notifications", "Appearance"], authors: [Devs.amia], settings: settings, diff --git a/src/plugins/noProfileThemes/index.ts b/src/plugins/noProfileThemes/index.ts index 7c440df80..a4fe648d0 100644 --- a/src/plugins/noProfileThemes/index.ts +++ b/src/plugins/noProfileThemes/index.ts @@ -23,6 +23,7 @@ import { UserStore } from "@webpack/common"; export default definePlugin({ name: "NoProfileThemes", description: "Completely removes Nitro profile themes from everyone but yourself", + tags: ["Appearance"], authors: [Devs.TheKodeToad], patches: [ { diff --git a/src/plugins/noReplyMention/index.tsx b/src/plugins/noReplyMention/index.tsx index a08a04b8b..2e2bb9c6b 100644 --- a/src/plugins/noReplyMention/index.tsx +++ b/src/plugins/noReplyMention/index.tsx @@ -62,6 +62,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NoReplyMention", description: "Disables reply pings by default", + tags: ["Chat", "Notifications"], authors: [Devs.DustyAngel47, Devs.rae, Devs.pylix, Devs.outfoxxed], settings, diff --git a/src/plugins/noServerEmojis/index.ts b/src/plugins/noServerEmojis/index.ts index 6550dabb8..fd764dbf3 100644 --- a/src/plugins/noServerEmojis/index.ts +++ b/src/plugins/noServerEmojis/index.ts @@ -26,6 +26,7 @@ export default definePlugin({ name: "NoServerEmojis", authors: [Devs.UlyssesZhan], description: "Do not show server emojis in the autocomplete menu.", + tags: ["Emotes", "Servers"], settings, patches: [ diff --git a/src/plugins/noSystemBadge.discordDesktop/index.ts b/src/plugins/noSystemBadge.discordDesktop/index.ts index 0fbb5332a..c01c0b87a 100644 --- a/src/plugins/noSystemBadge.discordDesktop/index.ts +++ b/src/plugins/noSystemBadge.discordDesktop/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoSystemBadge", description: "Disables the taskbar and system tray unread count badge.", + tags: ["Notifications", "Appearance"], authors: [Devs.rushii], patches: [ { diff --git a/src/plugins/noTypingAnimation/index.ts b/src/plugins/noTypingAnimation/index.ts index 74bcdd50e..6eca410fa 100644 --- a/src/plugins/noTypingAnimation/index.ts +++ b/src/plugins/noTypingAnimation/index.ts @@ -11,6 +11,7 @@ export default definePlugin({ name: "NoTypingAnimation", authors: [Devs.AutumnVN], description: "Disables the CPU-intensive typing dots animation", + tags: ["Appearance"], patches: [ { find: "dotCycle", diff --git a/src/plugins/noUnblockToJump/index.ts b/src/plugins/noUnblockToJump/index.ts index 5d876fc7b..6c1f504b6 100644 --- a/src/plugins/noUnblockToJump/index.ts +++ b/src/plugins/noUnblockToJump/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoUnblockToJump", description: "Allows you to jump to messages of blocked or ignored users and likely spammers without unblocking them", + tags: ["Utility"], authors: [Devs.dzshn], patches: [ { diff --git a/src/plugins/notificationVolume/index.ts b/src/plugins/notificationVolume/index.ts index d320d76f1..5959c0dd1 100644 --- a/src/plugins/notificationVolume/index.ts +++ b/src/plugins/notificationVolume/index.ts @@ -21,6 +21,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NotificationVolume", description: "Save your ears and set a separate volume for notifications and in-app sounds", + tags: ["Notifications", "Voice"], authors: [Devs.philipbry], settings, patches: [ diff --git a/src/plugins/onePingPerDM/index.ts b/src/plugins/onePingPerDM/index.ts index fae787a84..4faed9c89 100644 --- a/src/plugins/onePingPerDM/index.ts +++ b/src/plugins/onePingPerDM/index.ts @@ -36,6 +36,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "OnePingPerDM", description: "If unread messages are sent by a user in DMs multiple times, you'll only receive one audio ping. Read the messages to reset the limit", + tags: ["Notifications", "Customisation"], authors: [Devs.ProffDea], settings, patches: [ diff --git a/src/plugins/oneko/index.ts b/src/plugins/oneko/index.ts index cabe4db99..31459c6b3 100644 --- a/src/plugins/oneko/index.ts +++ b/src/plugins/oneko/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "oneko", description: "cat follow mouse (real)", + tags: ["Fun", "Appearance"], // Listing adryd here because this literally just evals her script authors: [Devs.Ven, Devs.adryd], diff --git a/src/plugins/openInApp/index.ts b/src/plugins/openInApp/index.ts index de788b2df..2abd9f724 100644 --- a/src/plugins/openInApp/index.ts +++ b/src/plugins/openInApp/index.ts @@ -80,6 +80,7 @@ const Native = VencordNative.pluginHelpers.OpenInApp as PluginNative | undefined; export default definePlugin({ name: "ReactErrorDecoder", - description: 'Replaces "Minifed React Error" with the actual error.', + description: 'Replaces "Minified React Error" with the actual error.', + tags: ["Developers"], authors: [Devs.Cyn, Devs.maisymoe], patches: [ { diff --git a/src/plugins/readAllNotificationsButton/index.tsx b/src/plugins/readAllNotificationsButton/index.tsx index 8031a3b9d..75a18f351 100644 --- a/src/plugins/readAllNotificationsButton/index.tsx +++ b/src/plugins/readAllNotificationsButton/index.tsx @@ -66,6 +66,7 @@ const ReadAllButton = () => ( export default definePlugin({ name: "ReadAllNotificationsButton", description: "Read all server notifications with a single button click!", + tags: ["Notifications", "Shortcuts"], authors: [Devs.kemo], dependencies: ["ServerListAPI"], diff --git a/src/plugins/relationshipNotifier/index.ts b/src/plugins/relationshipNotifier/index.ts index d913dde48..ddb432e43 100644 --- a/src/plugins/relationshipNotifier/index.ts +++ b/src/plugins/relationshipNotifier/index.ts @@ -26,6 +26,7 @@ import { syncAndRunChecks, syncFriends, syncGroups, syncGuilds } from "./utils"; export default definePlugin({ name: "RelationshipNotifier", description: "Notifies you when a friend, group chat, or server removes you.", + tags: ["Friends", "Notifications"], authors: [Devs.nick], settings, diff --git a/src/plugins/replaceGoogleSearch/index.tsx b/src/plugins/replaceGoogleSearch/index.tsx index 5f0d15d32..907d1bc1b 100644 --- a/src/plugins/replaceGoogleSearch/index.tsx +++ b/src/plugins/replaceGoogleSearch/index.tsx @@ -130,6 +130,7 @@ const messageContextMenuPatch: NavContextMenuPatchCallback = (children, _props) export default definePlugin({ name: "ReplaceGoogleSearch", description: "Replaces the Google search with different Engine(s)", + tags: ["Utility", "Customisation"], authors: [Devs.Moxxie, Devs.Ethan], settings, diff --git a/src/plugins/replyTimestamp/index.tsx b/src/plugins/replyTimestamp/index.tsx index 65e969241..021caea59 100644 --- a/src/plugins/replyTimestamp/index.tsx +++ b/src/plugins/replyTimestamp/index.tsx @@ -58,6 +58,7 @@ function ReplyTimestamp({ export default definePlugin({ name: "ReplyTimestamp", description: "Shows a timestamp on replied-message previews", + tags: ["Chat", "Appearance"], authors: [Devs.Kyuuhachi], patches: [ diff --git a/src/plugins/revealAllSpoilers/index.ts b/src/plugins/revealAllSpoilers/index.ts index 173632d7a..a1176d7b5 100644 --- a/src/plugins/revealAllSpoilers/index.ts +++ b/src/plugins/revealAllSpoilers/index.ts @@ -27,7 +27,7 @@ export default definePlugin({ name: "RevealAllSpoilers", description: "Reveal all spoilers in a message by Ctrl-clicking a spoiler, or in the chat with Ctrl+Shift-click", authors: [Devs.whqwert], - + tags: ["Accessibility", "Chat", "Shortcuts", "Utility"], patches: [ { find: ".removeObscurity,", diff --git a/src/plugins/reverseImageSearch/index.tsx b/src/plugins/reverseImageSearch/index.tsx index 10d3fad19..68845c0a1 100644 --- a/src/plugins/reverseImageSearch/index.tsx +++ b/src/plugins/reverseImageSearch/index.tsx @@ -102,8 +102,9 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => export default definePlugin({ name: "ReverseImageSearch", description: "Adds ImageSearch to image context menus", + tags: ["Media", "Utility"], authors: [Devs.Ven, Devs.Nuckyz], - tags: ["ImageUtilities"], + searchTerms: ["ImageUtilities"], patches: [ { diff --git a/src/plugins/reviewDB/index.tsx b/src/plugins/reviewDB/index.tsx index 647d716ae..6c80cdf62 100644 --- a/src/plugins/reviewDB/index.tsx +++ b/src/plugins/reviewDB/index.tsx @@ -70,6 +70,7 @@ const userContextPatch: NavContextMenuPatchCallback = (children, { user }: { use export default definePlugin({ name: "ReviewDB", description: "Review other users (Adds a new settings to profiles)", + tags: ["Friends", "Servers"], authors: [Devs.mantikafasi, Devs.Ven], settings, diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx index 6f170c41a..2b4b3e0c7 100644 --- a/src/plugins/roleColorEverywhere/index.tsx +++ b/src/plugins/roleColorEverywhere/index.tsx @@ -75,6 +75,7 @@ export default definePlugin({ name: "RoleColorEverywhere", authors: [Devs.KingFish, Devs.lewisakura, Devs.AutumnVN, Devs.Kyuuhachi, Devs.jamesbt365], description: "Adds the top role color anywhere possible", + tags: ["Roles", "Appearance"], settings, patches: [ diff --git a/src/plugins/secretRingTone/index.ts b/src/plugins/secretRingTone/index.ts index f2913afd1..4ebbe3b84 100644 --- a/src/plugins/secretRingTone/index.ts +++ b/src/plugins/secretRingTone/index.ts @@ -20,6 +20,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SecretRingToneEnabler", description: "Always play the secret version of the discord ringtone (except during special ringtone events)", + tags: ["Notifications", "Fun"], authors: [Devs.AndrewDLO, Devs.FieryFlames, Devs.RamziAH], settings, patches: [ diff --git a/src/plugins/seeSummaries/index.tsx b/src/plugins/seeSummaries/index.tsx index faa642fc7..29dd7d383 100644 --- a/src/plugins/seeSummaries/index.tsx +++ b/src/plugins/seeSummaries/index.tsx @@ -52,6 +52,7 @@ interface ChannelSummaries { export default definePlugin({ name: "Summaries", description: "Enables Discord's experimental Summaries feature on every server, displaying AI generated summaries of conversations", + tags: ["Chat", "Fun"], authors: [Devs.mantikafasi], settings, patches: [ diff --git a/src/plugins/sendTimestamps/index.tsx b/src/plugins/sendTimestamps/index.tsx index 9f49d5a3a..b349d68a2 100644 --- a/src/plugins/sendTimestamps/index.tsx +++ b/src/plugins/sendTimestamps/index.tsx @@ -168,6 +168,7 @@ const SendTimestampButton: ChatBarButtonFactory = ({ isAnyChat }) => { export default definePlugin({ name: "SendTimestamps", description: "Send timestamps easily via chat box button & text shortcuts. Read the extended description!", + tags: ["Chat", "Commands"], authors: [Devs.Ven, Devs.Tyler, Devs.Grzesiek11], settings, diff --git a/src/plugins/serverInfo/index.tsx b/src/plugins/serverInfo/index.tsx index 98b9b2d51..5a6f51c31 100644 --- a/src/plugins/serverInfo/index.tsx +++ b/src/plugins/serverInfo/index.tsx @@ -27,9 +27,10 @@ const Patch: NavContextMenuPatchCallback = (children, { guild }: { guild: Guild; export default definePlugin({ name: "ServerInfo", description: "Allows you to view info about a server", + tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Nuckyz], dependencies: ["DynamicImageModalAPI"], - tags: ["guild", "info", "ServerProfile"], + searchTerms: ["guild", "info", "ServerProfile"], contextMenus: { "guild-context": Patch, diff --git a/src/plugins/serverListIndicators/index.tsx b/src/plugins/serverListIndicators/index.tsx index 17a11a37d..23557ae28 100644 --- a/src/plugins/serverListIndicators/index.tsx +++ b/src/plugins/serverListIndicators/index.tsx @@ -91,6 +91,7 @@ function ServersIndicator() { export default definePlugin({ name: "ServerListIndicators", description: "Add online friend count or server count in the server list", + tags: ["Servers", "Appearance"], authors: [Devs.dzshn], dependencies: ["ServerListAPI"], diff --git a/src/plugins/shikiCodeblocks.desktop/index.ts b/src/plugins/shikiCodeblocks.desktop/index.ts index 670b2856c..fbc03854a 100644 --- a/src/plugins/shikiCodeblocks.desktop/index.ts +++ b/src/plugins/shikiCodeblocks.desktop/index.ts @@ -33,6 +33,7 @@ import { clearStyles } from "./utils/createStyle"; export default definePlugin({ name: "ShikiCodeblocks", description: "Brings vscode-style codeblocks into Discord, powered by Shiki", + tags: ["Appearance", "Chat", "Customisation"], authors: [Devs.Vap], reporterTestable: ReporterTestable.Patches, settings, diff --git a/src/plugins/showAllMessageButtons/index.ts b/src/plugins/showAllMessageButtons/index.ts index aa52d34bc..9c4dfa59e 100644 --- a/src/plugins/showAllMessageButtons/index.ts +++ b/src/plugins/showAllMessageButtons/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ShowAllMessageButtons", description: "Always show all message buttons no matter if you are holding the shift key or not.", + tags: ["Chat", "Utility"], authors: [Devs.Nuckyz], patches: [ diff --git a/src/plugins/showConnections/index.tsx b/src/plugins/showConnections/index.tsx index e4a259dfa..5ec9e38c0 100644 --- a/src/plugins/showConnections/index.tsx +++ b/src/plugins/showConnections/index.tsx @@ -155,6 +155,7 @@ function CompactConnectionComponent({ connection, theme }: { connection: Connect export default definePlugin({ name: "ShowConnections", description: "Show connected accounts in user popouts", + tags: ["Friends", "Appearance"], authors: [Devs.TheKodeToad], settings, diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index 27ded4703..609fc95a1 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -71,6 +71,7 @@ function isUncategorized(objChannel: { channel: Channel; comparator: number; }) export default definePlugin({ name: "ShowHiddenChannels", description: "Show channels that you do not have access to view.", + tags: ["Servers", "Utility"], authors: [Devs.BigDuck, Devs.AverageReactEnjoyer, Devs.D3SOX, Devs.Ven, Devs.Nuckyz, Devs.Nickyux, Devs.dzshn], settings, diff --git a/src/plugins/showHiddenThings/index.ts b/src/plugins/showHiddenThings/index.ts index 9a329474d..5ef238327 100644 --- a/src/plugins/showHiddenThings/index.ts +++ b/src/plugins/showHiddenThings/index.ts @@ -37,8 +37,9 @@ const settings = definePluginSettings({ export default definePlugin({ name: "ShowHiddenThings", - tags: ["ShowTimeouts", "ShowInvitesPaused", "ShowModView", "DisableDiscoveryFilters"], + searchTerms: ["ShowTimeouts", "ShowInvitesPaused", "ShowModView", "DisableDiscoveryFilters"], description: "Displays various hidden & moderator-only things regardless of permissions.", + tags: ["Servers", "Utility"], authors: [Devs.Dolfies], settings, diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx index 24a1121dc..d4ffeefd3 100644 --- a/src/plugins/showMeYourName/index.tsx +++ b/src/plugins/showMeYourName/index.tsx @@ -56,6 +56,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "ShowMeYourName", description: "Display usernames next to nicks, or no nicks at all", + tags: ["Appearance", "Customisation"], authors: [Devs.Rini, Devs.TheKodeToad, Devs.rae], patches: [ { diff --git a/src/plugins/showTimeoutDuration/index.tsx b/src/plugins/showTimeoutDuration/index.tsx index 99fa10df0..974114460 100644 --- a/src/plugins/showTimeoutDuration/index.tsx +++ b/src/plugins/showTimeoutDuration/index.tsx @@ -68,6 +68,7 @@ function renderTimeout(message: Message, inline: boolean) { export default definePlugin({ name: "ShowTimeoutDuration", description: "Shows how much longer a user's timeout will last, either in the timeout icon tooltip or next to it", + tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Sqaaakoi], settings, diff --git a/src/plugins/silentMessageToggle/index.tsx b/src/plugins/silentMessageToggle/index.tsx index c3ab733fa..131f8e578 100644 --- a/src/plugins/silentMessageToggle/index.tsx +++ b/src/plugins/silentMessageToggle/index.tsx @@ -104,6 +104,7 @@ export default definePlugin({ name: "SilentMessageToggle", authors: [Devs.Nuckyz, Devs.CatNoir], description: "Adds a button to the chat bar to toggle sending a silent message.", + tags: ["Chat", "Utility"], settings, chatBarButton: { diff --git a/src/plugins/silentTyping/index.tsx b/src/plugins/silentTyping/index.tsx index 4fdad1003..fae0c2a74 100644 --- a/src/plugins/silentTyping/index.tsx +++ b/src/plugins/silentTyping/index.tsx @@ -112,6 +112,7 @@ export default definePlugin({ name: "SilentTyping", authors: [Devs.Ven, Devs.Rini, Devs.ImBanana], description: "Hide that you are typing", + tags: ["Chat", "Privacy"], settings, contextMenus: { diff --git a/src/plugins/sortFriendRequests/index.tsx b/src/plugins/sortFriendRequests/index.tsx index 11a14c154..8f05270f0 100644 --- a/src/plugins/sortFriendRequests/index.tsx +++ b/src/plugins/sortFriendRequests/index.tsx @@ -53,6 +53,7 @@ export default definePlugin({ name: "SortFriendRequests", authors: [Devs.Megu], description: "Sorts friend requests by date of receipt", + tags: ["Friends", "Organisation"], settings, patches: [{ diff --git a/src/plugins/spotifyControls/index.tsx b/src/plugins/spotifyControls/index.tsx index a6bc716e8..29a092eab 100644 --- a/src/plugins/spotifyControls/index.tsx +++ b/src/plugins/spotifyControls/index.tsx @@ -32,6 +32,7 @@ function toggleHoverControls(value: boolean) { export default definePlugin({ name: "SpotifyControls", description: "Adds a Spotify player above the account panel", + tags: ["Media", "Activity"], authors: [Devs.Ven, Devs.afn, Devs.KraXen72, Devs.Av32000, Devs.nin0dev], options: { hoverControls: { diff --git a/src/plugins/spotifyCrack/index.ts b/src/plugins/spotifyCrack/index.ts index 505e53a12..d15d1fd86 100644 --- a/src/plugins/spotifyCrack/index.ts +++ b/src/plugins/spotifyCrack/index.ts @@ -38,6 +38,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SpotifyCrack", description: "Free listen along, no auto-pausing in voice chat, and allows activity to continue playing when idling", + tags: ["Media", "Utility"], authors: [Devs.Cyn, Devs.Nuckyz], settings, diff --git a/src/plugins/spotifyShareCommands/index.ts b/src/plugins/spotifyShareCommands/index.ts index b4a85eb16..ec350a255 100644 --- a/src/plugins/spotifyShareCommands/index.ts +++ b/src/plugins/spotifyShareCommands/index.ts @@ -98,6 +98,7 @@ function makeCommand(name: string, formatUrl: (track: Track) => string): Command export default definePlugin({ name: "SpotifyShareCommands", description: "Share your current Spotify track, album or artist via slash command (/track, /album, /artist)", + tags: ["Media", "Commands"], authors: [Devs.katlyn], commands: [ makeCommand("track", track => `https://open.spotify.com/track/${track.id}`), diff --git a/src/plugins/startupTimings/index.tsx b/src/plugins/startupTimings/index.tsx index 4a8c06807..d61d004eb 100644 --- a/src/plugins/startupTimings/index.tsx +++ b/src/plugins/startupTimings/index.tsx @@ -27,6 +27,7 @@ import StartupTimingPage from "./StartupTimingPage"; export default definePlugin({ name: "StartupTimings", description: "Adds Startup Timings to the Settings menu", + tags: ["Developers"], authors: [Devs.Megu], start() { SettingsPlugin.customEntries.push({ diff --git a/src/plugins/stickerPaste/index.ts b/src/plugins/stickerPaste/index.ts index 8a0082073..0dd0bd2b3 100644 --- a/src/plugins/stickerPaste/index.ts +++ b/src/plugins/stickerPaste/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "StickerPaste", description: "Makes picking a sticker in the sticker picker insert it into the chatbox instead of instantly sending", + tags: ["Emotes", "Chat"], authors: [Devs.ImBanana], patches: [ diff --git a/src/plugins/streamerModeOnStream/index.ts b/src/plugins/streamerModeOnStream/index.ts index b92fb16b6..10c986526 100644 --- a/src/plugins/streamerModeOnStream/index.ts +++ b/src/plugins/streamerModeOnStream/index.ts @@ -37,6 +37,7 @@ function toggleStreamerMode({ streamKey }: StreamEvent, value: boolean) { export default definePlugin({ name: "StreamerModeOnStream", description: "Automatically enables streamer mode when you start streaming in Discord", + tags: ["Privacy", "Utility"], authors: [Devs.IcedMarina], flux: { STREAM_CREATE: d => toggleStreamerMode(d, true), diff --git a/src/plugins/superReactionTweaks/index.ts b/src/plugins/superReactionTweaks/index.ts index abe7bb135..0f262d42b 100644 --- a/src/plugins/superReactionTweaks/index.ts +++ b/src/plugins/superReactionTweaks/index.ts @@ -37,6 +37,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "SuperReactionTweaks", description: "Customize the limit of Super Reactions playing at once, and super react by default", + tags: ["Reactions", "Emotes"], authors: [Devs.FieryFlames, Devs.ant0n], patches: [ { diff --git a/src/plugins/textReplace/index.tsx b/src/plugins/textReplace/index.tsx index 81cea86e0..4ffea1fb1 100644 --- a/src/plugins/textReplace/index.tsx +++ b/src/plugins/textReplace/index.tsx @@ -269,6 +269,7 @@ const TEXT_REPLACE_RULES_CHANNEL_ID = "1102784112584040479"; export default definePlugin({ name: "TextReplace", description: "Replace text in your messages. You can find pre-made rules in the #textreplace-rules channel in Vencord's Server", + tags: ["Chat", "Customisation", "Utility"], authors: [Devs.AutumnVN, Devs.TheKodeToad], settings, diff --git a/src/plugins/themeAttributes/index.ts b/src/plugins/themeAttributes/index.ts index bc50571e8..f7ac5ad62 100644 --- a/src/plugins/themeAttributes/index.ts +++ b/src/plugins/themeAttributes/index.ts @@ -14,6 +14,7 @@ import { UserStore } from "@webpack/common"; export default definePlugin({ name: "ThemeAttributes", description: "Adds data attributes to various elements for theming purposes", + tags: ["Appearance", "Customisation"], authors: [Devs.Ven, Devs.Board], patches: [ diff --git a/src/plugins/translate/index.tsx b/src/plugins/translate/index.tsx index be9c5d279..c62a3860d 100644 --- a/src/plugins/translate/index.tsx +++ b/src/plugins/translate/index.tsx @@ -64,6 +64,7 @@ let tooltipTimeout: any; export default definePlugin({ name: "Translate", description: "Translate messages with Google Translate or DeepL", + tags: ["Chat", "Utility"], authors: [Devs.Ven, Devs.AshtonMemer], settings, contextMenus: { diff --git a/src/plugins/typingIndicator/index.tsx b/src/plugins/typingIndicator/index.tsx index 2e7c9cff2..077044e23 100644 --- a/src/plugins/typingIndicator/index.tsx +++ b/src/plugins/typingIndicator/index.tsx @@ -161,6 +161,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "TypingIndicator", description: "Adds an indicator if someone is typing on a channel.", + tags: ["Notifications", "Appearance", "Servers"], authors: [Devs.Nuckyz, Devs.fawn, Devs.Sqaaakoi], settings, diff --git a/src/plugins/typingTweaks/index.tsx b/src/plugins/typingTweaks/index.tsx index 9e92ce80b..495ba78b5 100644 --- a/src/plugins/typingTweaks/index.tsx +++ b/src/plugins/typingTweaks/index.tsx @@ -95,6 +95,7 @@ const TypingUser = ErrorBoundary.wrap(function TypingUser({ user, guildId }: Typ export default definePlugin({ name: "TypingTweaks", description: "Show avatars and role colours in the typing indicator", + tags: ["Appearance", "Customisation"], authors: [Devs.zt, Devs.sadan], settings, diff --git a/src/plugins/unindent/index.ts b/src/plugins/unindent/index.ts index 1a548a68e..007993cf0 100644 --- a/src/plugins/unindent/index.ts +++ b/src/plugins/unindent/index.ts @@ -23,6 +23,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "Unindent", description: "Trims leading indentation from codeblocks", + tags: ["Chat", "Utility"], authors: [Devs.Ven], patches: [ diff --git a/src/plugins/unlockedAvatarZoom/index.ts b/src/plugins/unlockedAvatarZoom/index.ts index dc8de74db..fbab2b734 100644 --- a/src/plugins/unlockedAvatarZoom/index.ts +++ b/src/plugins/unlockedAvatarZoom/index.ts @@ -20,6 +20,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UnlockedAvatarZoom", description: "Allows you to zoom in further in the image crop tool when changing your avatar", + tags: ["Media", "Utility"], authors: [Devs.nakoyasha], settings, patches: [ diff --git a/src/plugins/unsuppressEmbeds/index.tsx b/src/plugins/unsuppressEmbeds/index.tsx index 9eecd86d7..4c25ffea0 100644 --- a/src/plugins/unsuppressEmbeds/index.tsx +++ b/src/plugins/unsuppressEmbeds/index.tsx @@ -63,6 +63,7 @@ export default definePlugin({ name: "UnsuppressEmbeds", authors: [Devs.rad, Devs.HypedDomi], description: "Allows you to unsuppress embeds in messages", + tags: ["Chat", "Utility"], contextMenus: { "message": messageContextMenuPatch } diff --git a/src/plugins/userMessagesPronouns/index.ts b/src/plugins/userMessagesPronouns/index.ts index 56721e11f..1088e2f20 100644 --- a/src/plugins/userMessagesPronouns/index.ts +++ b/src/plugins/userMessagesPronouns/index.ts @@ -28,6 +28,7 @@ export default definePlugin({ name: "UserMessagesPronouns", authors: [Devs.Tyman, Devs.TheKodeToad, Devs.Ven, Devs.Elvyra], description: "Adds pronouns to chat user messages", + tags: ["Chat", "Appearance"], settings, patches: [ diff --git a/src/plugins/userVoiceShow/index.tsx b/src/plugins/userVoiceShow/index.tsx index 5a9a85add..2d05c2588 100644 --- a/src/plugins/userVoiceShow/index.tsx +++ b/src/plugins/userVoiceShow/index.tsx @@ -50,6 +50,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UserVoiceShow", description: "Shows an indicator when a user is in a Voice Channel", + tags: ["Voice", "Appearance", "Friends"], authors: [Devs.Nuckyz, Devs.LordElias], dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI"], settings, diff --git a/src/plugins/usrbg/index.tsx b/src/plugins/usrbg/index.tsx index 36efe355e..01b85eb76 100644 --- a/src/plugins/usrbg/index.tsx +++ b/src/plugins/usrbg/index.tsx @@ -50,6 +50,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "USRBG", description: "Displays user banners from USRBG, allowing anyone to get a banner without Nitro", + tags: ["Appearance", "Customisation"], authors: [Devs.AutumnVN, Devs.katlyn, Devs.pylix, Devs.TheKodeToad], settings, patches: [ diff --git a/src/plugins/validReply/index.ts b/src/plugins/validReply/index.ts index 2ca072040..988d67cf4 100644 --- a/src/plugins/validReply/index.ts +++ b/src/plugins/validReply/index.ts @@ -33,6 +33,7 @@ const createMessageRecord = findByCodeLazy(".createFromServer(", ".isBlockedForM export default definePlugin({ name: "ValidReply", description: 'Fixes "Message could not be loaded" upon hovering over the reply', + tags: ["Chat", "Utility"], authors: [Devs.newwares], patches: [ { diff --git a/src/plugins/validUser/index.tsx b/src/plugins/validUser/index.tsx index 488b6bd65..e23211867 100644 --- a/src/plugins/validUser/index.tsx +++ b/src/plugins/validUser/index.tsx @@ -175,8 +175,9 @@ function MentionWrapper({ data, UserMention, RoleMention, parse, props }: Mentio export default definePlugin({ name: "ValidUser", description: "Fix mentions for unknown users showing up as '@unknown-user' (hover over a mention to fix it)", + tags: ["Chat", "Utility"], authors: [Devs.Ven, Devs.Dolfies], - tags: ["MentionCacheFix"], + searchTerms: ["MentionCacheFix"], patches: [ { diff --git a/src/plugins/vcDoubleClick/index.ts b/src/plugins/vcDoubleClick/index.ts index 8d4cae6a9..deadebd0a 100644 --- a/src/plugins/vcDoubleClick/index.ts +++ b/src/plugins/vcDoubleClick/index.ts @@ -28,6 +28,7 @@ const timers = {} as Record { export default definePlugin({ name: "VoiceMessages", description: "Allows you to send voice messages like on mobile. To do so, right click the upload button and click Send Voice Message", + tags: ["Voice"], authors: [Devs.Ven, Devs.Vap, Devs.Nickyux], settings, contextMenus: { diff --git a/src/plugins/volumeBooster/index.ts b/src/plugins/volumeBooster/index.ts index 4ab0c332a..e379686ad 100644 --- a/src/plugins/volumeBooster/index.ts +++ b/src/plugins/volumeBooster/index.ts @@ -51,6 +51,7 @@ export default definePlugin({ name: "VolumeBooster", authors: [Devs.Nuckyz, Devs.sadan], description: "Allows you to set the user and stream volume above the default maximum", + tags: ["Voice", "Utility"], settings, patches: [ diff --git a/src/plugins/webContextMenus.web/index.ts b/src/plugins/webContextMenus.web/index.ts index e4b9c510f..170f0719f 100644 --- a/src/plugins/webContextMenus.web/index.ts +++ b/src/plugins/webContextMenus.web/index.ts @@ -78,6 +78,7 @@ function fixImageUrl(urlString: string) { export default definePlugin({ name: "WebContextMenus", description: "Re-adds context menus missing in the web version of Discord: Links & Images (Copy/Open Link/Image), Text Area (Copy, Cut, Paste, SpellCheck)", + tags: ["Utility"], authors: [Devs.Ven], enabledByDefault: true, required: IS_VESKTOP, diff --git a/src/plugins/webKeybinds.web/index.ts b/src/plugins/webKeybinds.web/index.ts index 783f965d9..74b88d79d 100644 --- a/src/plugins/webKeybinds.web/index.ts +++ b/src/plugins/webKeybinds.web/index.ts @@ -26,6 +26,7 @@ const KeyBinds = findByPropsLazy("JUMP_TO_GUILD", "SERVER_NEXT"); export default definePlugin({ name: "WebKeybinds", description: "Re-adds keybinds missing in the web version of Discord: ctrl+t, ctrl+shift+t, ctrl+tab, ctrl+shift+tab, ctrl+1-9, ctrl+,. Only works fully on Vesktop/Legcord, not inside your browser", + tags: ["Shortcuts"], authors: [Devs.Ven], enabledByDefault: true, diff --git a/src/plugins/webScreenShareFixes.web/index.ts b/src/plugins/webScreenShareFixes.web/index.ts index e7fbc178e..ac06a00e2 100644 --- a/src/plugins/webScreenShareFixes.web/index.ts +++ b/src/plugins/webScreenShareFixes.web/index.ts @@ -11,6 +11,7 @@ export default definePlugin({ name: "WebScreenShareFixes", authors: [Devs.Kaitlyn], description: "Removes 2500kbps bitrate cap on chromium and vesktop clients.", + tags: ["Voice"], enabledByDefault: true, patches: [ diff --git a/src/plugins/whoReacted/index.tsx b/src/plugins/whoReacted/index.tsx index 7a39f35b2..0eb0a7d0f 100644 --- a/src/plugins/whoReacted/index.tsx +++ b/src/plugins/whoReacted/index.tsx @@ -78,6 +78,7 @@ function handleClickAvatar(event: React.UIEvent) { export default definePlugin({ name: "WhoReacted", description: "Renders the avatars of users who reacted to a message", + tags: ["Reactions", "Chat", "Appearance"], authors: [Devs.Ven, Devs.KannaDev, Devs.newwares], patches: [ diff --git a/src/plugins/xsOverlay/index.tsx b/src/plugins/xsOverlay/index.tsx index ba1849425..434236746 100644 --- a/src/plugins/xsOverlay/index.tsx +++ b/src/plugins/xsOverlay/index.tsx @@ -188,8 +188,9 @@ const Native = VencordNative.pluginHelpers.XSOverlay as PluginNative string; export interface PatchReplacement { @@ -100,6 +126,9 @@ export type IconProps = { height?: number | string; width?: number | string; cla export interface PluginDef { name: string; description: string; + /** Additional search terms that will bring up your plugin */ + searchTerms?: string[]; + tags?: PluginTag[]; authors: PluginAuthor[]; start?(): void; stop?(): void; @@ -177,8 +206,6 @@ export interface PluginDef { */ toolboxActions?: Record void> | (() => ReactNode); - tags?: string[]; - /** * Managed style to automatically enable and disable when the plugin is enabled or disabled */ From 402c8521a58d21196bca1347e651cc6522e703da Mon Sep 17 00:00:00 2001 From: Vendicated Date: Thu, 16 Apr 2026 04:01:24 +0200 Subject: [PATCH 029/247] Fix ViewIcons, MutualGroupDMs --- src/plugins/mutualGroupDMs/index.tsx | 2 +- src/plugins/viewIcons/index.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/mutualGroupDMs/index.tsx b/src/plugins/mutualGroupDMs/index.tsx index ea2bca17f..88cc6d15a 100644 --- a/src/plugins/mutualGroupDMs/index.tsx +++ b/src/plugins/mutualGroupDMs/index.tsx @@ -35,7 +35,7 @@ const UserUtils = findByPropsLazy("getGlobalName"); const ProfileListClasses = findCssClassesLazy("empty", "textContainer", "connectionIcon"); const TabBarClasses = findCssClassesLazy("tabPanelScroller", "tabBarPanel"); const MutualsListClasses = findCssClassesLazy("row", "icon", "name", "details"); -const ExpandableList = findComponentByCodeLazy('action:"PRESS_SECTION"', "section"); +const ExpandableList = findComponentByCodeLazy('action:"PRESS_SECTION"', '"section"'); function getGroupDMName(channel: Channel) { return channel.name || diff --git a/src/plugins/viewIcons/index.tsx b/src/plugins/viewIcons/index.tsx index 5ede42f59..51c6885ce 100644 --- a/src/plugins/viewIcons/index.tsx +++ b/src/plugins/viewIcons/index.tsx @@ -198,10 +198,10 @@ export default definePlugin({ patches: [ // Avatar component used in User DMs "User Profile" popup in the right and User Profile Modal pfp { - find: ".AVATAR),{trackUserProfileAction:", + find: "return{avatarProps:{", replacement: { - match: /avatarSrc:(\i),eventHandlers:(\i).+?"div",.{0,100}className:\i,/, - replace: "$&style:{cursor:\"pointer\"},onClick:()=>{$self.openAvatar($1)},", + match: /(?<=avatarProps:(\i),eventHandlers:(\i).{0,50}?)return null==/, + replace: 'Object.assign($2,{style:{cursor:"pointer"},onClick:()=>$self.openAvatar($1.src)});$&', } }, // Banners From e836846a2e8b0ef1e89e9a66ab84f2b506caf23a Mon Sep 17 00:00:00 2001 From: Vendicated Date: Thu, 16 Apr 2026 04:19:42 +0200 Subject: [PATCH 030/247] upgrade dependencies --- package.json | 44 +- pnpm-lock.yaml | 2117 ++++++++++------- src/api/PluginManager.ts | 4 +- .../settings/tabs/plugins/PluginCard.tsx | 2 +- src/debug/loadLazyChunks.ts | 2 +- src/plugins/consoleShortcuts/index.ts | 2 +- src/plugins/implicitRelationships/index.ts | 26 +- src/utils/text.ts | 1 - src/webpack/patchWebpack.ts | 2 +- src/webpack/webpack.ts | 2 +- tsconfig.json | 25 +- 11 files changed, 1351 insertions(+), 876 deletions(-) diff --git a/package.json b/package.json index 42821bdc0..aef46773b 100644 --- a/package.json +++ b/package.json @@ -40,44 +40,44 @@ "@vap/shiki": "0.10.5", "fflate": "^0.8.2", "gifenc": "github:mattdesl/gifenc#64842fca317b112a8590f8fef2bf3825da8f6fe3", - "monaco-editor": "^0.54.0", + "monaco-editor": "^0.55.1", "nanoid": "^5.1.6", "virtual-merge": "^1.0.1" }, "devDependencies": { - "@stylistic/eslint-plugin": "^5.6.0", - "@types/chrome": "^0.1.30", - "@types/lodash": "^4.17.20", - "@types/node": "^24.10.1", + "@stylistic/eslint-plugin": "^5.10.0", + "@types/chrome": "^0.1.40", + "@types/lodash": "^4.17.24", + "@types/node": "^25.6.0", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", - "@types/yazl": "^3.3.0", + "@types/yazl": "^3.3.1", "@vencord/discord-types": "link:packages/discord-types", - "diff": "^8.0.2", - "esbuild": "^0.27.0", - "eslint": "9.39.1", + "diff": "^9.0.0", + "esbuild": "^0.28.0", + "eslint": "10.2.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-path-alias": "2.1.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-simple-header": "^1.2.1", - "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-unused-imports": "^4.3.0", + "eslint-plugin-simple-import-sort": "^13.0.0", + "eslint-plugin-unused-imports": "^4.4.1", "highlight.js": "11.11.1", "html-minifier-terser": "^7.2.0", "moment": "^2.22.2", "p-limit": "^7.3.0", - "puppeteer-core": "^24.30.0", - "standalone-electron-types": "^34.2.0", - "stylelint": "^16.25.0", - "stylelint-config-standard": "^39.0.1", - "svgo": "^4.0.0", + "puppeteer-core": "^24.41.0", + "standalone-electron-types": "^41.2.1", + "stylelint": "^17.8.0", + "stylelint-config-standard": "^40.0.0", + "svgo": "^4.0.1", "ts-patch": "^3.3.0", - "ts-pattern": "^5.6.0", - "tsx": "^4.20.6", - "type-fest": "^5.2.0", - "typescript": "^5.9.3", - "typescript-eslint": "^8.47.0", - "typescript-transform-paths": "^3.5.5", + "ts-pattern": "^5.9.0", + "tsx": "^4.21.0", + "type-fest": "^5.5.0", + "typescript": "^6.0.2", + "typescript-eslint": "^8.58.2", + "typescript-transform-paths": "^3.5.6", "zip-local": "^0.3.5" }, "packageManager": "pnpm@10.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baca9c229..4008f9efc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,8 +29,8 @@ importers: specifier: github:mattdesl/gifenc#64842fca317b112a8590f8fef2bf3825da8f6fe3 version: https://codeload.github.com/mattdesl/gifenc/tar.gz/64842fca317b112a8590f8fef2bf3825da8f6fe3 monaco-editor: - specifier: ^0.54.0 - version: 0.54.0 + specifier: ^0.55.1 + version: 0.55.1 nanoid: specifier: ^5.1.6 version: 5.1.6 @@ -39,17 +39,17 @@ importers: version: 1.0.2 devDependencies: '@stylistic/eslint-plugin': - specifier: ^5.6.0 - version: 5.6.0(eslint@9.39.1) + specifier: ^5.10.0 + version: 5.10.0(eslint@10.2.0) '@types/chrome': - specifier: ^0.1.30 - version: 0.1.30 + specifier: ^0.1.40 + version: 0.1.40 '@types/lodash': - specifier: ^4.17.20 - version: 4.17.20 + specifier: ^4.17.24 + version: 4.17.24 '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.6.0 + version: 25.6.0 '@types/react': specifier: ^19.0.10 version: 19.0.12 @@ -57,38 +57,38 @@ importers: specifier: ^19.0.4 version: 19.0.4(@types/react@19.0.12) '@types/yazl': - specifier: ^3.3.0 - version: 3.3.0 + specifier: ^3.3.1 + version: 3.3.1 '@vencord/discord-types': specifier: link:packages/discord-types version: link:packages/discord-types diff: - specifier: ^8.0.2 - version: 8.0.2 + specifier: ^9.0.0 + version: 9.0.0 esbuild: - specifier: ^0.27.0 - version: 0.27.0 + specifier: ^0.28.0 + version: 0.28.0 eslint: - specifier: 9.39.1 - version: 9.39.1 + specifier: 10.2.0 + version: 10.2.0 eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)) + version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)) eslint-plugin-path-alias: specifier: 2.1.0 - version: 2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.39.1) + version: 2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@10.2.0) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.1) + version: 7.37.5(eslint@10.2.0) eslint-plugin-simple-header: specifier: ^1.2.1 - version: 1.2.2(eslint@9.39.1) + version: 1.2.2(eslint@10.2.0) eslint-plugin-simple-import-sort: - specifier: ^12.1.1 - version: 12.1.1(eslint@9.39.1) + specifier: ^13.0.0 + version: 13.0.0(eslint@10.2.0) eslint-plugin-unused-imports: - specifier: ^4.3.0 - version: 4.3.0(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + specifier: ^4.4.1 + version: 4.4.1(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -102,41 +102,41 @@ importers: specifier: ^7.3.0 version: 7.3.0 puppeteer-core: - specifier: ^24.30.0 - version: 24.30.0 + specifier: ^24.41.0 + version: 24.41.0 standalone-electron-types: - specifier: ^34.2.0 - version: 34.2.0 + specifier: ^41.2.1 + version: 41.2.1 stylelint: - specifier: ^16.25.0 - version: 16.25.0(typescript@5.9.3) + specifier: ^17.8.0 + version: 17.8.0(typescript@6.0.2) stylelint-config-standard: - specifier: ^39.0.1 - version: 39.0.1(stylelint@16.25.0(typescript@5.9.3)) + specifier: ^40.0.0 + version: 40.0.0(stylelint@17.8.0(typescript@6.0.2)) svgo: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^4.0.1 + version: 4.0.1 ts-patch: specifier: ^3.3.0 version: 3.3.0 ts-pattern: - specifier: ^5.6.0 - version: 5.6.2 + specifier: ^5.9.0 + version: 5.9.0 tsx: - specifier: ^4.20.6 - version: 4.20.6 + specifier: ^4.21.0 + version: 4.21.0 type-fest: - specifier: ^5.2.0 - version: 5.2.0 + specifier: ^5.5.0 + version: 5.5.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.2 + version: 6.0.2 typescript-eslint: - specifier: ^8.47.0 - version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) + specifier: ^8.58.2 + version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) typescript-transform-paths: - specifier: ^3.5.5 - version: 3.5.5(typescript@5.9.3) + specifier: ^3.5.6 + version: 3.5.6(typescript@6.0.2) zip-local: specifier: ^0.3.5 version: 0.3.5 @@ -195,45 +195,63 @@ importers: packages: - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@cacheable/memory@2.0.5': - resolution: {integrity: sha512-fkiAxCvssEyJZ5fxX4tcdZFRmW9JehSTGvvqmXn6rTzG5cH6V/3C4ad8yb01vOjp2xBydHkHrgpW0qeGtzt6VQ==} + '@cacheable/memory@2.0.8': + resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==} - '@cacheable/utils@2.3.1': - resolution: {integrity: sha512-38NJXjIr4W1Sghun8ju+uYWD8h2c61B4dKwfnQHVDFpAJ9oS28RpfqZQJ6Dgd3RceGkILDY9YT+72HJR3LoeSQ==} + '@cacheable/utils@2.4.1': + resolution: {integrity: sha512-eiFgzCbIneyMlLOmNG4g9xzF7Hv3Mga4LjxjcSC/ues6VYq2+gUbQI8JqNuw/ZM8tJIeIaBGpswAsqV2V7ApgA==} - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} - - '@csstools/media-query-list-parser@4.0.3': - resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} - engines: {node: '>=18'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/selector-specificity@5.0.0': - resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} peerDependencies: - postcss-selector-parser: ^7.0.0 + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@dual-bundle/import-meta-resolve@4.2.1': - resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + + '@csstools/media-query-list-parser@5.0.0': + resolution: {integrity: sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/selector-resolve-nested@4.0.0': + resolution: {integrity: sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 + + '@csstools/selector-specificity@6.0.0': + resolution: {integrity: sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} @@ -241,8 +259,14 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.0': - resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -253,8 +277,14 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.0': - resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -265,8 +295,14 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.0': - resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -277,8 +313,14 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.0': - resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -289,8 +331,14 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.0': - resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -301,8 +349,14 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.0': - resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -313,8 +367,14 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.0': - resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -325,8 +385,14 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.0': - resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -337,8 +403,14 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.0': - resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -349,8 +421,14 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.0': - resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -361,8 +439,14 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.0': - resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -373,8 +457,14 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.0': - resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -385,8 +475,14 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.0': - resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -397,8 +493,14 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.0': - resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -409,8 +511,14 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.0': - resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -421,8 +529,14 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.0': - resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -433,8 +547,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.0': - resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -445,8 +565,14 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.0': - resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -457,8 +583,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.0': - resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -469,8 +601,14 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.0': - resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -481,8 +619,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.0': - resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -493,8 +637,14 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.0': - resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -505,8 +655,14 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.0': - resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -517,8 +673,14 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.0': - resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -529,8 +691,14 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.0': - resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -541,14 +709,20 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.0': - resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -557,33 +731,25 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -625,11 +791,11 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@keyv/bigmap@1.3.0': - resolution: {integrity: sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} peerDependencies: - keyv: ^5.5.4 + keyv: ^5.6.0 '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} @@ -646,25 +812,32 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@puppeteer/browsers@2.10.13': - resolution: {integrity: sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==} + '@puppeteer/browsers@2.13.0': + resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} engines: {node: '>=18'} hasBin: true '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@stylistic/eslint-plugin@5.6.0': - resolution: {integrity: sha512-owEc4B8ME+O/xyZOkLVyLqPMsUgJXIM4XzCm5Vt3WvRXpyoOfYxgA+JkEiFqXPCI8+Nc2BzAT+KGAK7QleGs8Q==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=9.0.0' + eslint: ^9.0.0 || ^10.0.0 '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/chrome@0.1.30': - resolution: {integrity: sha512-rcP14i+ip4s3SLG6JzNOWIDd+0i8Bg+kBslHl8d4g6m/e2kEbWnR90AtlOPUZj9ONVRbKxnQUqsInxFzXyqLdA==} + '@types/chrome@0.1.40': + resolution: {integrity: sha512-UnfyRAe8ORu9HSuTH0EqyOEUin3JrWW9Nl/gDXezNfTUrfIoxw+WRZgKOxGz0t5BnjbfXBnS2eCYfW2PxH1wcA==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -693,17 +866,17 @@ packages: '@types/lodash@4.17.15': resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} - '@types/lodash@4.17.20': - resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + '@types/lodash@4.17.24': + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} '@types/node@22.13.13': resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} - '@types/node@22.19.1': - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + '@types/node@22.19.17': + resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -722,69 +895,72 @@ packages: '@types/react@19.0.12': resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@types/yazl@3.3.0': - resolution: {integrity: sha512-mFL6lGkk2N5u5nIxpNV/K5LW3qVSbxhJrMxYGOOxZndWxMgCamr/iCsq/1t9kd8pEwhuNP91LC5qZm/qS9pOEw==} + '@types/yazl@3.3.1': + resolution: {integrity: sha512-DIWfCKpsTp6hE5BDBHV3+fIL/bLUF9Bv13iDrWnMlmhQpH67buNvI291ZauQ1xcccxK3FqQ9honnXpq4R8NMuQ==} - '@typescript-eslint/eslint-plugin@8.47.0': - resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} + '@typescript-eslint/eslint-plugin@8.58.2': + resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.47.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.58.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.47.0': - resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} + '@typescript-eslint/parser@8.58.2': + resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.47.0': - resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} + '@typescript-eslint/project-service@8.58.2': + resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.47.0': - resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} + '@typescript-eslint/scope-manager@8.58.2': + resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.47.0': - resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} + '@typescript-eslint/tsconfig-utils@8.58.2': + resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.47.0': - resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} + '@typescript-eslint/type-utils@8.58.2': + resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.47.0': - resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} + '@typescript-eslint/types@8.58.2': + resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.47.0': - resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} + '@typescript-eslint/typescript-estree@8.58.2': + resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.47.0': - resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} + '@typescript-eslint/utils@8.58.2': + resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.47.0': - resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} + '@typescript-eslint/visitor-keys@8.58.2': + resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vap/core@0.0.12': @@ -808,8 +984,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -817,16 +993,20 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -850,10 +1030,6 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} @@ -910,8 +1086,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + b4a@1.8.0: + resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} peerDependencies: react-native-b4a: '*' peerDependenciesMeta: @@ -921,8 +1097,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@2.0.0: - resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} @@ -932,8 +1109,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.1: - resolution: {integrity: sha512-zGUCsm3yv/ePt2PHNbVxjjn0nNB1MkIaR4wOCxJ2ig5pCf5cCVAYJXVhQg/3OhhJV6DB1ts7Hv0oUaElc2TPQg==} + bare-fs@4.7.1: + resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -941,35 +1118,37 @@ packages: bare-buffer: optional: true - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + bare-os@3.8.7: + resolution: {integrity: sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.7.0: - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + bare-stream@2.13.0: + resolution: {integrity: sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==} peerDependencies: + bare-abort-controller: '*' bare-buffer: '*' bare-events: '*' peerDependenciesMeta: + bare-abort-controller: + optional: true bare-buffer: optional: true bare-events: optional: true - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + bare-url@2.4.0: + resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + basic-ftp@5.3.0: + resolution: {integrity: sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w==} engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -977,8 +1156,15 @@ packages: brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -994,8 +1180,8 @@ packages: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} - cacheable@2.2.0: - resolution: {integrity: sha512-LEJxRqfeomiiRd2t0uON6hxAtgOoWDfY3fugebbz+J3vDLO+SkdfFChQcOHTZhj9SYa9iwE9MGYNX72dKiOE4w==} + cacheable@2.3.4: + resolution: {integrity: sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -1005,6 +1191,10 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -1020,8 +1210,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chromium-bidi@11.0.0: - resolution: {integrity: sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==} + chromium-bidi@14.0.0: + resolution: {integrity: sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==} peerDependencies: devtools-protocol: '*' @@ -1072,8 +1262,8 @@ packages: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1085,9 +1275,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-functions-list@3.2.3: - resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} - engines: {node: '>=12 || >=16'} + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -1096,8 +1286,8 @@ packages: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.2.2: @@ -1191,17 +1381,13 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - devtools-protocol@0.0.1521046: - resolution: {integrity: sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==} + devtools-protocol@0.0.1595872: + resolution: {integrity: sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==} - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1216,8 +1402,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.1.7: - resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} @@ -1250,6 +1436,10 @@ packages: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1283,8 +1473,13 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.0: - resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} hasBin: true @@ -1307,8 +1502,8 @@ packages: peerDependencies: eslint-plugin-import: '>=1.4.0' - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} eslint-module-utils@2.12.1: resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} @@ -1357,23 +1552,23 @@ packages: peerDependencies: eslint: '>=8.41.0' - eslint-plugin-simple-import-sort@12.1.1: - resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} + eslint-plugin-simple-import-sort@13.0.0: + resolution: {integrity: sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==} peerDependencies: eslint: '>=5.0.0' - eslint-plugin-unused-imports@4.3.0: - resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} + eslint-plugin-unused-imports@4.4.1: + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^9.0.0 || ^8.0.0 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -1383,9 +1578,13 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.2.0: + resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -1397,13 +1596,17 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1464,17 +1667,26 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@10.1.4: - resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} + file-entry-cache@11.1.2: + resolution: {integrity: sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -1500,11 +1712,11 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.19: - resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} + flat-cache@6.1.22: + resolution: {integrity: sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug==} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} @@ -1545,6 +1757,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1564,8 +1780,8 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} @@ -1607,17 +1823,13 @@ packages: resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==} engines: {node: '>=16'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@16.2.0: + resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} + engines: {node: '>=20'} globjoin@0.1.4: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} @@ -1629,9 +1841,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1640,6 +1849,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -1671,8 +1884,8 @@ packages: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} - hashery@1.2.0: - resolution: {integrity: sha512-43XJKpwle72Ik5Zpam7MuzRWyNdwwdf6XHlh8wCj2PggvWf+v/Dm5B0dxGZOmddidgeO6Ofu9As/o231Ti/9PA==} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} engines: {node: '>=20'} hasown@2.0.2: @@ -1687,17 +1900,20 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookified@1.13.0: - resolution: {integrity: sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.1.1: + resolution: {integrity: sha512-AHb76R16GB5EsPBE2J7Ko5kiEyXwviB9P5SMrAKcuAu4vJPZttViAbj9+tZeaQE5zjDme+1vcHP78Yj/WoAveA==} html-minifier-terser@7.2.0: resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} + html-tags@5.1.0: + resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} + engines: {node: '>=20.10'} http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} @@ -1719,6 +1935,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1840,6 +2059,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -1955,8 +2178,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.4: - resolution: {integrity: sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} @@ -1970,9 +2193,6 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.37.0: - resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1984,9 +2204,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -2018,18 +2235,18 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mathml-tag-names@2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + mathml-tag-names@4.0.0: + resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -2039,11 +2256,18 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -2059,8 +2283,8 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - monaco-editor@0.54.0: - resolution: {integrity: sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==} + monaco-editor@0.55.1: + resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -2085,13 +2309,17 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + netmask@2.1.1: + resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} engines: {node: '>= 0.4.0'} no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2210,46 +2438,39 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-resolve-nested-selector@0.1.6: - resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - postcss-safe-parser@7.0.1: resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} engines: {node: '>=18.0'} peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2270,15 +2491,15 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.30.0: - resolution: {integrity: sha512-2S3Smy0t0W4wJnNvDe7W0bE7wDmZjfZ3ljfMgJd6hn2Hq/f0jgN+x9PULZo2U3fu5UUIJ+JP8cNUGllu8P91Pg==} + puppeteer-core@24.41.0: + resolution: {integrity: sha512-rLIUri7E/NQ3APSEYCCozaSJx0u8Tu9wxO6BJwnvXmIgILSK3L0TombaVh3izp1njAGrO6H2ru0hcIrLF+gWLw==} engines: {node: '>=18'} q@1.5.1: @@ -2289,8 +2510,8 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qified@0.5.2: - resolution: {integrity: sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==} + qified@0.9.1: + resolution: {integrity: sha512-n7mar4T0xQ+39dE2vGTAlbxUEpndwPANH0kDef1/MYsB8Bba9wshkybIRx74qgcvKQPEWErf9AqAdYjhzY2Ilg==} engines: {node: '>=20'} queue-microtask@1.2.3: @@ -2331,10 +2552,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -2347,15 +2564,15 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true - resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + engines: {node: '>= 0.4'} + hasBin: true + ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -2382,8 +2599,9 @@ packages: safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - sax@1.4.3: - resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -2394,8 +2612,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true @@ -2443,9 +2661,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} @@ -2494,8 +2712,8 @@ packages: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} - standalone-electron-types@34.2.0: - resolution: {integrity: sha512-+BIrNe0TdZBBBRS3G/F7cPbuBipSZylSjSrJu9+sjw84+vz36a5oZ7l9NeH7aXgMWmPzPZKsTm+K0nOIvhENJQ==} + standalone-electron-types@41.2.1: + resolution: {integrity: sha512-0NAQpGYvxpqZ87SNaWyJhmgmIZ3vkPkES01j3etqSoRepINU/LpNy9bk4Pyp/4me6rCs11jPoWqzQCEn+e+d6Q==} static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} @@ -2505,13 +2723,17 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + streamx@2.25.0: + resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} + string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -2535,38 +2757,42 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - stylelint-config-recommended@17.0.0: - resolution: {integrity: sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==} - engines: {node: '>=18.12.0'} + stylelint-config-recommended@18.0.0: + resolution: {integrity: sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==} + engines: {node: '>=20.19.0'} peerDependencies: - stylelint: ^16.23.0 + stylelint: ^17.0.0 - stylelint-config-standard@39.0.1: - resolution: {integrity: sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A==} - engines: {node: '>=18.12.0'} + stylelint-config-standard@40.0.0: + resolution: {integrity: sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==} + engines: {node: '>=20.19.0'} peerDependencies: - stylelint: ^16.23.0 + stylelint: ^17.0.0 - stylelint@16.25.0: - resolution: {integrity: sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==} - engines: {node: '>=18.12.0'} + stylelint@17.8.0: + resolution: {integrity: sha512-oHkld9T60LDSaUQ4CSVc+tlt9eUoDlxhaGWShsUCKyIL14boZfmK5bSphZqx64aiC5tCqX+BsQMTMoSz8D1zIg==} + engines: {node: '>=20.19.0'} hasBin: true + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-hyperlinks@3.2.0: - resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} - engines: {node: '>=14.18'} + supports-hyperlinks@4.4.0: + resolution: {integrity: sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==} + engines: {node: '>=20'} supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -2575,8 +2801,8 @@ packages: svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - svgo@4.0.0: - resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} engines: {node: '>=16'} hasBin: true @@ -2588,19 +2814,26 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + tar-fs@3.1.2: + resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar-stream@3.1.8: + resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} terser@5.39.0: resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} hasBin: true - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} @@ -2614,8 +2847,8 @@ packages: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2627,6 +2860,9 @@ packages: ts-pattern@5.6.2: resolution: {integrity: sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==} + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2638,8 +2874,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tsx@4.20.6: - resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true @@ -2655,8 +2891,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.2.0: - resolution: {integrity: sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==} + type-fest@5.5.0: + resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} engines: {node: '>=20'} typed-array-buffer@1.0.3: @@ -2675,23 +2911,23 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + typed-query-selector@2.12.1: + resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} - typescript-eslint@8.47.0: - resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} + typescript-eslint@8.58.2: + resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - typescript-transform-paths@3.5.5: - resolution: {integrity: sha512-RMK86wKe/4+ad+3kMT9SKAs3K0tUHLe7hF+MLbD6VpC9VUmFuKorhf3pHz+qO5GdS4mUp2ncNUo14j6ws9UvBQ==} + typescript-transform-paths@3.5.6: + resolution: {integrity: sha512-3eQTG6Ogt+pgPEh45uX2s9OwcfAVjWnyNO+osjYcOqYaWDVMIFUkqW8e0O1cOaVwdMqQFQf6alDT+76xmeS2Ag==} peerDependencies: typescript: '>=3.6.5' - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} engines: {node: '>=14.17'} hasBin: true @@ -2705,8 +2941,12 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} @@ -2743,8 +2983,8 @@ packages: vscode-textmate@5.2.0: resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} - webdriver-bidi-protocol@0.3.8: - resolution: {integrity: sha512-21Yi2GhGntMc671vNBCjiAeEVknXjVRoyu+k+9xOMShu+ZQfpGQwnBqbNz/Sv4GXZ6JmutlPAi2nIJcrymAWuQ==} + webdriver-bidi-protocol@0.4.1: + resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} @@ -2762,6 +3002,10 @@ packages: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -2787,12 +3031,12 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2834,7 +3078,7 @@ packages: snapshots: - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 @@ -2842,235 +3086,308 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@cacheable/memory@2.0.5': + '@cacheable/memory@2.0.8': dependencies: - '@cacheable/utils': 2.3.1 - '@keyv/bigmap': 1.3.0(keyv@5.5.4) - hookified: 1.13.0 - keyv: 5.5.4 + '@cacheable/utils': 2.4.1 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 - '@cacheable/utils@2.3.1': + '@cacheable/utils@2.4.1': dependencies: - hashery: 1.2.0 - keyv: 5.5.4 + hashery: 1.5.1 + keyv: 5.6.0 - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-tokenizer@3.0.4': {} - - '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-tokenizer': 4.0.0 - '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@csstools/media-query-list-parser@5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - postcss-selector-parser: 7.1.0 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@dual-bundle/import-meta-resolve@4.2.1': {} + '@csstools/selector-resolve-nested@4.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 + + '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/aix-ppc64@0.27.0': + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/aix-ppc64@0.28.0': optional: true '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm64@0.27.0': + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.0': optional: true '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.27.0': + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.0': optional: true '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.27.0': + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.0': optional: true '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.27.0': + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.0': optional: true '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.27.0': + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.0': optional: true '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.27.0': + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': optional: true '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.27.0': + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.0': optional: true '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.27.0': + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.0': optional: true '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.27.0': + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.0': optional: true '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.27.0': + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.28.0': optional: true '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.27.0': + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.28.0': optional: true '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.27.0': + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.28.0': optional: true '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.27.0': + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.0': optional: true '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.27.0': + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.0': optional: true '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.27.0': + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.0': optional: true '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.27.0': + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.0': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.27.0': + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': optional: true '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.27.0': + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.0': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.27.0': + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': optional: true '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.27.0': + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.0': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.27.0': + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': optional: true '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.27.0': + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.0': optional: true '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.27.0': + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.0': optional: true '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-ia32@0.27.0': + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.0': optional: true '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.27.0': + '@esbuild/win32-x64@0.27.7': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@esbuild/win32-x64@0.28.0': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': dependencies: - eslint: 9.39.1 + eslint: 10.2.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 3.1.2 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.1': {} - - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -3108,11 +3425,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@keyv/bigmap@1.3.0(keyv@5.5.4)': + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: - hashery: 1.2.0 - hookified: 1.13.0 - keyv: 5.5.4 + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 '@keyv/serialize@1.1.1': {} @@ -3126,16 +3443,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.20.1 - '@puppeteer/browsers@2.10.13': + '@puppeteer/browsers@2.13.0': dependencies: debug: 4.4.3 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.3 - tar-fs: 3.1.1 + semver: 7.7.4 + tar-fs: 3.1.2 yargs: 17.7.2 transitivePeerDependencies: - bare-abort-controller @@ -3145,23 +3462,27 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@stylistic/eslint-plugin@5.6.0(eslint@9.39.1)': + '@sindresorhus/merge-streams@4.0.0': {} + + '@stylistic/eslint-plugin@5.10.0(eslint@10.2.0)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/types': 8.47.0 - eslint: 9.39.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@typescript-eslint/types': 8.58.2 + eslint: 10.2.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.3 + picomatch: 4.0.4 '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/chrome@0.1.30': + '@types/chrome@0.1.40': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 + '@types/esrecurse@4.3.1': {} + '@types/estree@1.0.8': {} '@types/filesystem@0.0.36': @@ -3187,19 +3508,19 @@ snapshots: '@types/lodash@4.17.15': {} - '@types/lodash@4.17.20': {} + '@types/lodash@4.17.24': {} '@types/node@22.13.13': dependencies: undici-types: 6.20.0 - '@types/node@22.19.1': + '@types/node@22.19.17': dependencies: undici-types: 6.21.0 - '@types/node@24.10.1': + '@types/node@25.6.0': dependencies: - undici-types: 7.16.0 + undici-types: 7.19.2 '@types/prop-types@15.7.15': {} @@ -3220,107 +3541,108 @@ snapshots: dependencies: csstype: 3.1.3 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 24.10.1 + '@types/trusted-types@2.0.7': optional: true - '@types/yazl@3.3.0': + '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.6.0 + optional: true - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@types/yazl@3.3.1': + dependencies: + '@types/node': 25.6.0 + + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 - eslint: 9.39.1 - graphemer: 1.4.0 + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.2 + eslint: 10.2.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2)': dependencies: - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - eslint: 9.39.1 - typescript: 5.9.3 + eslint: 10.2.0 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/types': 8.58.2 debug: 4.4.3 - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.47.0': + '@typescript-eslint/scope-manager@8.58.2': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 - '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': dependencies: - typescript: 5.9.3 + typescript: 6.0.2 - '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) debug: 4.4.3 - eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + eslint: 10.2.0 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.47.0': {} + '@typescript-eslint/types@8.58.2': {} - '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - eslint: 9.39.1 - typescript: 5.9.3 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + eslint: 10.2.0 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.47.0': + '@typescript-eslint/visitor-keys@8.58.2': dependencies: - '@typescript-eslint/types': 8.47.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.58.2 + eslint-visitor-keys: 5.0.1 '@vap/core@0.0.12': dependencies: @@ -3338,24 +3660,24 @@ snapshots: moment: 2.30.1 type-fest: 4.41.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn@8.14.1: {} - acorn@8.15.0: {} + acorn@8.16.0: {} agent-base@7.1.4: {} - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.1.0 @@ -3364,6 +3686,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -3390,8 +3714,6 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 - array-union@2.1.0: {} - array-unique@0.3.2: {} array.prototype.findlast@1.2.5: @@ -3405,10 +3727,10 @@ snapshots: array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.2 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -3463,48 +3785,43 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - b4a@1.7.3: {} + b4a@1.8.0: {} balanced-match@1.0.2: {} - balanced-match@2.0.0: {} + balanced-match@4.0.4: {} bare-events@2.8.2: {} - bare-fs@4.5.1: + bare-fs@4.7.1: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.8.2) - bare-url: 2.3.2 + bare-stream: 2.13.0(bare-events@2.8.2) + bare-url: 2.4.0 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - optional: true - bare-os@3.6.2: - optional: true + bare-os@3.8.7: {} bare-path@3.0.0: dependencies: - bare-os: 3.6.2 - optional: true + bare-os: 3.8.7 - bare-stream@2.7.0(bare-events@2.8.2): + bare-stream@2.13.0(bare-events@2.8.2): dependencies: - streamx: 2.23.0 + streamx: 2.25.0 + teex: 1.0.1 optionalDependencies: bare-events: 2.8.2 transitivePeerDependencies: - - bare-abort-controller - react-native-b4a - optional: true - bare-url@2.3.2: + bare-url@2.4.0: dependencies: bare-path: 3.0.0 - optional: true base@0.11.2: dependencies: @@ -3516,7 +3833,7 @@ snapshots: mixin-deep: 1.3.2 pascalcase: 0.1.1 - basic-ftp@5.0.5: {} + basic-ftp@5.3.0: {} boolbase@1.0.0: {} @@ -3525,9 +3842,18 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.0: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 braces@3.0.3: dependencies: @@ -3549,13 +3875,13 @@ snapshots: union-value: 1.0.1 unset-value: 1.0.0 - cacheable@2.2.0: + cacheable@2.3.4: dependencies: - '@cacheable/memory': 2.0.5 - '@cacheable/utils': 2.3.1 - hookified: 1.13.0 - keyv: 5.5.4 - qified: 0.5.2 + '@cacheable/memory': 2.0.8 + '@cacheable/utils': 2.4.1 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.9.1 call-bind-apply-helpers@1.0.2: dependencies: @@ -3569,6 +3895,13 @@ snapshots: get-intrinsic: 1.3.0 set-function-length: 1.2.2 + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3586,9 +3919,9 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chromium-bidi@11.0.0(devtools-protocol@0.0.1521046): + chromium-bidi@14.0.0(devtools-protocol@0.0.1595872): dependencies: - devtools-protocol: 0.0.1521046 + devtools-protocol: 0.0.1595872 mitt: 3.0.1 zod: 3.25.76 @@ -3634,14 +3967,14 @@ snapshots: copy-descriptor@0.1.1: {} - cosmiconfig@9.0.0(typescript@5.9.3): + cosmiconfig@9.0.1(typescript@6.0.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.2 cross-spawn@7.0.6: dependencies: @@ -3649,7 +3982,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-functions-list@3.2.3: {} + css-functions-list@3.3.3: {} css-select@5.2.2: dependencies: @@ -3664,9 +3997,9 @@ snapshots: mdn-data: 2.0.28 source-map-js: 1.2.1 - css-tree@3.1.0: + css-tree@3.2.1: dependencies: - mdn-data: 2.12.2 + mdn-data: 2.27.1 source-map-js: 1.2.1 css-what@6.2.2: {} @@ -3748,13 +4081,9 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - devtools-protocol@0.0.1521046: {} + devtools-protocol@0.0.1595872: {} - diff@8.0.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 + diff@9.0.0: {} doctrine@2.1.0: dependencies: @@ -3772,7 +4101,9 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.1.7: {} + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 domutils@3.2.2: dependencies: @@ -3862,6 +4193,63 @@ snapshots: unbox-primitive: 1.1.0 which-typed-array: 1.1.19 + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3935,34 +4323,63 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - esbuild@0.27.0: + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.0 - '@esbuild/android-arm': 0.27.0 - '@esbuild/android-arm64': 0.27.0 - '@esbuild/android-x64': 0.27.0 - '@esbuild/darwin-arm64': 0.27.0 - '@esbuild/darwin-x64': 0.27.0 - '@esbuild/freebsd-arm64': 0.27.0 - '@esbuild/freebsd-x64': 0.27.0 - '@esbuild/linux-arm': 0.27.0 - '@esbuild/linux-arm64': 0.27.0 - '@esbuild/linux-ia32': 0.27.0 - '@esbuild/linux-loong64': 0.27.0 - '@esbuild/linux-mips64el': 0.27.0 - '@esbuild/linux-ppc64': 0.27.0 - '@esbuild/linux-riscv64': 0.27.0 - '@esbuild/linux-s390x': 0.27.0 - '@esbuild/linux-x64': 0.27.0 - '@esbuild/netbsd-arm64': 0.27.0 - '@esbuild/netbsd-x64': 0.27.0 - '@esbuild/openbsd-arm64': 0.27.0 - '@esbuild/openbsd-x64': 0.27.0 - '@esbuild/openharmony-arm64': 0.27.0 - '@esbuild/sunos-x64': 0.27.0 - '@esbuild/win32-arm64': 0.27.0 - '@esbuild/win32-ia32': 0.27.0 - '@esbuild/win32-x64': 0.27.0 + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 escalade@3.2.0: {} @@ -3976,29 +4393,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) - eslint-import-resolver-node@0.3.9: + eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.11 + resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - eslint-import-resolver-node: 0.3.9 + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + eslint: 10.2.0 + eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4007,13 +4424,13 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) + eslint: 10.2.0 + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.1.5 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 @@ -4021,22 +4438,22 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-path-alias@2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.39.1): + eslint-plugin-path-alias@2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@10.2.0): dependencies: - eslint: 9.39.1 + eslint: 10.2.0 find-pkg: 2.0.0 get-tsconfig: 4.10.0 nanomatch: 1.2.13 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.1): + eslint-plugin-react@7.37.5(eslint@10.2.0): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -4044,7 +4461,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.1 + eslint: 10.2.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4058,22 +4475,24 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-header@1.2.2(eslint@9.39.1): + eslint-plugin-simple-header@1.2.2(eslint@10.2.0): dependencies: - eslint: 9.39.1 + eslint: 10.2.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.1): + eslint-plugin-simple-import-sort@13.0.0(eslint@10.2.0): dependencies: - eslint: 9.39.1 + eslint: 10.2.0 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): dependencies: - eslint: 9.39.1 + eslint: 10.2.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -4081,29 +4500,28 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1: + eslint-visitor-keys@5.0.1: {} + + eslint@10.2.0: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.12.6 - chalk: 4.1.2 + ajv: 6.14.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -4113,8 +4531,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -4122,13 +4539,19 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -4191,7 +4614,7 @@ snapshots: fastest-levenshtein@1.0.16: {} - fastq@1.19.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -4199,11 +4622,15 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + fflate@0.8.2: {} - file-entry-cache@10.1.4: + file-entry-cache@11.1.2: dependencies: - flat-cache: 6.1.19 + flat-cache: 6.1.22 file-entry-cache@8.0.0: dependencies: @@ -4228,16 +4655,16 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.2 keyv: 4.5.4 - flat-cache@6.1.19: + flat-cache@6.1.22: dependencies: - cacheable: 2.2.0 - flatted: 3.3.3 - hookified: 1.13.0 + cacheable: 2.3.4 + flatted: 3.4.2 + hookified: 1.15.1 - flatted@3.3.3: {} + flatted@3.4.2: {} for-each@0.3.5: dependencies: @@ -4275,6 +4702,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.5.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4295,7 +4724,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.3 + pump: 3.0.4 get-symbol-description@1.1.0: dependencies: @@ -4307,13 +4736,13 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-tsconfig@4.13.0: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 get-uri@6.0.5: dependencies: - basic-ftp: 5.0.5 + basic-ftp: 5.3.0 data-uri-to-buffer: 6.0.2 debug: 4.4.3 transitivePeerDependencies: @@ -4361,21 +4790,19 @@ snapshots: kind-of: 6.0.3 which: 4.0.0 - globals@14.0.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 - globby@11.1.0: + globby@16.2.0: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 + '@sindresorhus/merge-streams': 4.0.0 fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 globjoin@0.1.4: {} @@ -4383,12 +4810,12 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - has-bigints@1.1.0: {} has-flag@4.0.0: {} + has-flag@5.0.1: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -4422,9 +4849,9 @@ snapshots: is-number: 3.0.0 kind-of: 4.0.0 - hashery@1.2.0: + hashery@1.5.1: dependencies: - hookified: 1.13.0 + hookified: 1.15.1 hasown@2.0.2: dependencies: @@ -4436,7 +4863,9 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hookified@1.13.0: {} + hookified@1.15.1: {} + + hookified@2.1.1: {} html-minifier-terser@7.2.0: dependencies: @@ -4448,7 +4877,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-tags@3.3.1: {} + html-tags@5.1.0: {} http-proxy-agent@7.0.2: dependencies: @@ -4473,6 +4902,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} ini@1.3.8: {} @@ -4590,6 +5021,8 @@ snapshots: is-number@7.0.0: {} + is-path-inside@4.0.0: {} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -4703,7 +5136,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.5.4: + keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 @@ -4717,8 +5150,6 @@ snapshots: kind-of@6.0.3: {} - known-css-properties@0.37.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -4730,8 +5161,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} - lodash.truncate@4.4.2: {} loose-envify@1.4.0: @@ -4754,28 +5183,36 @@ snapshots: math-intrinsics@1.1.0: {} - mathml-tag-names@2.1.3: {} + mathml-tag-names@4.0.0: {} mdn-data@2.0.28: {} - mdn-data@2.12.2: {} + mdn-data@2.27.1: {} - meow@13.2.0: {} + meow@14.1.0: {} merge2@1.4.1: {} micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 - minimatch@9.0.5: + minimatch@3.1.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.14 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.0 minimist@1.2.8: {} @@ -4788,9 +5225,9 @@ snapshots: moment@2.30.1: {} - monaco-editor@0.54.0: + monaco-editor@0.55.1: dependencies: - dompurify: 3.1.7 + dompurify: 3.2.7 marked: 14.0.0 ms@2.0.0: {} @@ -4819,13 +5256,20 @@ snapshots: natural-compare@1.4.0: {} - netmask@2.0.2: {} + netmask@2.1.1: {} no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.8.1 + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + normalize-path@3.0.0: {} nth-check@2.1.1: @@ -4873,9 +5317,9 @@ snapshots: object.groupby@1.0.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.9 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.2 object.pick@1.3.0: dependencies: @@ -4935,7 +5379,7 @@ snapshots: pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 - netmask: 2.0.2 + netmask: 2.1.1 pako@1.0.11: {} @@ -4950,7 +5394,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4970,32 +5414,28 @@ snapshots: path-parse@1.0.7: {} - path-type@4.0.0: {} - pend@1.2.0: {} picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} possible-typed-array-names@1.1.0: {} - postcss-resolve-nested-selector@0.1.6: {} - - postcss-safe-parser@7.0.1(postcss@8.5.6): + postcss-safe-parser@7.0.1(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 - postcss-selector-parser@7.1.0: + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -5026,22 +5466,22 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.3: + pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} - puppeteer-core@24.30.0: + puppeteer-core@24.41.0: dependencies: - '@puppeteer/browsers': 2.10.13 - chromium-bidi: 11.0.0(devtools-protocol@0.0.1521046) + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) debug: 4.4.3 - devtools-protocol: 0.0.1521046 - typed-query-selector: 2.12.0 - webdriver-bidi-protocol: 0.3.8 - ws: 8.18.3 + devtools-protocol: 0.0.1595872 + typed-query-selector: 2.12.1 + webdriver-bidi-protocol: 0.4.1 + ws: 8.20.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -5052,9 +5492,9 @@ snapshots: q@1.5.1: {} - qified@0.5.2: + qified@0.9.1: dependencies: - hookified: 1.13.0 + hookified: 2.1.1 queue-microtask@1.2.3: {} @@ -5098,8 +5538,6 @@ snapshots: resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} resolve-url@0.2.1: {} @@ -5110,15 +5548,18 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.11: + resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: + resolve@2.0.0-next.6: dependencies: + es-errors: 1.3.0 is-core-module: 2.16.1 + node-exports-info: 1.6.0 + object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5153,13 +5594,13 @@ snapshots: dependencies: ret: 0.1.15 - sax@1.4.3: {} + sax@1.6.0: {} semver@6.3.1: {} semver@7.7.1: {} - semver@7.7.3: {} + semver@7.7.4: {} set-function-length@1.2.2: dependencies: @@ -5226,7 +5667,7 @@ snapshots: signal-exit@4.1.0: {} - slash@3.0.0: {} + slash@5.1.0: {} slice-ansi@4.0.0: dependencies: @@ -5287,9 +5728,9 @@ snapshots: dependencies: extend-shallow: 3.0.2 - standalone-electron-types@34.2.0: + standalone-electron-types@41.2.1: dependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.17 static-extend@0.1.2: dependencies: @@ -5301,11 +5742,11 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamx@2.23.0: + streamx@2.25.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.3 + text-decoder: 1.2.7 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -5316,6 +5757,11 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@8.2.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -5364,89 +5810,91 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-bom@3.0.0: {} - strip-json-comments@3.1.1: {} - - stylelint-config-recommended@17.0.0(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-recommended@18.0.0(stylelint@17.8.0(typescript@6.0.2)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) + stylelint: 17.8.0(typescript@6.0.2) - stylelint-config-standard@39.0.1(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-standard@40.0.0(stylelint@17.8.0(typescript@6.0.2)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) - stylelint-config-recommended: 17.0.0(stylelint@16.25.0(typescript@5.9.3)) + stylelint: 17.8.0(typescript@6.0.2) + stylelint-config-recommended: 18.0.0(stylelint@17.8.0(typescript@6.0.2)) - stylelint@16.25.0(typescript@5.9.3): + stylelint@17.8.0(typescript@6.0.2): dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) - '@dual-bundle/import-meta-resolve': 4.2.1 - balanced-match: 2.0.0 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.1) + '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.1) colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.9.3) - css-functions-list: 3.2.3 - css-tree: 3.1.0 + cosmiconfig: 9.0.1(typescript@6.0.2) + css-functions-list: 3.3.3 + css-tree: 3.2.1 debug: 4.4.3 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.4 + file-entry-cache: 11.1.2 global-modules: 2.0.0 - globby: 11.1.0 + globby: 16.2.0 globjoin: 0.1.4 - html-tags: 3.3.1 + html-tags: 5.1.0 ignore: 7.0.5 - imurmurhash: 0.1.4 + import-meta-resolve: 4.2.0 is-plain-object: 5.0.0 - known-css-properties: 0.37.0 - mathml-tag-names: 2.1.3 - meow: 13.2.0 + mathml-tag-names: 4.0.0 + meow: 14.1.0 micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.6 - postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.5.6) - postcss-selector-parser: 7.1.0 + postcss: 8.5.10 + postcss-safe-parser: 7.0.1(postcss@8.5.10) + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - resolve-from: 5.0.0 - string-width: 4.2.3 - supports-hyperlinks: 3.2.0 + string-width: 8.2.0 + supports-hyperlinks: 4.4.0 svg-tags: 1.0.0 table: 6.9.0 - write-file-atomic: 5.0.1 + write-file-atomic: 7.0.1 transitivePeerDependencies: - supports-color - typescript + supports-color@10.2.2: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - supports-hyperlinks@3.2.0: + supports-hyperlinks@4.4.0: dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 + has-flag: 5.0.1 + supports-color: 10.2.2 supports-preserve-symlinks-flag@1.0.0: {} svg-tags@1.0.0: {} - svgo@4.0.0: + svgo@4.0.1: dependencies: commander: 11.1.0 css-select: 5.2.2 - css-tree: 3.1.0 + css-tree: 3.2.1 css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 - sax: 1.4.3 + sax: 1.6.0 table@6.9.0: dependencies: - ajv: 8.17.1 + ajv: 8.18.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -5454,23 +5902,32 @@ snapshots: tagged-tag@1.0.0: {} - tar-fs@3.1.1: + tar-fs@3.1.2: dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 + pump: 3.0.4 + tar-stream: 3.1.8 optionalDependencies: - bare-fs: 4.5.1 + bare-fs: 4.7.1 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer - react-native-b4a - tar-stream@3.1.7: + tar-stream@3.1.8: dependencies: - b4a: 1.7.3 + b4a: 1.8.0 + bare-fs: 4.7.1 fast-fifo: 1.3.2 - streamx: 2.23.0 + streamx: 2.25.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + teex@1.0.1: + dependencies: + streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -5482,12 +5939,17 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - text-decoder@1.2.3: + text-decoder@1.2.7: dependencies: - b4a: 1.7.3 + b4a: 1.8.0 transitivePeerDependencies: - react-native-b4a + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + to-object-path@0.3.0: dependencies: kind-of: 3.2.2 @@ -5503,9 +5965,9 @@ snapshots: regex-not: 1.0.2 safe-regex: 1.1.0 - ts-api-utils@2.1.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@6.0.2): dependencies: - typescript: 5.9.3 + typescript: 6.0.2 ts-patch@3.3.0: dependencies: @@ -5518,6 +5980,8 @@ snapshots: ts-pattern@5.6.2: {} + ts-pattern@5.9.0: {} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -5534,10 +5998,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tsx@4.20.6: + tsx@4.21.0: dependencies: - esbuild: 0.25.12 - get-tsconfig: 4.13.0 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 @@ -5549,7 +6013,7 @@ snapshots: type-fest@4.41.0: {} - type-fest@5.2.0: + type-fest@5.5.0: dependencies: tagged-tag: 1.0.0 @@ -5586,25 +6050,25 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typed-query-selector@2.12.0: {} + typed-query-selector@2.12.1: {} - typescript-eslint@8.47.0(eslint@9.39.1)(typescript@5.9.3): + typescript-eslint@8.58.2(eslint@10.2.0)(typescript@6.0.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - typescript: 5.9.3 + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + eslint: 10.2.0 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - typescript-transform-paths@3.5.5(typescript@5.9.3): + typescript-transform-paths@3.5.6(typescript@6.0.2): dependencies: - minimatch: 9.0.5 - typescript: 5.9.3 + minimatch: 9.0.9 + typescript: 6.0.2 - typescript@5.9.3: {} + typescript@6.0.2: {} unbox-primitive@1.1.0: dependencies: @@ -5617,7 +6081,9 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.19.2: {} + + unicorn-magic@0.4.0: {} union-value@1.0.1: dependencies: @@ -5649,7 +6115,7 @@ snapshots: vscode-textmate@5.2.0: {} - webdriver-bidi-protocol@0.3.8: {} + webdriver-bidi-protocol@0.4.1: {} which-boxed-primitive@1.1.1: dependencies: @@ -5692,6 +6158,16 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@1.3.1: dependencies: isexe: 2.0.0 @@ -5714,12 +6190,11 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@5.0.1: + write-file-atomic@7.0.1: dependencies: - imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.18.3: {} + ws@8.20.0: {} y18n@5.0.8: {} diff --git a/src/api/PluginManager.ts b/src/api/PluginManager.ts index 3549c4fd9..b8ea8081e 100644 --- a/src/api/PluginManager.ts +++ b/src/api/PluginManager.ts @@ -27,6 +27,7 @@ import { addMessageClickListener, addMessagePreEditListener, addMessagePreSendLi import { addMessagePopoverButton, removeMessagePopoverButton } from "@api/MessagePopover"; import { Settings, SettingsStore } from "@api/Settings"; import { disableStyle, enableStyle } from "@api/Styles"; +import { traceFunction } from "@debug/Tracer"; import { Logger } from "@utils/Logger"; import { onlyOnce } from "@utils/onlyOnce"; import { canonicalizeFind, canonicalizeReplacement } from "@utils/patches"; @@ -37,9 +38,6 @@ import { patches } from "@webpack/patcher"; import Plugins from "~plugins"; export { Plugins as plugins }; - -import { traceFunction } from "../debug/Tracer"; - const logger = new Logger("PluginManager", "#a6d189"); export const PMLogger = logger; diff --git a/src/components/settings/tabs/plugins/PluginCard.tsx b/src/components/settings/tabs/plugins/PluginCard.tsx index cf08bad89..b563ca0d3 100644 --- a/src/components/settings/tabs/plugins/PluginCard.tsx +++ b/src/components/settings/tabs/plugins/PluginCard.tsx @@ -6,12 +6,12 @@ import { showNotice } from "@api/Notices"; import { isPluginEnabled, pluginRequiresRestart, startDependenciesRecursive, startPlugin, stopPlugin } from "@api/PluginManager"; +import { Settings } from "@api/Settings"; import { CogWheel, InfoIcon } from "@components/Icons"; import { AddonCard } from "@components/settings/AddonCard"; import { isObjectEmpty } from "@utils/misc"; import { Plugin } from "@utils/types"; import { React, showToast, Toasts } from "@webpack/common"; -import { Settings } from "Vencord"; import { cl, logger } from "."; import { openPluginModal } from "./PluginModal"; diff --git a/src/debug/loadLazyChunks.ts b/src/debug/loadLazyChunks.ts index 44e483faf..997e69fa2 100644 --- a/src/debug/loadLazyChunks.ts +++ b/src/debug/loadLazyChunks.ts @@ -9,8 +9,8 @@ import { canonicalizeMatch } from "@utils/patches"; import { ModuleFactory } from "@vencord/discord-types/webpack"; import * as Webpack from "@webpack"; import { wreq } from "@webpack"; +import { AnyModuleFactory } from "@webpack/types"; import pLimit from "p-limit"; -import { AnyModuleFactory } from "webpack"; function getWebpackChunkMap() { const sym = Symbol(); diff --git a/src/plugins/consoleShortcuts/index.ts b/src/plugins/consoleShortcuts/index.ts index a65ece9ae..51391b0b9 100644 --- a/src/plugins/consoleShortcuts/index.ts +++ b/src/plugins/consoleShortcuts/index.ts @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import { loadLazyChunks } from "@debug/loadLazyChunks"; import { Devs } from "@utils/constants"; import { getCurrentChannel, getCurrentGuild } from "@utils/discord"; import { runtimeHashMessageKey } from "@utils/intlHash"; @@ -28,7 +29,6 @@ import definePlugin, { PluginNative, StartAt } from "@utils/types"; import * as Webpack from "@webpack"; import { extract, filters, findAll, findModuleId, search } from "@webpack"; import * as Common from "@webpack/common"; -import { loadLazyChunks } from "debug/loadLazyChunks"; import type { ComponentType } from "react"; const DESKTOP_ONLY = (f: string) => () => { diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts index 18adf29dc..3af463e3f 100644 --- a/src/plugins/implicitRelationships/index.ts +++ b/src/plugins/implicitRelationships/index.ts @@ -21,13 +21,25 @@ import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; import { Constants, FluxDispatcher, GuildStore, RelationshipStore, SnowflakeUtils, UserAffinitiesStore, UserStore } from "@webpack/common"; -import { Settings } from "Vencord"; + +const settings = definePluginSettings( + { + sortByAffinity: { + type: OptionType.BOOLEAN, + default: true, + description: "Whether to sort implicit relationships by their affinity to you.", + restartNeeded: true + }, + } +); export default definePlugin({ name: "ImplicitRelationships", description: "Shows your implicit relationships in the Friends tab.", tags: ["Friends", "Servers"], authors: [Devs.Dolfies], + settings, + patches: [ // Counts header { @@ -74,7 +86,7 @@ export default definePlugin({ { find: "getRelationshipCounts(){", replacement: { - predicate: () => Settings.plugins.ImplicitRelationships.sortByAffinity, + predicate: () => settings.store.sortByAffinity, match: /\}\)\.sortBy\((.+?)\)\.value\(\)/, replace: "}).sortBy(row => $self.wrapSort(($1), row)).value()" } @@ -103,16 +115,6 @@ export default definePlugin({ }, } ], - settings: definePluginSettings( - { - sortByAffinity: { - type: OptionType.BOOLEAN, - default: true, - description: "Whether to sort implicit relationships by their affinity to you.", - restartNeeded: true - }, - } - ), wrapSort(comparator: Function, row: any) { return row.type === 5 diff --git a/src/utils/text.ts b/src/utils/text.ts index 6dc5b008f..385bfa0b7 100644 --- a/src/utils/text.ts +++ b/src/utils/text.ts @@ -147,7 +147,6 @@ export function toInlineCode(s: string) { return "``" + ZWSP + s.replaceAll("`", ZWSP + "`" + ZWSP) + ZWSP + "``"; } -// @ts-expect-error Missing RegExp.escape export const escapeRegExp: (s: string) => string = RegExp.escape ?? function (s: string) { return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }; diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index c6eece366..99ded5e90 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -5,13 +5,13 @@ */ import { Settings } from "@api/Settings"; +import { traceFunctionWithResults } from "@debug/Tracer"; import { makeLazy } from "@utils/lazy"; import { Logger } from "@utils/Logger"; import { interpolateIfDefined } from "@utils/misc"; import { Patch, PatchReplacement } from "@utils/types"; import { WebpackRequire } from "@vencord/discord-types/webpack"; -import { traceFunctionWithResults } from "../debug/Tracer"; import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, PatchedModuleFactory } from "./types"; import { _blacklistBadModules, _initWebpack, factoryListeners, findModuleFactory, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index aa1e10223..4c7f0e92c 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import { traceFunction } from "@debug/Tracer"; import { makeLazy, proxyLazy } from "@utils/lazy"; import { LazyComponent } from "@utils/lazyReact"; import { Logger } from "@utils/Logger"; @@ -24,7 +25,6 @@ import { escapeRegExp } from "@utils/text"; import type { FluxStore } from "@vencord/discord-types"; import type { ModuleExports, ModuleFactory, WebpackRequire } from "@vencord/discord-types/webpack"; -import { traceFunction } from "../debug/Tracer"; import type { AnyModuleFactory, AnyWebpackRequire } from "./types"; const logger = new Logger("Webpack"); diff --git a/tsconfig.json b/tsconfig.json index 2e75625c5..682129bc4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,19 +20,20 @@ "target": "ESNEXT", "jsx": "preserve", - "baseUrl": "./src/", "paths": { - "@main/*": ["./main/*"], - "@api/*": ["./api/*"], - "@components/*": ["./components/*"], - "@utils/*": ["./utils/*"], - "@plugins/*": ["./plugins/*"], - "@shared/*": ["./shared/*"], - "@webpack/common": ["./webpack/common"], - "@webpack/common/*": ["./webpack/common/*"], - "@webpack": ["./webpack/webpack"], - "@webpack/patcher": ["./webpack/patchWebpack"], - "@webpack/wreq.d": ["./webpack/wreq.d"], + "@main/*": ["./src/main/*"], + "@api/*": ["./src/api/*"], + "@components/*": ["./src/components/*"], + "@debug/*": ["./src/debug/*"], + "@utils/*": ["./src/utils/*"], + "@plugins/*": ["./src/plugins/*"], + "@shared/*": ["./src/shared/*"], + "@webpack/common": ["./src/webpack/common"], + "@webpack/common/*": ["./src/webpack/common/*"], + "@webpack": ["./src/webpack/webpack"], + "@webpack/patcher": ["./src/webpack/patchWebpack"], + "@webpack/wreq.d": ["./src/webpack/wreq.d"], + "@webpack/types": ["./src/webpack/types"], }, "plugins": [ From 6b1c3a9445e565337dd437d83aea0be8f55704f8 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 10:06:18 -0400 Subject: [PATCH 031/247] fix building --- scripts/utils.ts | 10 ++++++---- src/api/AudioPlayer.ts | 2 +- src/components/settings/tabs/plugins/index.tsx | 4 ++-- src/components/settings/tabs/vencord/index.tsx | 2 +- src/debug/reporterData.ts | 1 + src/equicordplugins/betterActivities/index.tsx | 2 +- src/equicordplugins/clientSideBlock/index.tsx | 2 +- src/equicordplugins/collapsibleUi/index.tsx | 2 +- src/equicordplugins/commandPalette/registry.tsx | 3 +-- src/equicordplugins/cursorBuddy/index.tsx | 2 +- .../discordDevBanner/components/makeDevBanner.tsx | 2 +- src/equicordplugins/equicordToolbox/index.tsx | 3 +-- src/equicordplugins/favouriteAnything/index.tsx | 2 +- src/equicordplugins/googleThat/index.tsx | 2 +- src/equicordplugins/hideServers/index.tsx | 2 +- src/equicordplugins/instantScreenshare/index.tsx | 2 +- src/equicordplugins/messageLoggerEnhanced/settings.tsx | 3 +-- src/equicordplugins/middleClickTweaks/index.ts | 2 +- src/equicordplugins/serverSearch/index.tsx | 3 +-- src/equicordplugins/showBadgesInChat/index.tsx | 2 +- src/plugins/devCompanion.dev/initWs.tsx | 6 +++--- src/plugins/devCompanion.dev/types/send.ts | 2 +- src/plugins/devCompanion.dev/util.tsx | 2 +- src/plugins/favEmojiFirst/index.tsx | 2 +- src/plugins/fixYoutubeEmbeds.desktop/index.tsx | 1 + src/plugins/fixYoutubeEmbeds.desktop/native.ts | 2 +- src/plugins/showMeYourName/index.tsx | 1 + src/webpack/patchWebpack.ts | 2 +- 28 files changed, 36 insertions(+), 35 deletions(-) diff --git a/scripts/utils.ts b/scripts/utils.ts index 701919c8a..ab3835cc7 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -152,7 +152,8 @@ export async function parseFile(fileName: string) { enabledByDefault: false, required: false, isModified: false, - tags: [] as string[] + tags: [] as string[], + searchTerms: [] as string[], } as PluginData; for (const prop of pluginObj.properties) { @@ -208,9 +209,10 @@ export async function parseFile(fileName: string) { }); break; case "tags": - if (!isArrayLiteralExpression(value)) throw fail("tags is not an array literal"); - data.tags = value.elements.map(e => { - if (!isStringLiteral(e)) throw fail("tags array contains non-string literals"); + case "searchTerms": + if (!isArrayLiteralExpression(value)) throw fail(`${key} is not an array literal`); + data[key] = value.elements.map(e => { + if (!isStringLiteral(e)) throw fail(`${key} array contains non-string literals`); return e.text; }); break; diff --git a/src/api/AudioPlayer.ts b/src/api/AudioPlayer.ts index 53d6c0614..d106d26b8 100644 --- a/src/api/AudioPlayer.ts +++ b/src/api/AudioPlayer.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { findByCodeLazy, findLazy } from "webpack"; +import { findByCodeLazy, findLazy } from "@webpack"; let defaultSounds: null | string[] = null; const findDefaultSounds = findLazy(module => module.resolve && module.id && module.keys().some(key => key.endsWith(".mp3")), false); diff --git a/src/components/settings/tabs/plugins/index.tsx b/src/components/settings/tabs/plugins/index.tsx index 0da4cff12..ed75e2849 100644 --- a/src/components/settings/tabs/plugins/index.tsx +++ b/src/components/settings/tabs/plugins/index.tsx @@ -35,7 +35,7 @@ import { isTruthy } from "@utils/guards"; import { Logger } from "@utils/Logger"; import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; -import { useAwaiter, useCleanupEffect, useIntersection } from "@utils/react"; +import { useAwaiter, useIntersection } from "@utils/react"; import { PluginTag, PluginTags } from "@utils/types"; import { Alerts, lodash, Parser, React, SearchableSelect, Select, TextInput, Toasts, Tooltip, useCallback, useMemo, useRef, useState } from "@webpack/common"; import { JSX } from "react"; @@ -405,7 +405,7 @@ export default function PluginSettings() { Filters - ; + ; } + export const reporterData: ReporterData = { failedPatches: { foundNoModule: [], diff --git a/src/equicordplugins/betterActivities/index.tsx b/src/equicordplugins/betterActivities/index.tsx index edb29a7c8..97e97a918 100644 --- a/src/equicordplugins/betterActivities/index.tsx +++ b/src/equicordplugins/betterActivities/index.tsx @@ -20,7 +20,7 @@ export default definePlugin({ name: "BetterActivities", description: "Shows activity icons in the member list and allows showing all activities", authors: [Devs.D3SOX, Devs.Arjix, Devs.AutumnVN, Devs.thororen], - tags: ["activity"], + tags: ["Activity"], settings, patchActivityList, showAllActivitiesComponent, diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx index 19c971c96..00d891d28 100644 --- a/src/equicordplugins/clientSideBlock/index.tsx +++ b/src/equicordplugins/clientSideBlock/index.tsx @@ -142,7 +142,7 @@ function activeNowView(cards) { export default definePlugin({ name: "ClientSideBlock", description: "Allows you to locally hide almost all content from any user", - tags: ["blocked", "block", "hide", "hidden", "noblockedmessages"], + searchTerms: ["blocked", "block", "hide", "hidden", "noblockedmessages"], authors: [Devs.Samwich, EquicordDevs.KamiRu], settings, activeNowView, diff --git a/src/equicordplugins/collapsibleUi/index.tsx b/src/equicordplugins/collapsibleUi/index.tsx index d72033893..05266c715 100644 --- a/src/equicordplugins/collapsibleUi/index.tsx +++ b/src/equicordplugins/collapsibleUi/index.tsx @@ -109,7 +109,7 @@ export default definePlugin({ name: "CollapsibleUI", description: "Native collapsible channel, member, chat button, and user area surfaces.", authors: [EquicordDevs.benjii], - tags: ["ui", "sidebar", "layout"], + searchTerms: ["ui", "sidebar", "layout"], managedStyle, settings, diff --git a/src/equicordplugins/commandPalette/registry.tsx b/src/equicordplugins/commandPalette/registry.tsx index ea1616940..8c7c87cf9 100644 --- a/src/equicordplugins/commandPalette/registry.tsx +++ b/src/equicordplugins/commandPalette/registry.tsx @@ -6,7 +6,7 @@ import { DataStore } from "@api/index"; import { isPluginEnabled, plugins, startPlugin, stopPlugin } from "@api/PluginManager"; -import { SettingsStore } from "@api/Settings"; +import { Settings, SettingsStore } from "@api/Settings"; import { getUserSettingLazy } from "@api/UserSettings"; import { openPluginModal } from "@components/settings/tabs"; import { toggleEnabled } from "@equicordplugins/equicordHelper/utils"; @@ -18,7 +18,6 @@ import { Guild } from "@vencord/discord-types"; import { findByPropsLazy, findExportedComponentLazy, findStoreLazy } from "@webpack"; import { Alerts, ChannelActionCreators, ChannelRouter, ChannelStore, ComponentDispatch, FluxDispatcher, GuildStore, IconUtils, MediaEngineStore, MessageStore, NavigationRouter, React, ReadStateStore, ReadStateUtils, SelectedChannelStore, SelectedGuildStore, SettingsRouter, StreamerModeStore, Toasts, useEffect, UserStore, VoiceActions } from "@webpack/common"; import type { FC, ReactElement, ReactNode } from "react"; -import { Settings } from "Vencord"; import commandPalette from "."; import { diff --git a/src/equicordplugins/cursorBuddy/index.tsx b/src/equicordplugins/cursorBuddy/index.tsx index 478d41cb8..7a5d82924 100644 --- a/src/equicordplugins/cursorBuddy/index.tsx +++ b/src/equicordplugins/cursorBuddy/index.tsx @@ -236,7 +236,7 @@ export default definePlugin({ name: "CursorBuddy", description: "Adds a sprite that follows your cursor.", authors: [Devs.Ven, Devs.adryd, EquicordDevs.nexpid, EquicordDevs.ZcraftElite], - tags: ["Oneko", "FatassHorse", "Pet"], + searchTerms: ["Oneko", "FatassHorse", "Pet"], settings, isModified: true, diff --git a/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx b/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx index 48ef55064..10642d7e0 100644 --- a/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx +++ b/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx @@ -4,10 +4,10 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import SettingsPlugin from "@plugins/_core/settings"; import { detectClient } from "@plugins/_core/supportHelper"; import { gitHashShort } from "@shared/vencordUserAgent"; import { React } from "@webpack/common"; -import SettingsPlugin from "plugins/_core/settings"; import { JSX } from "react"; import { ChromiumIcon, ClientIcon, DevBannerIcon, DiscordIcon, ElectronIcon, EquicordIcon, names, settings } from "."; diff --git a/src/equicordplugins/equicordToolbox/index.tsx b/src/equicordplugins/equicordToolbox/index.tsx index 5a6b32394..f2e9542f7 100644 --- a/src/equicordplugins/equicordToolbox/index.tsx +++ b/src/equicordplugins/equicordToolbox/index.tsx @@ -77,11 +77,10 @@ migratePluginSettings("EquicordToolbox", "VencordToolbox"); export default definePlugin({ name: "EquicordToolbox", description: "Adds a button next to the inbox button in the channel header that houses Equicord quick actions", + tags: ["Voice", "Accessibility"], authors: [Devs.Ven, Devs.AutumnVN], dependencies: ["HeaderBarAPI"], - settings, - headerBarButton: { icon: Icon, render: VencordPopoutButton, diff --git a/src/equicordplugins/favouriteAnything/index.tsx b/src/equicordplugins/favouriteAnything/index.tsx index b9d094962..4798868fc 100644 --- a/src/equicordplugins/favouriteAnything/index.tsx +++ b/src/equicordplugins/favouriteAnything/index.tsx @@ -26,7 +26,7 @@ export default definePlugin({ name: "FavouriteAnything", description: "Favourite any image, video, or file attachment", authors: [Devs.nin0dev, EquicordDevs.davri], - tags: ["favorite"], + searchTerms: ["favorite"], managedStyle, patches: [ // EMBEDS diff --git a/src/equicordplugins/googleThat/index.tsx b/src/equicordplugins/googleThat/index.tsx index 18f6753c3..ad70e3217 100644 --- a/src/equicordplugins/googleThat/index.tsx +++ b/src/equicordplugins/googleThat/index.tsx @@ -76,7 +76,7 @@ export default definePlugin({ name: "GoogleThat", description: "Adds a command to send a internet search link", authors: [Devs.Samwich, EquicordDevs.KrystalSkull], - tags: ["search", "google", "query", "duckduckgo", "command"], + searchTerms: ["search", "google", "query", "duckduckgo", "command"], settings, commands: [ { diff --git a/src/equicordplugins/hideServers/index.tsx b/src/equicordplugins/hideServers/index.tsx index 054c9ecac..e91104fea 100644 --- a/src/equicordplugins/hideServers/index.tsx +++ b/src/equicordplugins/hideServers/index.tsx @@ -77,7 +77,7 @@ export default definePlugin({ name: "HideServers", description: "Allows you to hide servers from the guild list and quick switcher by right clicking them", authors: [EquicordDevs.bep], - tags: ["guild", "server", "hide", "folder"], + searchTerms: ["guild", "server", "hide", "folder"], dependencies: ["ServerListAPI"], contextMenus: { diff --git a/src/equicordplugins/instantScreenshare/index.tsx b/src/equicordplugins/instantScreenshare/index.tsx index 1d0160048..6a55107be 100644 --- a/src/equicordplugins/instantScreenshare/index.tsx +++ b/src/equicordplugins/instantScreenshare/index.tsx @@ -64,7 +64,7 @@ export default definePlugin({ description: "Instantly screenshare when joining a voice channel with support for desktop sources, windows, and video input devices (cameras, capture cards)", authors: [Devs.HAHALOSAH, Devs.thororen, EquicordDevs.mart], dependencies: ["EquicordToolbox"], - tags: ["ScreenshareKeybind"], + searchTerms: ["ScreenshareKeybind"], autoStartStream, settings, diff --git a/src/equicordplugins/messageLoggerEnhanced/settings.tsx b/src/equicordplugins/messageLoggerEnhanced/settings.tsx index fce7de8b8..1c39df9e4 100644 --- a/src/equicordplugins/messageLoggerEnhanced/settings.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/settings.tsx @@ -4,12 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { definePluginSettings } from "@api/Settings"; +import { definePluginSettings, Settings } from "@api/Settings"; import { Button } from "@components/Button"; import ErrorBoundary from "@components/ErrorBoundary"; import { OptionType } from "@utils/types"; import { Alerts, useState } from "@webpack/common"; -import { Settings } from "Vencord"; import { clearLogs, Native } from "."; import { ImageCacheDir, LogsDir } from "./components/FolderSelectInput"; diff --git a/src/equicordplugins/middleClickTweaks/index.ts b/src/equicordplugins/middleClickTweaks/index.ts index da10a5d21..97f2f3873 100644 --- a/src/equicordplugins/middleClickTweaks/index.ts +++ b/src/equicordplugins/middleClickTweaks/index.ts @@ -101,7 +101,7 @@ export default definePlugin({ authors: [EquicordDevs.Etorix, EquicordDevs.korzi], settings, - tags: ["LimitMiddleClickPaste"], + searchTerms: ["LimitMiddleClickPaste"], isPastingDisabled(isInput: boolean) { const pasteBlocked = Date.now() - lastMiddleClickUp < Math.max(settings.store.pasteThreshold, 1); diff --git a/src/equicordplugins/serverSearch/index.tsx b/src/equicordplugins/serverSearch/index.tsx index 48cbe348f..82989cb7b 100644 --- a/src/equicordplugins/serverSearch/index.tsx +++ b/src/equicordplugins/serverSearch/index.tsx @@ -10,8 +10,7 @@ import { addServerListElement, removeServerListElement, ServerListRenderPosition import ErrorBoundary from "@components/ErrorBoundary"; import { EquicordDevs } from "@utils/constants"; import definePlugin from "@utils/types"; -import { FluxDispatcher } from "@webpack/common"; -import { Tooltip } from "webpack/common/components"; +import { FluxDispatcher, Tooltip } from "@webpack/common"; function SearchIcon() { return ( diff --git a/src/equicordplugins/showBadgesInChat/index.tsx b/src/equicordplugins/showBadgesInChat/index.tsx index 60066cc52..f7a86d292 100644 --- a/src/equicordplugins/showBadgesInChat/index.tsx +++ b/src/equicordplugins/showBadgesInChat/index.tsx @@ -6,11 +6,11 @@ import "./styles.css"; +import badges from "@plugins/_api/badges"; import { Devs, EquicordDevs } from "@utils/constants"; import { isEquicordPluginDev, isPluginDev } from "@utils/misc"; import definePlugin from "@utils/types"; import { findComponentByCodeLazy, findCssClassesLazy } from "@webpack"; -import badges from "plugins/_api/badges"; const { roleIcon } = findCssClassesLazy("roleIcon", "separator"); const RoleIconComponent = findComponentByCodeLazy("#{intl::ROLE_ICON_ALT_TEXT}"); diff --git a/src/plugins/devCompanion.dev/initWs.tsx b/src/plugins/devCompanion.dev/initWs.tsx index 89bee1d38..49e931808 100644 --- a/src/plugins/devCompanion.dev/initWs.tsx +++ b/src/plugins/devCompanion.dev/initWs.tsx @@ -5,14 +5,14 @@ */ import { popNotice, showNotice } from "@api/Notices"; +import { Settings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; +import { loadLazyChunks } from "@debug/loadLazyChunks"; +import { reporterData } from "@debug/reporterData"; import { getIntlMessageFromHash } from "@utils/discord"; import { canonicalizeMatch, canonicalizeReplace } from "@utils/patches"; import { filters, findAll, search, wreq } from "@webpack"; import { React, Toasts, useState } from "@webpack/common"; -import { loadLazyChunks } from "debug/loadLazyChunks"; -import { reporterData } from "debug/reporterData"; -import { Settings } from "Vencord"; import { CLIENT_VERSION, logger, PORT, settings } from "."; import { Recieve } from "./types"; diff --git a/src/plugins/devCompanion.dev/types/send.ts b/src/plugins/devCompanion.dev/types/send.ts index 86260a4e3..e9439e631 100644 --- a/src/plugins/devCompanion.dev/types/send.ts +++ b/src/plugins/devCompanion.dev/types/send.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { ReporterData } from "debug/reporterData"; +import { ReporterData } from "@debug/reporterData"; export type OutgoingMessage = Base; export type FullOutgoingMessage = OutgoingMessage & Nonce; diff --git a/src/plugins/devCompanion.dev/util.tsx b/src/plugins/devCompanion.dev/util.tsx index 4fda47040..7611b8081 100644 --- a/src/plugins/devCompanion.dev/util.tsx +++ b/src/plugins/devCompanion.dev/util.tsx @@ -10,8 +10,8 @@ import { Settings } from "@api/Settings"; import { canonicalizeMatch } from "@utils/patches"; import { CodeFilter, stringMatches, wreq } from "@webpack"; import { Toasts } from "@webpack/common"; -import { WebpackPatcher } from "Vencord"; +import { WebpackPatcher } from "../../Vencord"; import { logger, settings as companionSettings } from "."; import { FindNode } from "./types/recieve"; diff --git a/src/plugins/favEmojiFirst/index.tsx b/src/plugins/favEmojiFirst/index.tsx index f369023c5..0d4d636a4 100644 --- a/src/plugins/favEmojiFirst/index.tsx +++ b/src/plugins/favEmojiFirst/index.tsx @@ -1101,7 +1101,7 @@ const messageSendListener = (_channelId: string, messageObj: { content: string; export default definePlugin({ name: "FavoriteEmojiFirst", authors: [Devs.Aria, Devs.Ven, EquicordDevs.justjxke], - tags: ["EmojiAlias"], + tags: ["Emotes", "Customisation"], description: "Puts your favorite emoji first in the emoji autocomplete and also has emoji alias.", settings, contextMenus: { diff --git a/src/plugins/fixYoutubeEmbeds.desktop/index.tsx b/src/plugins/fixYoutubeEmbeds.desktop/index.tsx index 6ea46fd7f..d76bd666e 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/index.tsx +++ b/src/plugins/fixYoutubeEmbeds.desktop/index.tsx @@ -27,6 +27,7 @@ migratePluginSettings("FixYoutubeEmbeds", "YoutubeDescription"); export default definePlugin({ name: "FixYoutubeEmbeds", description: "Bypasses youtube videos being blocked from display on Discord (for example by UMG)", + tags: ["Media", "Utility"], authors: [Devs.coolelectronics, Devs.arHSM], settings, patches: [ diff --git a/src/plugins/fixYoutubeEmbeds.desktop/native.ts b/src/plugins/fixYoutubeEmbeds.desktop/native.ts index f865a6566..950940b06 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/native.ts +++ b/src/plugins/fixYoutubeEmbeds.desktop/native.ts @@ -4,8 +4,8 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { RendererSettings } from "@main/settings"; import { app } from "electron"; -import { RendererSettings } from "main/settings"; app.on("browser-window-created", (_, win) => { win.webContents.on("frame-created", (_, { frame }) => { diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx index 4a82cc73f..101a6afa7 100644 --- a/src/plugins/showMeYourName/index.tsx +++ b/src/plugins/showMeYourName/index.tsx @@ -1070,6 +1070,7 @@ export default definePlugin({ description: "Display any permutation of custom nicknames, friend nicknames, server nicknames, display names, and usernames in chat.", authors: [EquicordDevs.Etorix, Devs.Rini, Devs.TheKodeToad, Devs.sadan, Devs.prism], tags: ["Appearance", "Customisation"], + searchTerms: ["SMYN", "Nicknames", "Custom Nicknames"], isModified: true, settings, diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index fb27cb752..2b1994f20 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -5,13 +5,13 @@ */ import { Settings } from "@api/Settings"; +import { reporterData } from "@debug/reporterData"; import { traceFunctionWithResults } from "@debug/Tracer"; import { makeLazy } from "@utils/lazy"; import { Logger } from "@utils/Logger"; import { interpolateIfDefined } from "@utils/misc"; import { Patch, PatchReplacement } from "@utils/types"; import { WebpackRequire } from "@vencord/discord-types/webpack"; -import { reporterData } from "debug/reporterData"; import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, PatchedModuleFactory } from "./types"; import { _blacklistBadModules, _initWebpack, factoryListeners, findModuleFactory, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; From 32b6d94bb6863379f3d419f839beba1d604428e9 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 10:22:12 -0400 Subject: [PATCH 032/247] Fix Lint --- scripts/utils.ts | 1 + .../ThemeSettings/components/SettingColorComponent.tsx | 1 + src/equicordplugins/favouriteAnything/polyfills.ts | 2 +- .../messageLoggerEnhanced/components/LogsModal.tsx | 2 +- .../messageLoggerEnhanced/utils/settingsUtils.ts | 2 +- src/equicordplugins/moreStickers/components/misc.tsx | 2 +- src/equicordplugins/rpcEditor/ReplaceSettings.tsx | 4 ++-- src/main/utils/extensions.ts | 2 +- 8 files changed, 9 insertions(+), 7 deletions(-) diff --git a/scripts/utils.ts b/scripts/utils.ts index ab3835cc7..2727f5447 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -38,6 +38,7 @@ export interface PluginData { name: string; description: string; tags: string[]; + searchTerms: string[]; authors: Dev[]; dependencies: string[]; hasPatches: boolean; diff --git a/src/components/ThemeSettings/components/SettingColorComponent.tsx b/src/components/ThemeSettings/components/SettingColorComponent.tsx index e01228c5f..9f3e00fd2 100644 --- a/src/components/ThemeSettings/components/SettingColorComponent.tsx +++ b/src/components/ThemeSettings/components/SettingColorComponent.tsx @@ -9,6 +9,7 @@ import "./colorStyles.css"; import { classNameFactory } from "@utils/css"; import { findByCodeLazy } from "@webpack"; import { ColorPicker, useMemo } from "@webpack/common"; +import type tinycolor from "tinycolor2"; // TinyColor is completely unmangled and it's duplicated in two modules! Fun! const TinyColor: tinycolor.Constructor = findByCodeLazy("this._gradientType="); diff --git a/src/equicordplugins/favouriteAnything/polyfills.ts b/src/equicordplugins/favouriteAnything/polyfills.ts index fc6950a20..1042633c0 100644 --- a/src/equicordplugins/favouriteAnything/polyfills.ts +++ b/src/equicordplugins/favouriteAnything/polyfills.ts @@ -44,7 +44,7 @@ interface Uint8ArrayConstructorExtended extends Uint8ArrayConstructor { ): Uint8ArrayExtended; } -function supportsToBase64(array: Uint8Array): array is Uint8ArrayExtended { +function supportsToBase64(array: Uint8Array): boolean { return "toBase64" in array && typeof array.toBase64 === "function"; } diff --git a/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx b/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx index 1d28a6348..3fa47d67b 100644 --- a/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx @@ -17,7 +17,7 @@ import { find, findByCode, findByCodeLazy } from "@webpack"; import { Alerts, ChannelStore, ContextMenuApi, FluxDispatcher, GuildStore, Menu, NavigationRouter, React, TabBar, TextInput, Tooltip, useMemo, useRef, useState } from "@webpack/common"; import { DBMessageRecord, deleteMessageIDB, deleteMessagesBulkIDB } from "../db"; -import { clearLogs, cl, settings } from "../index"; +import { cl, clearLogs, settings } from "../index"; import { LoggedMessage, LoggedMessageJSON } from "../types"; import { messageJsonToMessageClass } from "../utils"; import { importLogs } from "../utils/settingsUtils"; diff --git a/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts b/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts index 64c6d9d03..0d59e56ab 100644 --- a/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts +++ b/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts @@ -21,7 +21,7 @@ import { chooseFile as chooseFileWeb } from "@utils/web"; import { Toasts } from "@webpack/common"; import { showSaveFilePicker } from "native-file-system-adapter"; -import { Native, clearLogs } from ".."; +import { clearLogs,Native } from ".."; import { addMessagesBulkIDB, iterateAllMessagesIDB } from "../db"; import { LoggedMessageJSON } from "../types"; diff --git a/src/equicordplugins/moreStickers/components/misc.tsx b/src/equicordplugins/moreStickers/components/misc.tsx index 783ded6d4..bca8f2990 100644 --- a/src/equicordplugins/moreStickers/components/misc.tsx +++ b/src/equicordplugins/moreStickers/components/misc.tsx @@ -144,7 +144,7 @@ export const Packs = () => { flexGrow: 1 }}> { try { diff --git a/src/equicordplugins/rpcEditor/ReplaceSettings.tsx b/src/equicordplugins/rpcEditor/ReplaceSettings.tsx index b85b0f7c1..81d541bf5 100644 --- a/src/equicordplugins/rpcEditor/ReplaceSettings.tsx +++ b/src/equicordplugins/rpcEditor/ReplaceSettings.tsx @@ -94,7 +94,7 @@ export function ReplaceSettings({ appIds, update, save }: SettingsProps) { } Application ID { onChange(v, i, "appId"); }} @@ -125,7 +125,7 @@ export function ReplaceSettings({ appIds, update, save }: SettingsProps) { <> Stream URL (must be YouTube or Twitch) { onChange(v, i, "newStreamUrl"); }} diff --git a/src/main/utils/extensions.ts b/src/main/utils/extensions.ts index 9ecfbfe82..0b19d9286 100644 --- a/src/main/utils/extensions.ts +++ b/src/main/utils/extensions.ts @@ -79,6 +79,6 @@ export async function installExt(id: string) { .catch(err => console.error(`Failed to extract extension ${id}`, err)); } - // @ts-expect-error Electron 36 Deprecates session.defaultSession.loadExtension() + // Electron 36 Deprecates session.defaultSession.loadExtension() session.defaultSession.extensions ? session.defaultSession.extensions.loadExtension(extDir) : session.defaultSession.loadExtension(extDir); } From 8a9ee4fb9ae99e371da933f39a32484fa459f2e1 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 11:12:39 -0400 Subject: [PATCH 033/247] tags --- src/equicordplugins/altKrispSwitch/index.tsx | 1 + .../alwaysExpandProfiles/index.ts | 1 + src/equicordplugins/animalese/index.ts | 1 + src/equicordplugins/atSomeone/index.ts | 1 + src/equicordplugins/autoZipper/index.ts | 1 + .../bannersEverywhere/index.tsx | 1 + src/equicordplugins/baseDecoder/index.tsx | 1 + .../betterAudioPlayer/index.tsx | 1 + .../betterBanReasons/index.tsx | 1 + .../betterBlockedUsers/index.tsx | 1 + src/equicordplugins/betterCommands/index.ts | 1 + src/equicordplugins/betterInvites/index.tsx | 1 + src/equicordplugins/betterPlusReacts/index.ts | 1 + src/equicordplugins/blockKeywords/index.ts | 1 + src/equicordplugins/blockKrisp/index.ts | 1 + src/equicordplugins/bypassPinPrompt/index.ts | 1 + src/equicordplugins/bypassStatus/index.tsx | 1 + src/equicordplugins/channelBadges/index.tsx | 1 + src/equicordplugins/channelTabs/index.tsx | 3 +- src/equicordplugins/cleanChannelName/index.ts | 1 + .../cleanerChannelGroups/index.ts | 1 + src/equicordplugins/clickableRoles/index.tsx | 1 + src/equicordplugins/clientSideBlock/index.tsx | 1 + .../index.tsx | 1 + src/equicordplugins/collapsibleUi/index.tsx | 1 + src/equicordplugins/commandPalette/index.tsx | 1 + src/equicordplugins/components.dev/index.tsx | 1 + src/equicordplugins/contentWarning/index.tsx | 1 + .../copyProfileColors/index.tsx | 1 + src/equicordplugins/copyStatusUrls/index.ts | 1 + src/equicordplugins/copyUserMention/index.tsx | 1 + src/equicordplugins/cursorBuddy/index.tsx | 1 + .../customFolderIcons/index.tsx | 1 + src/equicordplugins/customSounds/index.tsx | 1 + .../customStatusTimeouts/index.tsx | 1 + .../customTimestamps/index.tsx | 1 + .../customUserColors/index.tsx | 1 + src/equicordplugins/declutter/index.tsx | 1 + src/equicordplugins/disableCameras/index.tsx | 1 + .../discordDevBanner/index.tsx | 1 + .../dragFavoriteEmotes/index.tsx | 1 + src/equicordplugins/dragify/index.tsx | 1 + .../elementHighlighter.dev/index.tsx | 1 + .../equibopStreamFixes.equibop/index.tsx | 1 + src/equicordplugins/equicordHelper/index.tsx | 1 + src/equicordplugins/equissant/index.ts | 1 + src/equicordplugins/exitSounds/index.tsx | 1 + src/equicordplugins/exportMessages/index.tsx | 1 + .../fastDeleteChannels/index.tsx | 1 + .../favouriteAnything/index.tsx | 1 + src/equicordplugins/fileUpload/index.tsx | 1 + src/equicordplugins/findReply/index.tsx | 1 + .../fixFileExtensions/index.tsx | 1 + src/equicordplugins/followVoiceUser/index.tsx | 1 + src/equicordplugins/fontLoader/index.tsx | 1 + src/equicordplugins/forwardAnywhere/index.ts | 1 + .../frequentQuickSwitcher/index.tsx | 1 + src/equicordplugins/friendCodes/index.tsx | 1 + src/equicordplugins/friendTags/index.tsx | 1 + src/equicordplugins/friendshipRanks/index.tsx | 1 + src/equicordplugins/fullVcPfp/index.tsx | 1 + src/equicordplugins/ghosted/index.tsx | 1 + src/equicordplugins/gifCollections/index.tsx | 1 + src/equicordplugins/githubRepos/index.tsx | 1 + src/equicordplugins/globalBadges/index.tsx | 1 + src/equicordplugins/googleThat/index.tsx | 1 + .../guildPickerDumper/index.tsx | 1 + src/equicordplugins/hideChatButtons/index.tsx | 1 + src/equicordplugins/hideMessages/index.tsx | 1 + src/equicordplugins/hideServers/index.tsx | 1 + src/equicordplugins/holyNotes/index.tsx | 1 + src/equicordplugins/homeTyping/index.tsx | 1 + src/equicordplugins/hopOn/index.tsx | 1 + src/equicordplugins/husk/index.tsx | 1 + src/equicordplugins/iRememberYou/index.tsx | 1 + src/equicordplugins/iconViewer/index.tsx | 1 + src/equicordplugins/idleAutoRestart/index.tsx | 1 + src/equicordplugins/ignoreCalls/index.tsx | 1 + src/equicordplugins/inRole/index.tsx | 1 + src/equicordplugins/ingtoninator/index.tsx | 1 + .../instantScreenshare/index.tsx | 1 + .../invisibleChat.desktop/index.tsx | 1 + src/equicordplugins/inviteDefaults/index.ts | 1 + src/equicordplugins/jumpTo/index.tsx | 1 + src/equicordplugins/jumpscare/index.tsx | 1 + .../keyboardNavigation/index.tsx | 1 + src/equicordplugins/keyboardSounds/index.ts | 1 + src/equicordplugins/keywordNotify/index.tsx | 1 + src/equicordplugins/lastActive/index.tsx | 1 + src/equicordplugins/loginWithQR/index.tsx | 1 + .../mediaPlaybackSpeed/index.tsx | 1 + src/equicordplugins/messageBurst/index.ts | 1 + src/equicordplugins/messageColors/index.tsx | 1 + .../messageFetchTimer/index.tsx | 1 + .../messageLinkTooltip/index.tsx | 1 + .../messageLoggerEnhanced/index.tsx | 3 +- src/equicordplugins/messageNotifier/index.ts | 1 + src/equicordplugins/messagePeek/index.tsx | 1 + .../messageTranslate/index.tsx | 1 + .../micLoopbackTester/index.tsx | 1 + .../middleClickTweaks/index.ts | 1 + src/equicordplugins/moreCommands/index.ts | 1 + src/equicordplugins/moreStickers/index.tsx | 1 + src/equicordplugins/moreUserTags/index.tsx | 1 + src/equicordplugins/moyai/index.ts | 1 + .../neverPausePreviews/index.tsx | 1 + .../newPluginsManager/index.tsx | 1 + src/equicordplugins/noNitroUpsell/index.ts | 3 +- src/equicordplugins/noPushToTalk/index.ts | 1 + .../noRPC.discordDesktop/index.ts | 1 + src/equicordplugins/noRoleHeaders/index.ts | 1 + .../normalizeMessageLinks/index.ts | 1 + .../index.tsx | 1 + src/equicordplugins/orbolayBridge/index.tsx | 1 + src/equicordplugins/partyMode/index.ts | 1 + src/equicordplugins/pinIcon/index.tsx | 1 + .../pingNotifications/index.tsx | 1 + src/equicordplugins/platformSpoofer/index.tsx | 1 + src/equicordplugins/polishWording/index.ts | 1 + src/equicordplugins/profileSets/index.tsx | 1 + src/equicordplugins/questify/index.tsx | 1 + .../index.tsx | 1 + src/equicordplugins/quoter/index.tsx | 1 + src/equicordplugins/randomVoice/index.tsx | 1 + .../recentDMSwitcher/index.tsx | 1 + src/equicordplugins/remix/index.tsx | 1 + src/equicordplugins/repeatMessages/index.tsx | 1 + src/equicordplugins/replyPingControl/index.ts | 1 + src/equicordplugins/richMagnetLinks/index.tsx | 1 + src/equicordplugins/richPresence/index.tsx | 115 +++++++++--------- src/equicordplugins/rpcEditor/index.tsx | 1 + src/equicordplugins/rpcStats/index.tsx | 1 + .../saveFavoriteGIFs/index.tsx | 1 + .../scheduledMessages/index.tsx | 1 + .../screenRecorder.equibop/index.tsx | 5 +- src/equicordplugins/searchFix/index.tsx | 1 + src/equicordplugins/sekaiStickers/index.tsx | 1 + src/equicordplugins/selfForward/index.ts | 1 + src/equicordplugins/serverSearch/index.tsx | 1 + .../showBadgesInChat/index.tsx | 1 + .../showMessageEmbeds/index.tsx | 1 + .../showResourceChannels/index.ts | 1 + src/equicordplugins/showSongName/index.tsx | 1 + src/equicordplugins/sidebarChat/index.tsx | 1 + src/equicordplugins/signature/index.tsx | 1 + src/equicordplugins/snowfall/index.tsx | 3 +- src/equicordplugins/soggy/index.tsx | 1 + .../songLink.desktop/index.tsx | 1 + .../songSpotlight.desktop/index.tsx | 1 + .../splitLargeMessages/index.ts | 1 + .../spotifyActivityToggle/index.tsx | 1 + src/equicordplugins/statusPresets/index.tsx | 1 + .../statusWhileActive.desktop/index.ts | 1 + src/equicordplugins/steamStatusSync/index.tsx | 1 + src/equicordplugins/stickerBlocker/index.tsx | 1 + .../streamingCodecDisabler/index.ts | 1 + src/equicordplugins/talkInReverse/index.tsx | 1 + src/equicordplugins/themeLibrary/index.tsx | 1 + src/equicordplugins/tidalEmbeds/index.tsx | 1 + src/equicordplugins/tiktokTTS/index.ts | 1 + src/equicordplugins/timezones/index.tsx | 1 + src/equicordplugins/title/index.ts | 1 + .../toastNotifications/index.tsx | 1 + src/equicordplugins/toggleVideoBind/index.ts | 1 + src/equicordplugins/toneIndicators/index.tsx | 1 + src/equicordplugins/translatePlus/index.tsx | 1 + src/equicordplugins/triviaAI/index.tsx | 1 + src/equicordplugins/unitConverter/index.tsx | 1 + .../universalMention/index.tsx | 1 + .../unlimitedAccounts/index.ts | 1 + .../unreadBadgeCount/index.tsx | 1 + src/equicordplugins/urlHighlighter/index.tsx | 1 + src/equicordplugins/userpfp/index.tsx | 1 + .../vcNarratorCustom/index.tsx | 1 + src/equicordplugins/vcPanelSettings/index.tsx | 1 + src/equicordplugins/viewRawVariant/index.tsx | 1 + src/equicordplugins/voiceButtons/index.tsx | 1 + src/equicordplugins/voiceChannelLog/index.tsx | 1 + src/equicordplugins/voiceChatUtils/index.tsx | 1 + .../voiceJoinMessages/index.ts | 1 + .../voiceMessageTranscriber.desktop/index.tsx | 1 + src/equicordplugins/voiceRejoin/index.tsx | 1 + src/equicordplugins/waitForSlot/index.tsx | 1 + src/equicordplugins/wallpaperFree/index.tsx | 1 + src/equicordplugins/webpackTarball/index.tsx | 1 + .../whitelistedEmojis/index.tsx | 1 + src/equicordplugins/whosWatching/index.tsx | 1 + src/equicordplugins/wigglyText/index.tsx | 1 + src/equicordplugins/writeUpperCase/index.ts | 1 + 189 files changed, 252 insertions(+), 63 deletions(-) diff --git a/src/equicordplugins/altKrispSwitch/index.tsx b/src/equicordplugins/altKrispSwitch/index.tsx index a55216aa3..8f05a8e43 100644 --- a/src/equicordplugins/altKrispSwitch/index.tsx +++ b/src/equicordplugins/altKrispSwitch/index.tsx @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "AltKrispSwitch", description: "Makes the Noise Suppression Popout switch between None and Krisp instead of Krisp and Standard", + tags: ["Customisation", "Voice"], authors: [Devs.newwares], patches: [ { diff --git a/src/equicordplugins/alwaysExpandProfiles/index.ts b/src/equicordplugins/alwaysExpandProfiles/index.ts index c78baea4f..3a448288b 100644 --- a/src/equicordplugins/alwaysExpandProfiles/index.ts +++ b/src/equicordplugins/alwaysExpandProfiles/index.ts @@ -11,6 +11,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "AlwaysExpandProfiles", description: "Always expands profile popouts to the full modal", + tags: ["Appearance", "Utility"], authors: [Devs.thororen], patches: [ { diff --git a/src/equicordplugins/animalese/index.ts b/src/equicordplugins/animalese/index.ts index 1f8ccb568..a63bc44dc 100644 --- a/src/equicordplugins/animalese/index.ts +++ b/src/equicordplugins/animalese/index.ts @@ -193,6 +193,7 @@ async function playSound(buffer: AudioBuffer, volume: number) { export default definePlugin({ name: "Animalese", description: "Plays animal crossing animalese for every message sent (they yap a lot)", + tags: ["Customisation", "Fun"], authors: [EquicordDevs.ryanamay, EquicordDevs.Mocha], settings, diff --git a/src/equicordplugins/atSomeone/index.ts b/src/equicordplugins/atSomeone/index.ts index 40902e6c4..15a094059 100644 --- a/src/equicordplugins/atSomeone/index.ts +++ b/src/equicordplugins/atSomeone/index.ts @@ -13,6 +13,7 @@ export default definePlugin({ name: "AtSomeone", authors: [Devs.Joona], description: "Mention someone randomly", + tags: ["Chat", "Fun"], patches: [ { find: ".LAUNCHABLE_APPLICATIONS;", diff --git a/src/equicordplugins/autoZipper/index.ts b/src/equicordplugins/autoZipper/index.ts index ab0f2335f..a2b0a1d24 100644 --- a/src/equicordplugins/autoZipper/index.ts +++ b/src/equicordplugins/autoZipper/index.ts @@ -209,6 +209,7 @@ function handlePaste(event: ClipboardEvent) { export default definePlugin({ name: "AutoZipper", description: "Automatically zips specified file types and folders before uploading to Discord", + tags: ["Chat", "Organisation"], authors: [EquicordDevs.SSnowly], settings, diff --git a/src/equicordplugins/bannersEverywhere/index.tsx b/src/equicordplugins/bannersEverywhere/index.tsx index 5959a4022..6aea3cfe6 100644 --- a/src/equicordplugins/bannersEverywhere/index.tsx +++ b/src/equicordplugins/bannersEverywhere/index.tsx @@ -44,6 +44,7 @@ const DATASTORE_KEY = "bannersEverywhere"; export default definePlugin({ name: "BannersEverywhere", description: "Displays banners in the member list ", + tags: ["Appearance", "Customisation"], authors: [Devs.ImLvna, Devs.AutumnVN], settings, patches: [ diff --git a/src/equicordplugins/baseDecoder/index.tsx b/src/equicordplugins/baseDecoder/index.tsx index 35ba3d701..46253d954 100644 --- a/src/equicordplugins/baseDecoder/index.tsx +++ b/src/equicordplugins/baseDecoder/index.tsx @@ -107,6 +107,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "DecodeBase64", description: "Decode base64 content of any message and copy the decoded content.", + tags: ["Appearance", "Customisation", "Chat"], authors: [EquicordDevs.ThePirateStoner], settings, messagePopoverButton: { diff --git a/src/equicordplugins/betterAudioPlayer/index.tsx b/src/equicordplugins/betterAudioPlayer/index.tsx index 1692b2d85..94c3d9770 100644 --- a/src/equicordplugins/betterAudioPlayer/index.tsx +++ b/src/equicordplugins/betterAudioPlayer/index.tsx @@ -274,6 +274,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterAudioPlayer", description: "Adds a spectrograph and oscilloscope visualizer to audio attachment players.", + tags: ["Appearance", "Media", "Voice"], authors: [EquicordDevs.creations], settings, diff --git a/src/equicordplugins/betterBanReasons/index.tsx b/src/equicordplugins/betterBanReasons/index.tsx index 68e849e1c..86d0b6dfe 100644 --- a/src/equicordplugins/betterBanReasons/index.tsx +++ b/src/equicordplugins/betterBanReasons/index.tsx @@ -74,6 +74,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterBanReasons", description: "Create custom reasons to use in the Discord ban modal, and/or show a text input by default instead of the options.", + tags: ["Appearance", "Customisation"], authors: [Devs.Inbestigator], patches: [ { diff --git a/src/equicordplugins/betterBlockedUsers/index.tsx b/src/equicordplugins/betterBlockedUsers/index.tsx index ce936edb0..995a7af10 100644 --- a/src/equicordplugins/betterBlockedUsers/index.tsx +++ b/src/equicordplugins/betterBlockedUsers/index.tsx @@ -17,6 +17,7 @@ let updateFunc = (v: any) => { }; export default definePlugin({ name: "BetterBlockedUsers", description: "Allows you to search in blocked users list and makes names selectable in settings.", + tags: ["Appearance", "Shortcuts"], authors: [EquicordDevs.TheArmagan], patches: [ { diff --git a/src/equicordplugins/betterCommands/index.ts b/src/equicordplugins/betterCommands/index.ts index 6c7df169f..e81f961e3 100644 --- a/src/equicordplugins/betterCommands/index.ts +++ b/src/equicordplugins/betterCommands/index.ts @@ -33,6 +33,7 @@ function fetchIndex(target: object) { export default definePlugin({ name: "BetterCommands", description: "Enhances the command system with miscellaneous improvements.", + tags: ["Appearance", "Commands", "Shortcuts"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/betterInvites/index.tsx b/src/equicordplugins/betterInvites/index.tsx index 76b2facfa..1676df307 100644 --- a/src/equicordplugins/betterInvites/index.tsx +++ b/src/equicordplugins/betterInvites/index.tsx @@ -34,6 +34,7 @@ function lurk(id: string) { export default definePlugin({ name: "BetterInvites", description: "See invites expiration date, view inviter profile and preview servers before joining by clicking the name", + tags: ["Appearance", "Customisation", "Chat", "Servers"], authors: [EquicordDevs.iamme, Devs.thororen], patches: [ { diff --git a/src/equicordplugins/betterPlusReacts/index.ts b/src/equicordplugins/betterPlusReacts/index.ts index 2e3f84d2b..995a759a5 100644 --- a/src/equicordplugins/betterPlusReacts/index.ts +++ b/src/equicordplugins/betterPlusReacts/index.ts @@ -12,6 +12,7 @@ export default definePlugin({ name: "BetterPlusReacts", authors: [Devs.Joona], description: "The amount of plus before :emoji: is the message to add it to", + tags: ["Chat", "Emotes"], patches: [ { find: ".SLASH_COMMAND_USED,", diff --git a/src/equicordplugins/blockKeywords/index.ts b/src/equicordplugins/blockKeywords/index.ts index 3f7504373..13b44744c 100644 --- a/src/equicordplugins/blockKeywords/index.ts +++ b/src/equicordplugins/blockKeywords/index.ts @@ -70,6 +70,7 @@ export function containsBlockedKeywords(message: Message) { export default definePlugin({ name: "BlockKeywords", description: "Blocks messages containing specific user-defined keywords, as if the user sending them was blocked.", + tags: ["Appearance", "Customisation", "Privacy"], authors: [EquicordDevs.catcraft], patches: [ { diff --git a/src/equicordplugins/blockKrisp/index.ts b/src/equicordplugins/blockKrisp/index.ts index 28f6791ea..9b80b65e8 100644 --- a/src/equicordplugins/blockKrisp/index.ts +++ b/src/equicordplugins/blockKrisp/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "BlockKrisp", description: "Prevent Krisp from loading", + tags: ["Privacy", "Utility", "Voice"], authors: [Devs.D3SOX], patches: [ // Block loading modules on Desktop diff --git a/src/equicordplugins/bypassPinPrompt/index.ts b/src/equicordplugins/bypassPinPrompt/index.ts index 6c1503cd2..c90c44b93 100644 --- a/src/equicordplugins/bypassPinPrompt/index.ts +++ b/src/equicordplugins/bypassPinPrompt/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "BypassPinPrompt", description: "Bypass the pin prompt when using the pin functions", + tags: ["Shortcuts"], authors: [Devs.thororen], patches: [ ...[ diff --git a/src/equicordplugins/bypassStatus/index.tsx b/src/equicordplugins/bypassStatus/index.tsx index ac9d635d0..04d6861a2 100644 --- a/src/equicordplugins/bypassStatus/index.tsx +++ b/src/equicordplugins/bypassStatus/index.tsx @@ -157,6 +157,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BypassStatus", description: "Still get notifications from specific sources when in do not disturb mode. Right-click on users/channels/guilds to set them to bypass do not disturb mode.", + tags: ["Activity", "Customisation", "Notifications", "Servers"], authors: [Devs.Inbestigator], dependencies: ["AudioPlayerAPI"], flux: { diff --git a/src/equicordplugins/channelBadges/index.tsx b/src/equicordplugins/channelBadges/index.tsx index 25096a123..ba65fc47a 100644 --- a/src/equicordplugins/channelBadges/index.tsx +++ b/src/equicordplugins/channelBadges/index.tsx @@ -32,6 +32,7 @@ function renderBadge(id: number, title: string) { export default definePlugin({ name: "ChannelBadges", description: "Adds badges to channels based on their type", + tags: ["Appearance", "Customisation", "Servers"], authors: [EquicordDevs.creations, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/channelTabs/index.tsx b/src/equicordplugins/channelTabs/index.tsx index 35e6888a3..9cfa461ed 100644 --- a/src/equicordplugins/channelTabs/index.tsx +++ b/src/equicordplugins/channelTabs/index.tsx @@ -15,8 +15,8 @@ import { ChannelStore, Menu } from "@webpack/common"; import { JSX } from "react"; import ChannelsTabsContainer from "./components/ChannelTabsContainer"; -import { BasicChannelTabsProps, createTab, handleChannelSwitch, settings } from "./util"; import * as ChannelTabsUtils from "./util"; +import { BasicChannelTabsProps, createTab, handleChannelSwitch, settings } from "./util"; const contextMenuPatch: NavContextMenuPatchCallback = (children, props: { channel: Channel, messageId?: string; }) => { const { channel, messageId } = props; @@ -47,6 +47,7 @@ const contextMenuPatch: NavContextMenuPatchCallback = (children, props: { channe export default definePlugin({ name: "ChannelTabs", description: "Group your commonly visited channels in tabs, like a browser", + tags: ["Appearance", "Customisation", "Organisation", "Servers"], authors: [Devs.TheSun, Devs.TheKodeToad, EquicordDevs.keifufu, Devs.Nickyux, EquicordDevs.DiabeloDEV, EquicordDevs.justjxke], dependencies: ["ContextMenuAPI"], contextMenus: { diff --git a/src/equicordplugins/cleanChannelName/index.ts b/src/equicordplugins/cleanChannelName/index.ts index 822d5b5d2..9193ac648 100644 --- a/src/equicordplugins/cleanChannelName/index.ts +++ b/src/equicordplugins/cleanChannelName/index.ts @@ -12,6 +12,7 @@ export default definePlugin({ name: "CleanChannelName", authors: [Devs.AutumnVN], description: "remove all emoji and decor shit from channel names", + tags: ["Appearance", "Customisation", "Chat", "Emotes", "Servers"], patches: [ { find: "loadAllGuildAndPrivateChannelsFromDisk(){", diff --git a/src/equicordplugins/cleanerChannelGroups/index.ts b/src/equicordplugins/cleanerChannelGroups/index.ts index 73f5ba4ce..05c80840c 100644 --- a/src/equicordplugins/cleanerChannelGroups/index.ts +++ b/src/equicordplugins/cleanerChannelGroups/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "CleanerChannelGroups", description: "Hides all channels in collapsed categories, even if they have unread messages.", + tags: ["Appearance", "Customisation", "Chat", "Organisation", "Servers"], authors: [EquicordDevs.justjxke], patches: [ { diff --git a/src/equicordplugins/clickableRoles/index.tsx b/src/equicordplugins/clickableRoles/index.tsx index 6f4005e58..c23359ffc 100644 --- a/src/equicordplugins/clickableRoles/index.tsx +++ b/src/equicordplugins/clickableRoles/index.tsx @@ -146,6 +146,7 @@ const WrappedClickableRole = ErrorBoundary.wrap(ClickableRole, { noop: true }); export default definePlugin({ name: "ClickableRoles", description: "Click on roles in user profiles and the member list to see which members have them.", + tags: ["Appearance", "Roles"], authors: [Devs.prism], patches: [ diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx index 00d891d28..1aa51a646 100644 --- a/src/equicordplugins/clientSideBlock/index.tsx +++ b/src/equicordplugins/clientSideBlock/index.tsx @@ -142,6 +142,7 @@ function activeNowView(cards) { export default definePlugin({ name: "ClientSideBlock", description: "Allows you to locally hide almost all content from any user", + tags: ["Utility"], searchTerms: ["blocked", "block", "hide", "hidden", "noblockedmessages"], authors: [Devs.Samwich, EquicordDevs.KamiRu], settings, diff --git a/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx b/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx index 91320746e..5d4039046 100644 --- a/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx +++ b/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx @@ -72,6 +72,7 @@ migratePluginSettings("ClipsEnhancements", "TimelessClips"); export default definePlugin({ name: "ClipsEnhancements", description: "Add more Clip FPS and duration options, custom clip length, RPC tagging and more", + tags: ["Activity", "Media", "Utility"], authors: [Devs.niko, Devs.Joona, EquicordDevs.keircn], settings, patches: [ diff --git a/src/equicordplugins/collapsibleUi/index.tsx b/src/equicordplugins/collapsibleUi/index.tsx index 05266c715..7095cde41 100644 --- a/src/equicordplugins/collapsibleUi/index.tsx +++ b/src/equicordplugins/collapsibleUi/index.tsx @@ -108,6 +108,7 @@ const ChatButtonsRow = ErrorBoundary.wrap(({ buttons }: { buttons: ReactNode[]; export default definePlugin({ name: "CollapsibleUI", description: "Native collapsible channel, member, chat button, and user area surfaces.", + tags: ["Appearance", "Customisation", "Chat", "Servers"], authors: [EquicordDevs.benjii], searchTerms: ["ui", "sidebar", "layout"], managedStyle, diff --git a/src/equicordplugins/commandPalette/index.tsx b/src/equicordplugins/commandPalette/index.tsx index c11d44a83..6d3199c1a 100644 --- a/src/equicordplugins/commandPalette/index.tsx +++ b/src/equicordplugins/commandPalette/index.tsx @@ -201,6 +201,7 @@ function hotkeyUsesModifiers() { export default definePlugin({ name: "CommandPalette", description: "Quickly run actions through a searchable command palette", + tags: ["Appearance", "Customisation", "Commands", "Shortcuts"], authors: [EquicordDevs.justjxke], settings, patches: [ diff --git a/src/equicordplugins/components.dev/index.tsx b/src/equicordplugins/components.dev/index.tsx index b740b2403..539ca46bb 100644 --- a/src/equicordplugins/components.dev/index.tsx +++ b/src/equicordplugins/components.dev/index.tsx @@ -18,6 +18,7 @@ import ComponentsTab from "./components/ComponentsTab"; export default definePlugin({ name: "Components", description: "Adds a new tab to settings to browse Discord components.", + tags: ["Appearance", "Customisation", "Console", "Developers", "Organisation"], authors: [Devs.prism], dependencies: ["Settings"], startAt: StartAt.WebpackReady, diff --git a/src/equicordplugins/contentWarning/index.tsx b/src/equicordplugins/contentWarning/index.tsx index cb2283c19..0c6982df5 100644 --- a/src/equicordplugins/contentWarning/index.tsx +++ b/src/equicordplugins/contentWarning/index.tsx @@ -152,6 +152,7 @@ export default definePlugin({ name: "ContentWarning", authors: [EquicordDevs.camila314], description: "Allows you to specify certain trigger words that will be blurred by default. Hovering/Clicking on the blurred content will reveal it.", + tags: ["Appearance", "Utility"], settings, patches: [ { diff --git a/src/equicordplugins/copyProfileColors/index.tsx b/src/equicordplugins/copyProfileColors/index.tsx index 256e86994..fb175839c 100644 --- a/src/equicordplugins/copyProfileColors/index.tsx +++ b/src/equicordplugins/copyProfileColors/index.tsx @@ -90,6 +90,7 @@ const userContextMenuPatch: NavContextMenuPatchCallback = (children, { user }) = export default definePlugin({ name: "CopyProfileColors", description: "A plugin to copy people's profile gradient colors to clipboard.", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.Crxa, EquicordDevs.Cortex], contextMenus: { "user-context": userContextMenuPatch, diff --git a/src/equicordplugins/copyStatusUrls/index.ts b/src/equicordplugins/copyStatusUrls/index.ts index c05692269..ff17bb6f0 100644 --- a/src/equicordplugins/copyStatusUrls/index.ts +++ b/src/equicordplugins/copyStatusUrls/index.ts @@ -23,6 +23,7 @@ const getMetadataFromApi: (activity: any, userId: string) => Promise = find export default definePlugin({ name: "CopyStatusUrls", description: "Copy the users status url when you right-click it", + tags: ["Activity", "Utility"], authors: [Devs.sadan], patches: [ diff --git a/src/equicordplugins/copyUserMention/index.tsx b/src/equicordplugins/copyUserMention/index.tsx index e11eda7e0..afcdaa55f 100644 --- a/src/equicordplugins/copyUserMention/index.tsx +++ b/src/equicordplugins/copyUserMention/index.tsx @@ -48,6 +48,7 @@ export default definePlugin({ name: "CopyUserMention", authors: [EquicordDevs.Cortex, Devs.castdrian], description: "Adds a button to copy user's mention on the user context menu, works best with ValidUser.", + tags: ["Chat", "Utility"], contextMenus: { "user-context": UserContextMenuPatch } diff --git a/src/equicordplugins/cursorBuddy/index.tsx b/src/equicordplugins/cursorBuddy/index.tsx index 7a5d82924..1bfb47a5c 100644 --- a/src/equicordplugins/cursorBuddy/index.tsx +++ b/src/equicordplugins/cursorBuddy/index.tsx @@ -235,6 +235,7 @@ migratePluginSettings("CursorBuddy", "Oneko", "oneko"); export default definePlugin({ name: "CursorBuddy", description: "Adds a sprite that follows your cursor.", + tags: ["Appearance", "Customisation", "Fun"], authors: [Devs.Ven, Devs.adryd, EquicordDevs.nexpid, EquicordDevs.ZcraftElite], searchTerms: ["Oneko", "FatassHorse", "Pet"], settings, diff --git a/src/equicordplugins/customFolderIcons/index.tsx b/src/equicordplugins/customFolderIcons/index.tsx index eecc37762..7c860d5f5 100644 --- a/src/equicordplugins/customFolderIcons/index.tsx +++ b/src/equicordplugins/customFolderIcons/index.tsx @@ -14,6 +14,7 @@ import { folderProp, int2rgba } from "./util"; export default definePlugin({ name: "CustomFolderIcons", description: "Customize folder icons with any png", + tags: ["Appearance", "Customisation", "Organisation"], authors: [EquicordDevs.sadan], settings, patches: [ diff --git a/src/equicordplugins/customSounds/index.tsx b/src/equicordplugins/customSounds/index.tsx index 7af13bd02..9dbb11e90 100644 --- a/src/equicordplugins/customSounds/index.tsx +++ b/src/equicordplugins/customSounds/index.tsx @@ -393,6 +393,7 @@ export function findOverride(id: string): SoundOverride | null { export default definePlugin({ name: "CustomSounds", description: "Customize Discord's sounds.", + tags: ["Customisation", "Notifications", "Voice"], authors: [Devs.ScattrdBlade, Devs.TheKodeToad], settings, startAt: StartAt.Init, diff --git a/src/equicordplugins/customStatusTimeouts/index.tsx b/src/equicordplugins/customStatusTimeouts/index.tsx index 90b8eed4b..d76f258a1 100644 --- a/src/equicordplugins/customStatusTimeouts/index.tsx +++ b/src/equicordplugins/customStatusTimeouts/index.tsx @@ -54,6 +54,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomStatusTimeouts", description: "Adds configurable timeout presets to the status (presence) menu.", + tags: ["Activity", "Utility"], authors: [EquicordDevs.Kiri, EquicordDevs.thororen], settings, patches: [ diff --git a/src/equicordplugins/customTimestamps/index.tsx b/src/equicordplugins/customTimestamps/index.tsx index 9aa55258a..3db95fdf3 100644 --- a/src/equicordplugins/customTimestamps/index.tsx +++ b/src/equicordplugins/customTimestamps/index.tsx @@ -125,6 +125,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomTimestamps", description: "Custom timestamps on messages and tooltips", + tags: ["Appearance", "Customisation"], authors: [Devs.Rini, EquicordDevs.nvhhr, EquicordDevs.Suffocate, Devs.Obsidian], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/customUserColors/index.tsx b/src/equicordplugins/customUserColors/index.tsx index db4db60e5..55f92cf3f 100644 --- a/src/equicordplugins/customUserColors/index.tsx +++ b/src/equicordplugins/customUserColors/index.tsx @@ -100,6 +100,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomUserColors", description: "Lets you add a custom color to any user, anywhere! Highly recommend to use with typingTweaks and roleColorEverywhere", + tags: ["Appearance", "Customisation", "Chat"], authors: [EquicordDevs.mochienya], contextMenus: { "user-context": userContextMenuPatch, diff --git a/src/equicordplugins/declutter/index.tsx b/src/equicordplugins/declutter/index.tsx index e816d9159..ea2e628b6 100644 --- a/src/equicordplugins/declutter/index.tsx +++ b/src/equicordplugins/declutter/index.tsx @@ -141,6 +141,7 @@ function SectionSeparator(title: string) { export default definePlugin({ name: "Declutter", description: "Cleans up Discord by removing non-essential UI elements like profile effects, shop tabs, boosts, and more.", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.Leon135, Devs.prism, Devs.Kyuuhachi], settings, patches: [ diff --git a/src/equicordplugins/disableCameras/index.tsx b/src/equicordplugins/disableCameras/index.tsx index aa928134b..0acdfeb5a 100644 --- a/src/equicordplugins/disableCameras/index.tsx +++ b/src/equicordplugins/disableCameras/index.tsx @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableCameras", description: "Disables cameras in a call by default", + tags: ["Appearance", "Customisation", "Media", "Privacy"], authors: [Devs.Joona], patches: [ { diff --git a/src/equicordplugins/discordDevBanner/index.tsx b/src/equicordplugins/discordDevBanner/index.tsx index 4e56bd288..febc2eb2a 100644 --- a/src/equicordplugins/discordDevBanner/index.tsx +++ b/src/equicordplugins/discordDevBanner/index.tsx @@ -14,6 +14,7 @@ import { makeDevBanner, settings } from "./components"; export default definePlugin({ name: "DiscordDevBanner", description: "Enables the Discord developer banner, in which displays the build-ID", + tags: ["Appearance", "Console", "Developers"], authors: [EquicordDevs.KrystalSkull, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/dragFavoriteEmotes/index.tsx b/src/equicordplugins/dragFavoriteEmotes/index.tsx index 2b8e6b096..f727028ae 100644 --- a/src/equicordplugins/dragFavoriteEmotes/index.tsx +++ b/src/equicordplugins/dragFavoriteEmotes/index.tsx @@ -45,6 +45,7 @@ export default definePlugin({ name: "DragFavoriteEmotes", authors: [EquicordDevs.PWall], description: "Adds the ability to change the order of your favourite emotes", + tags: ["Customisation", "Chat", "Emotes"], patches: [ { find: "#{intl::EMOJI_FAVORITE_TOOLTIP}", diff --git a/src/equicordplugins/dragify/index.tsx b/src/equicordplugins/dragify/index.tsx index d076ea7a7..bb1f3d63d 100644 --- a/src/equicordplugins/dragify/index.tsx +++ b/src/equicordplugins/dragify/index.tsx @@ -149,6 +149,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Dragify", description: "Drop users, channels, or servers into chat to insert mentions or invites.", + tags: ["Chat", "Servers", "Utility", "Voice"], authors: [EquicordDevs.justjxke], settings, diff --git a/src/equicordplugins/elementHighlighter.dev/index.tsx b/src/equicordplugins/elementHighlighter.dev/index.tsx index edbda06bb..c466b1449 100644 --- a/src/equicordplugins/elementHighlighter.dev/index.tsx +++ b/src/equicordplugins/elementHighlighter.dev/index.tsx @@ -449,6 +449,7 @@ function onToggle(e: KeyboardEvent) { export default definePlugin({ name: "ElementHighlighter", description: "Highlight and inspect elements easily.", + tags: ["Developers"], authors: [Devs.prism], settings, diff --git a/src/equicordplugins/equibopStreamFixes.equibop/index.tsx b/src/equicordplugins/equibopStreamFixes.equibop/index.tsx index fb9a99b3f..2f6341ca1 100644 --- a/src/equicordplugins/equibopStreamFixes.equibop/index.tsx +++ b/src/equicordplugins/equibopStreamFixes.equibop/index.tsx @@ -89,6 +89,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "EquibopStreamFixes", description: "Tries to fix stream quality on Equibop by patching Discord's encoder and quality restrictions.", + tags: ["Voice"], authors: [EquicordDevs.creations], settings, diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx index d7d082bb9..8bf3f9fc3 100644 --- a/src/equicordplugins/equicordHelper/index.tsx +++ b/src/equicordplugins/equicordHelper/index.tsx @@ -133,6 +133,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "EquicordHelper", description: "Used to provide support, fix discord caused crashes, and other misc features.", + tags: ["Appearance", "Commands", "Utility"], authors: [ Devs.thororen, EquicordDevs.nyx, diff --git a/src/equicordplugins/equissant/index.ts b/src/equicordplugins/equissant/index.ts index 188316213..b5b4ad4bd 100644 --- a/src/equicordplugins/equissant/index.ts +++ b/src/equicordplugins/equissant/index.ts @@ -33,6 +33,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Equissant", description: "Crossant every specified amount of clicks :trolley:", + tags: ["Fun"], authors: [EquicordDevs.SomeAspy, Devs.thororen], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/exitSounds/index.tsx b/src/equicordplugins/exitSounds/index.tsx index db67fe6ed..4273c32e0 100644 --- a/src/equicordplugins/exitSounds/index.tsx +++ b/src/equicordplugins/exitSounds/index.tsx @@ -104,6 +104,7 @@ let original: typeof ChannelActions.selectVoiceChannel; export default definePlugin({ name: "ExitSounds", description: "Play soundboard sounds when you disconnect from voice.", + tags: ["Fun", "Voice"], authors: [Devs.prism], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/exportMessages/index.tsx b/src/equicordplugins/exportMessages/index.tsx index d2d3d68f5..ec3accf62 100644 --- a/src/equicordplugins/exportMessages/index.tsx +++ b/src/equicordplugins/exportMessages/index.tsx @@ -129,6 +129,7 @@ function getUsernames(contacts: ContactsList[], type: number): string[] { export default definePlugin({ name: "ExportMessages", description: "Allows you to export any message to a file", + tags: ["Chat", "Utility"], authors: [EquicordDevs.veygax, EquicordDevs.dat_insanity], settings, contextMenus: { diff --git a/src/equicordplugins/fastDeleteChannels/index.tsx b/src/equicordplugins/fastDeleteChannels/index.tsx index e4b20c200..adff9bea7 100644 --- a/src/equicordplugins/fastDeleteChannels/index.tsx +++ b/src/equicordplugins/fastDeleteChannels/index.tsx @@ -74,6 +74,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FastDeleteChannels", description: "Adds a trash icon to delete channels", + tags: ["Servers", "Utility"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/favouriteAnything/index.tsx b/src/equicordplugins/favouriteAnything/index.tsx index 4798868fc..9aaa3c214 100644 --- a/src/equicordplugins/favouriteAnything/index.tsx +++ b/src/equicordplugins/favouriteAnything/index.tsx @@ -25,6 +25,7 @@ export const AttachmentContext = proxyLazyWebpack(() => React.createContext export default definePlugin({ name: "FileUpload", description: "Upload images and videos to file hosting services like Zipline and Nest", + tags: ["Media"], authors: [EquicordDevs.creations, EquicordDevs.keircn, Devs.ScattrdBlade], settings, patches: [ diff --git a/src/equicordplugins/findReply/index.tsx b/src/equicordplugins/findReply/index.tsx index e76cf8f69..7c86c64e2 100644 --- a/src/equicordplugins/findReply/index.tsx +++ b/src/equicordplugins/findReply/index.tsx @@ -89,6 +89,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FindReply", description: "Jumps to the earliest reply to a message in a channel (lets you follow past conversations more easily).", + tags: ["Chat", "Shortcuts"], authors: [Devs.newwares], settings, messagePopoverButton: { diff --git a/src/equicordplugins/fixFileExtensions/index.tsx b/src/equicordplugins/fixFileExtensions/index.tsx index 489f4d5e5..0c2f3a2d7 100644 --- a/src/equicordplugins/fixFileExtensions/index.tsx +++ b/src/equicordplugins/fixFileExtensions/index.tsx @@ -29,6 +29,7 @@ export default definePlugin({ name: "FixFileExtensions", authors: [Devs.thororen], description: "Fixes file extensions by renaming them to a compatible supported format if possible", + tags: ["Media", "Utility"], reporterTestable: ReporterTestable.None, patches: [ // Taken from AnonymiseFileNames diff --git a/src/equicordplugins/followVoiceUser/index.tsx b/src/equicordplugins/followVoiceUser/index.tsx index 18ef15244..56f242166 100644 --- a/src/equicordplugins/followVoiceUser/index.tsx +++ b/src/equicordplugins/followVoiceUser/index.tsx @@ -74,6 +74,7 @@ const UserContextMenuPatch: NavContextMenuPatchCallback = (children, { channel, export default definePlugin({ name: "FollowVoiceUser", description: "Follow a friend in voice chat.", + tags: ["Voice"], authors: [EquicordDevs.TheArmagan], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/fontLoader/index.tsx b/src/equicordplugins/fontLoader/index.tsx index f81c1d9a5..aab6f31f3 100644 --- a/src/equicordplugins/fontLoader/index.tsx +++ b/src/equicordplugins/fontLoader/index.tsx @@ -200,6 +200,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FontLoader", description: "Loads any font from Google Fonts", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.vmohammad], settings, diff --git a/src/equicordplugins/forwardAnywhere/index.ts b/src/equicordplugins/forwardAnywhere/index.ts index 4b1a4dd4e..0404c4acf 100644 --- a/src/equicordplugins/forwardAnywhere/index.ts +++ b/src/equicordplugins/forwardAnywhere/index.ts @@ -25,6 +25,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "ForwardAnywhere", description: "If a forward fails send it as a normal message also allows nsfw forwards", + tags: ["Chat", "Utility"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/frequentQuickSwitcher/index.tsx b/src/equicordplugins/frequentQuickSwitcher/index.tsx index c2d61a11e..f6c2a3770 100644 --- a/src/equicordplugins/frequentQuickSwitcher/index.tsx +++ b/src/equicordplugins/frequentQuickSwitcher/index.tsx @@ -37,6 +37,7 @@ function generateSearchResults(query) { export default definePlugin({ name: "FrequentQuickSwitcher", description: "Rewrites and filters the quick switcher results to be your most frequent channels", + tags: ["Shortcuts", "Servers"], authors: [Devs.Samwich], generateSearchResults: generateSearchResults, patches: [ diff --git a/src/equicordplugins/friendCodes/index.tsx b/src/equicordplugins/friendCodes/index.tsx index 8168cfe04..9997a8347 100644 --- a/src/equicordplugins/friendCodes/index.tsx +++ b/src/equicordplugins/friendCodes/index.tsx @@ -12,6 +12,7 @@ import FriendCodesPanel from "./FriendCodesPanel"; export default definePlugin({ name: "FriendCodes", description: "Generate FriendCodes to easily add friends", + tags: ["Friends", "Utility"], authors: [Devs.HypedDomi], patches: [ { diff --git a/src/equicordplugins/friendTags/index.tsx b/src/equicordplugins/friendTags/index.tsx index 0f893cdb8..520fafda4 100644 --- a/src/equicordplugins/friendTags/index.tsx +++ b/src/equicordplugins/friendTags/index.tsx @@ -209,6 +209,7 @@ const userPatch: NavContextMenuPatchCallback = (children, { user }) => { export default definePlugin({ name: "FriendTags", description: "Allows you to filter by custom tags in the quick switcher by starting a search with &", + tags: ["Shortcuts"], authors: [Devs.Samwich], settings, contextMenus: { diff --git a/src/equicordplugins/friendshipRanks/index.tsx b/src/equicordplugins/friendshipRanks/index.tsx index 9294c9f61..ff91f1cbd 100644 --- a/src/equicordplugins/friendshipRanks/index.tsx +++ b/src/equicordplugins/friendshipRanks/index.tsx @@ -143,6 +143,7 @@ function getBadgesToApply() { export default definePlugin({ name: "FriendshipRanks", description: "Adds badges showcasing how long you have been friends with a user for", + tags: ["Friends"], authors: [Devs.Samwich], start() { getBadgesToApply().forEach(b => Badges.addProfileBadge(b)); diff --git a/src/equicordplugins/fullVcPfp/index.tsx b/src/equicordplugins/fullVcPfp/index.tsx index f1664da80..09c9fec27 100644 --- a/src/equicordplugins/fullVcPfp/index.tsx +++ b/src/equicordplugins/fullVcPfp/index.tsx @@ -14,6 +14,7 @@ import style from "./style.css?managed"; export default definePlugin({ name: "FullVCPFP", description: "Makes avatars take up the entire vc tile", + tags: ["Appearance", "Voice"], authors: [EquicordDevs.mochienya], patches: [ { diff --git a/src/equicordplugins/ghosted/index.tsx b/src/equicordplugins/ghosted/index.tsx index 921970696..ca2b504d9 100644 --- a/src/equicordplugins/ghosted/index.tsx +++ b/src/equicordplugins/ghosted/index.tsx @@ -147,6 +147,7 @@ function makeContextItem(props) { export default definePlugin({ name: "Ghosted", description: "A cute ghost will appear if you don't answer their DMs", + tags: ["Chat", "Utility"], authors: [EquicordDevs.vei, Devs.sadan, EquicordDevs.justjxke, EquicordDevs.iamme], settings, dependencies: ["AudioPlayerAPI", "ServerListAPI"], diff --git a/src/equicordplugins/gifCollections/index.tsx b/src/equicordplugins/gifCollections/index.tsx index 8bfc180d7..92c3ac962 100644 --- a/src/equicordplugins/gifCollections/index.tsx +++ b/src/equicordplugins/gifCollections/index.tsx @@ -26,6 +26,7 @@ let oldTrendingCat: Category[] | null = null; export default definePlugin({ name: "GifCollections", description: "Allows you to create collections of gifs.", + tags: ["Chat", "Emotes"], authors: [EquicordDevs.creations], settings, contextMenus: { diff --git a/src/equicordplugins/githubRepos/index.tsx b/src/equicordplugins/githubRepos/index.tsx index 75f566a82..0bfdd025b 100644 --- a/src/equicordplugins/githubRepos/index.tsx +++ b/src/equicordplugins/githubRepos/index.tsx @@ -38,6 +38,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "GitHubRepos", description: "Displays a user's public GitHub repositories in their profile", + tags: ["Appearance"], authors: [EquicordDevs.talhakf, EquicordDevs.Panniku, EquicordDevs.benjii], settings, diff --git a/src/equicordplugins/globalBadges/index.tsx b/src/equicordplugins/globalBadges/index.tsx index 24802395a..53e772f9a 100644 --- a/src/equicordplugins/globalBadges/index.tsx +++ b/src/equicordplugins/globalBadges/index.tsx @@ -25,6 +25,7 @@ migratePluginSetting("GlobalBadges", "showRaincord", "showRa1ncord"); export default definePlugin({ name: "GlobalBadges", description: "Adds global badges from other client mods", + tags: ["Appearance"], authors: [Devs.HypedDomi, EquicordDevs.Wolfie, Devs.thororen], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/googleThat/index.tsx b/src/equicordplugins/googleThat/index.tsx index ad70e3217..ef6005761 100644 --- a/src/equicordplugins/googleThat/index.tsx +++ b/src/equicordplugins/googleThat/index.tsx @@ -75,6 +75,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "GoogleThat", description: "Adds a command to send a internet search link", + tags: ["Commands", "Utility"], authors: [Devs.Samwich, EquicordDevs.KrystalSkull], searchTerms: ["search", "google", "query", "duckduckgo", "command"], settings, diff --git a/src/equicordplugins/guildPickerDumper/index.tsx b/src/equicordplugins/guildPickerDumper/index.tsx index 58892bf73..fe9e86b39 100644 --- a/src/equicordplugins/guildPickerDumper/index.tsx +++ b/src/equicordplugins/guildPickerDumper/index.tsx @@ -95,6 +95,7 @@ async function zipGuildAssets(guild: Guild, type: "emojis" | "stickers") { export default definePlugin({ name: "GuildPickerDumper", description: "Context menu to dump and download a server's emojis and stickers.", + tags: ["Emotes", "Servers", "Utility"], authors: [EquicordDevs.Cortex, Devs.Samwich, EquicordDevs.Synth, Devs.thororen], contextMenus: { "guild-context": Patch, diff --git a/src/equicordplugins/hideChatButtons/index.tsx b/src/equicordplugins/hideChatButtons/index.tsx index 2a942ecd5..7d8d5f989 100644 --- a/src/equicordplugins/hideChatButtons/index.tsx +++ b/src/equicordplugins/hideChatButtons/index.tsx @@ -81,6 +81,7 @@ function ButtonsInnerComponent({ buttons }: { buttons: ReactNode; }) { export default definePlugin({ name: "HideChatButtons", description: "Able to hide the chat buttons", + tags: ["Chat", "Utility"], settings: settings, authors: [EquicordDevs.iamme], patches: [ diff --git a/src/equicordplugins/hideMessages/index.tsx b/src/equicordplugins/hideMessages/index.tsx index ca5feb6bd..4741a195f 100644 --- a/src/equicordplugins/hideMessages/index.tsx +++ b/src/equicordplugins/hideMessages/index.tsx @@ -49,6 +49,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "HideMessages", description: "A plugin to temporarily hide messages until you restart.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.yash], contextMenus: { "message": messageCtxPatch diff --git a/src/equicordplugins/hideServers/index.tsx b/src/equicordplugins/hideServers/index.tsx index e91104fea..8de222d2f 100644 --- a/src/equicordplugins/hideServers/index.tsx +++ b/src/equicordplugins/hideServers/index.tsx @@ -76,6 +76,7 @@ export function removeIndicator() { export default definePlugin({ name: "HideServers", description: "Allows you to hide servers from the guild list and quick switcher by right clicking them", + tags: ["Servers", "Utility"], authors: [EquicordDevs.bep], searchTerms: ["guild", "server", "hide", "folder"], diff --git a/src/equicordplugins/holyNotes/index.tsx b/src/equicordplugins/holyNotes/index.tsx index f98001b74..cab8fde2c 100644 --- a/src/equicordplugins/holyNotes/index.tsx +++ b/src/equicordplugins/holyNotes/index.tsx @@ -72,6 +72,7 @@ function ToolBarHeader() { export default definePlugin({ name: "HolyNotes", description: "Save messages as notes to revisit later", + tags: ["Chat", "Organisation"], authors: [EquicordDevs.Wolfie], toolboxActions: { diff --git a/src/equicordplugins/homeTyping/index.tsx b/src/equicordplugins/homeTyping/index.tsx index 83fa1c0b9..0d652c337 100644 --- a/src/equicordplugins/homeTyping/index.tsx +++ b/src/equicordplugins/homeTyping/index.tsx @@ -18,6 +18,7 @@ const PrivateChannelSortStore = findStoreLazy("PrivateChannelSortStore") as { ge export default definePlugin({ name: "HomeTyping", description: "Changes the home button to a typing indicator if someone in your dms is typing", + tags: ["Chat"], authors: [Devs.Samwich], TypingIcon() { return ; diff --git a/src/equicordplugins/hopOn/index.tsx b/src/equicordplugins/hopOn/index.tsx index cd0de30ed..a9a2b15a6 100644 --- a/src/equicordplugins/hopOn/index.tsx +++ b/src/equicordplugins/hopOn/index.tsx @@ -32,6 +32,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "HopOn", description: "Hop on! Opens a configurable URL when a message matches a custom regex in the current channel.", + tags: ["Fun"], authors: [Devs.ImLvna], settings, flux: { diff --git a/src/equicordplugins/husk/index.tsx b/src/equicordplugins/husk/index.tsx index 25aad8e37..5f231db91 100644 --- a/src/equicordplugins/husk/index.tsx +++ b/src/equicordplugins/husk/index.tsx @@ -99,6 +99,7 @@ function getEmojiIdThatShouldBeUsed(guildId: string) { export default definePlugin({ name: "Husk", description: "Adds Husk button (check settings to change used emoji)", + tags: ["Emotes", "Fun"], authors: [Devs.nin0dev], settings, messagePopoverButton: { diff --git a/src/equicordplugins/iRememberYou/index.tsx b/src/equicordplugins/iRememberYou/index.tsx index dc9f62b57..2a469c2e2 100644 --- a/src/equicordplugins/iRememberYou/index.tsx +++ b/src/equicordplugins/iRememberYou/index.tsx @@ -19,6 +19,7 @@ import DataUI from "./components/ui"; export default definePlugin({ name: "IRememberYou", description: "Locally saves everyone you've been communicating with (including servers), in case of lose", + tags: ["Chat", "Servers"], authors: [EquicordDevs.zoodogood, EquicordDevs.keircn], dependencies: ["MessageEventsAPI"], diff --git a/src/equicordplugins/iconViewer/index.tsx b/src/equicordplugins/iconViewer/index.tsx index 1f364adf5..6df0d72f1 100644 --- a/src/equicordplugins/iconViewer/index.tsx +++ b/src/equicordplugins/iconViewer/index.tsx @@ -19,6 +19,7 @@ import { SettingsAbout } from "./components/Modals"; export default definePlugin({ name: "IconViewer", description: "Adds a new tab to settings to preview all icons.", + tags: ["Developers"], authors: [EquicordDevs.iamme], dependencies: ["Settings"], startAt: StartAt.WebpackReady, diff --git a/src/equicordplugins/idleAutoRestart/index.tsx b/src/equicordplugins/idleAutoRestart/index.tsx index 2112f671f..33d11e2eb 100644 --- a/src/equicordplugins/idleAutoRestart/index.tsx +++ b/src/equicordplugins/idleAutoRestart/index.tsx @@ -36,6 +36,7 @@ function onActivity() { export default definePlugin({ name: "IdleAutoRestart", description: "Automatically restarts the client after being idle for a configurable amount of time, but avoids restarting while you are in VC.", + tags: ["Utility"], authors: [EquicordDevs.SteelTech], settings, diff --git a/src/equicordplugins/ignoreCalls/index.tsx b/src/equicordplugins/ignoreCalls/index.tsx index 2505ce860..1a448fb7b 100644 --- a/src/equicordplugins/ignoreCalls/index.tsx +++ b/src/equicordplugins/ignoreCalls/index.tsx @@ -93,6 +93,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "IgnoreCalls", description: "Allows you to ignore calls from specific users or dm groups.", + tags: ["Voice"], authors: [EquicordDevs.TheArmagan, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/inRole/index.tsx b/src/equicordplugins/inRole/index.tsx index 755f9219c..bba8ea205 100644 --- a/src/equicordplugins/inRole/index.tsx +++ b/src/equicordplugins/inRole/index.tsx @@ -34,6 +34,7 @@ function getMembersInRole(roleId: string, guildId: string) { export default definePlugin({ name: "InRole", description: "Know who is in a role with the role context menu or /inrole command (read plugin info!)", + tags: ["Commands", "Roles"], authors: [Devs.nin0dev], dependencies: ["UserSettingsAPI"], start() { diff --git a/src/equicordplugins/ingtoninator/index.tsx b/src/equicordplugins/ingtoninator/index.tsx index 43013fc4f..ad9ba2523 100644 --- a/src/equicordplugins/ingtoninator/index.tsx +++ b/src/equicordplugins/ingtoninator/index.tsx @@ -146,6 +146,7 @@ function disabledIcon() { export default definePlugin({ name: "Ingtoninator", description: "Suffixes 'ington' to a random word in your message", + tags: ["Fun"], authors: [EquicordDevs.zyqunix, EquicordDevs.BioTomateDE], settings, chatBarButton: { diff --git a/src/equicordplugins/instantScreenshare/index.tsx b/src/equicordplugins/instantScreenshare/index.tsx index 6a55107be..b947da3c1 100644 --- a/src/equicordplugins/instantScreenshare/index.tsx +++ b/src/equicordplugins/instantScreenshare/index.tsx @@ -62,6 +62,7 @@ async function autoStartStream(instant = true) { export default definePlugin({ name: "InstantScreenshare", description: "Instantly screenshare when joining a voice channel with support for desktop sources, windows, and video input devices (cameras, capture cards)", + tags: ["Media", "Voice"], authors: [Devs.HAHALOSAH, Devs.thororen, EquicordDevs.mart], dependencies: ["EquicordToolbox"], searchTerms: ["ScreenshareKeybind"], diff --git a/src/equicordplugins/invisibleChat.desktop/index.tsx b/src/equicordplugins/invisibleChat.desktop/index.tsx index 5589f8dec..f45bb427c 100644 --- a/src/equicordplugins/invisibleChat.desktop/index.tsx +++ b/src/equicordplugins/invisibleChat.desktop/index.tsx @@ -149,6 +149,7 @@ export async function buildEmbed(message: any, revealed: string): Promise export default definePlugin({ name: "InvisibleChat", description: "Encrypt your Messages in a non-suspicious way!", + tags: ["Chat"], authors: [Devs.SammCheese], dependencies: ["MessageUpdaterAPI"], reporterTestable: ReporterTestable.Patches, diff --git a/src/equicordplugins/inviteDefaults/index.ts b/src/equicordplugins/inviteDefaults/index.ts index 597c96fec..476651731 100644 --- a/src/equicordplugins/inviteDefaults/index.ts +++ b/src/equicordplugins/inviteDefaults/index.ts @@ -45,6 +45,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "InviteDefaults", description: "Allows you to edit the default values when creating server invites.", + tags: ["Servers"], authors: [EquicordDevs.VillainsRule], settings, patches: [ diff --git a/src/equicordplugins/jumpTo/index.tsx b/src/equicordplugins/jumpTo/index.tsx index 537d9c19f..791b2a93b 100644 --- a/src/equicordplugins/jumpTo/index.tsx +++ b/src/equicordplugins/jumpTo/index.tsx @@ -121,6 +121,7 @@ const MessageMenuPatch: NavContextMenuPatchCallback = (children, { message }: { export default definePlugin({ name: "JumpTo", description: "Adds context menu options to jump to the start or bottom of a channel/DM.", + tags: ["Chat", "Utility"], authors: [Devs.Samwich, Devs.thororen], contextMenus: { "channel-context": ChannelMenuPatch, diff --git a/src/equicordplugins/jumpscare/index.tsx b/src/equicordplugins/jumpscare/index.tsx index 5a8e4d531..8070cfd13 100644 --- a/src/equicordplugins/jumpscare/index.tsx +++ b/src/equicordplugins/jumpscare/index.tsx @@ -48,6 +48,7 @@ function getJumpscareRoot(): Root { export default definePlugin({ name: "Jumpscare", description: "Adds a configurable chance of jumpscaring you whenever you open a channel. Inspired by Geometry Dash Mega Hack", + tags: ["Fun"], authors: [Devs.surgedevs], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/keyboardNavigation/index.tsx b/src/equicordplugins/keyboardNavigation/index.tsx index f0c6e8d2a..852edafa6 100644 --- a/src/equicordplugins/keyboardNavigation/index.tsx +++ b/src/equicordplugins/keyboardNavigation/index.tsx @@ -87,6 +87,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "KeyboardNavigation", description: "Allows you to navigate the UI with a keyboard.", + tags: ["Accessibility", "Shortcuts"], authors: [Devs.Ethan], settings, diff --git a/src/equicordplugins/keyboardSounds/index.ts b/src/equicordplugins/keyboardSounds/index.ts index 14c8018ff..e85262bdd 100644 --- a/src/equicordplugins/keyboardSounds/index.ts +++ b/src/equicordplugins/keyboardSounds/index.ts @@ -126,6 +126,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "KeyboardSounds", description: "Adds OperaGX or osu! sound effects when typing on your keyboard.", + tags: ["Fun"], authors: [Devs.HypedDomi, EquicordDevs.Etorix], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/keywordNotify/index.tsx b/src/equicordplugins/keywordNotify/index.tsx index 10b08dddb..5b7664e03 100644 --- a/src/equicordplugins/keywordNotify/index.tsx +++ b/src/equicordplugins/keywordNotify/index.tsx @@ -318,6 +318,7 @@ export default definePlugin({ name: "KeywordNotify", authors: [EquicordDevs.camila314, EquicordDevs.x3rt], description: "Sends a notification if a given message matches certain keywords or regexes", + tags: ["Chat", "Notifications"], settings, patches: [ { diff --git a/src/equicordplugins/lastActive/index.tsx b/src/equicordplugins/lastActive/index.tsx index 9e8333a5e..9ca7a035c 100644 --- a/src/equicordplugins/lastActive/index.tsx +++ b/src/equicordplugins/lastActive/index.tsx @@ -135,6 +135,7 @@ export function LastActiveIcon() { export default definePlugin({ name: "LastActive", description: "A plugin to jump to last active message from yourself or another user in a channel/server.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.Crxa], contextMenus: { "channel-context": ChannelContextMenuPatch, diff --git a/src/equicordplugins/loginWithQR/index.tsx b/src/equicordplugins/loginWithQR/index.tsx index 21f1c7c9d..e1f076aa2 100644 --- a/src/equicordplugins/loginWithQR/index.tsx +++ b/src/equicordplugins/loginWithQR/index.tsx @@ -42,6 +42,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LoginWithQR", description: "Allows you to login to another device by scanning a login QR code, just like on mobile!", + tags: ["Utility"], authors: [EquicordDevs.nexpid], settings, diff --git a/src/equicordplugins/mediaPlaybackSpeed/index.tsx b/src/equicordplugins/mediaPlaybackSpeed/index.tsx index 42edab6e7..086f2f1e2 100644 --- a/src/equicordplugins/mediaPlaybackSpeed/index.tsx +++ b/src/equicordplugins/mediaPlaybackSpeed/index.tsx @@ -48,6 +48,7 @@ type MediaRef = RefObject | undefined; export default definePlugin({ name: "MediaPlaybackSpeed", description: "Allows changing the (default) playback speed of media embeds", + tags: ["Chat", "Media"], authors: [Devs.D3SOX], settings, patches: [ diff --git a/src/equicordplugins/messageBurst/index.ts b/src/equicordplugins/messageBurst/index.ts index 0d60216c8..9dd35b50a 100644 --- a/src/equicordplugins/messageBurst/index.ts +++ b/src/equicordplugins/messageBurst/index.ts @@ -66,6 +66,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "MessageBurst", description: "Merges messages sent within a time period with your previous sent message if no one else sends a message before you.", + tags: ["Chat"], authors: [EquicordDevs.port22exposed], settings, onBeforeMessageSend(channelId, message) { diff --git a/src/equicordplugins/messageColors/index.tsx b/src/equicordplugins/messageColors/index.tsx index 568718102..5217971a8 100644 --- a/src/equicordplugins/messageColors/index.tsx +++ b/src/equicordplugins/messageColors/index.tsx @@ -27,6 +27,7 @@ export default definePlugin({ authors: [EquicordDevs.Hen], name: "MessageColors", description: "Displays color codes like #FF0042 inside of messages", + tags: ["Appearance", "Chat"], settings, patches: [ // Create a new markdown rule, so it parses just like any other features diff --git a/src/equicordplugins/messageFetchTimer/index.tsx b/src/equicordplugins/messageFetchTimer/index.tsx index 139a35209..a60462f1e 100644 --- a/src/equicordplugins/messageFetchTimer/index.tsx +++ b/src/equicordplugins/messageFetchTimer/index.tsx @@ -147,6 +147,7 @@ function handleMessageLoad(data: any) { export default definePlugin({ name: "MessageFetchTimer", description: "Shows how long it took to fetch messages for the current channel", + tags: ["Chat", "Utility"], authors: [EquicordDevs.GroupXyz], settings, diff --git a/src/equicordplugins/messageLinkTooltip/index.tsx b/src/equicordplugins/messageLinkTooltip/index.tsx index 87f97581a..8e0d053f7 100644 --- a/src/equicordplugins/messageLinkTooltip/index.tsx +++ b/src/equicordplugins/messageLinkTooltip/index.tsx @@ -62,6 +62,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "MessageLinkTooltip", description: "Adds a tooltip with a message preview when hovering over message links, replies, and forwarded messages.", + tags: ["Appearance", "Chat"], authors: [Devs.Kyuuhachi], settings, diff --git a/src/equicordplugins/messageLoggerEnhanced/index.tsx b/src/equicordplugins/messageLoggerEnhanced/index.tsx index e8b3cdab9..aad1f85f5 100644 --- a/src/equicordplugins/messageLoggerEnhanced/index.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/index.tsx @@ -18,8 +18,8 @@ import { FluxDispatcher, MessageStore, SelectedChannelStore, UserStore } from "@ import { LogsIcon, OpenLogsButton } from "./components/LogsButton"; import { openLogModal } from "./components/LogsModal"; import * as idb from "./db"; -import { addMessage } from "./LoggedMessageManager"; import * as LoggedMessageManager from "./LoggedMessageManager"; +import { addMessage } from "./LoggedMessageManager"; import { settings } from "./settings"; import { FetchMessagesResponse, LoadMessagePayload, LoggedMessage, LoggedMessageJSON, MessageCreatePayload, MessageDeleteBulkPayload, MessageDeletePayload, MessageUpdatePayload } from "./types"; import { cleanUpCachedMessage, cleanupUserObject, getNative, isGhostPinged, mapTimestamp, messageJsonToMessageClass, reAddDeletedMessages } from "./utils"; @@ -258,6 +258,7 @@ export default definePlugin({ name: "MessageLoggerEnhanced", authors: [Devs.Aria, EquicordDevs.keircn], description: "Improves MessageLogger with edited message history, ghost ping detection and more", + tags: ["Chat", "Servers"], dependencies: ["MessageLogger"], patches: [ diff --git a/src/equicordplugins/messageNotifier/index.ts b/src/equicordplugins/messageNotifier/index.ts index 7a41158d0..af9cee4b6 100644 --- a/src/equicordplugins/messageNotifier/index.ts +++ b/src/equicordplugins/messageNotifier/index.ts @@ -38,6 +38,7 @@ export default definePlugin({ authors: [EquicordDevs.cassie, EquicordDevs.mochienya], name: "MessageNotifier", description: "Get toasts for when chosen users send a message", + tags: ["Chat", "Notifications"], settings, flux: { MESSAGE_CREATE({ message, channelId, guildId }: MessageCreatePayload) { diff --git a/src/equicordplugins/messagePeek/index.tsx b/src/equicordplugins/messagePeek/index.tsx index 340552eac..b22824096 100644 --- a/src/equicordplugins/messagePeek/index.tsx +++ b/src/equicordplugins/messagePeek/index.tsx @@ -239,6 +239,7 @@ function shouldShowActivity(lastMessage: Message | undefined, hasActivity: boole export default definePlugin({ name: "MessagePeek", description: "Shows the last message preview and timestamp in the Direct Messages list.", + tags: ["Appearance", "Chat"], authors: [Devs.prism, EquicordDevs.justjxke], settings, patches: [ diff --git a/src/equicordplugins/messageTranslate/index.tsx b/src/equicordplugins/messageTranslate/index.tsx index 68adbbd0b..64b7f50d2 100644 --- a/src/equicordplugins/messageTranslate/index.tsx +++ b/src/equicordplugins/messageTranslate/index.tsx @@ -51,6 +51,7 @@ function triggerReRender(message: MessageWithContent) { export default definePlugin({ name: "MessageTranslate", description: "Auto translate messages to your language with caching, per-channel toggles, and more options.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.creations], settings, diff --git a/src/equicordplugins/micLoopbackTester/index.tsx b/src/equicordplugins/micLoopbackTester/index.tsx index f0f249fd6..8e0a27a60 100644 --- a/src/equicordplugins/micLoopbackTester/index.tsx +++ b/src/equicordplugins/micLoopbackTester/index.tsx @@ -115,6 +115,7 @@ const MicLoopbackUserAreaButton: UserAreaButtonFactory = props => ( diff --git a/src/equicordplugins/newPluginsManager/index.tsx b/src/equicordplugins/newPluginsManager/index.tsx index 683d9de74..d4a340fc1 100644 --- a/src/equicordplugins/newPluginsManager/index.tsx +++ b/src/equicordplugins/newPluginsManager/index.tsx @@ -14,6 +14,7 @@ import { openNewPluginsModal } from "./NewPluginsModal"; export default definePlugin({ name: "NewPluginsManager", description: "Utility that notifies you when new plugins are added to Equicord", + tags: ["Utility"], authors: [Devs.Sqaaakoi], enabledByDefault: true, flux: { diff --git a/src/equicordplugins/noNitroUpsell/index.ts b/src/equicordplugins/noNitroUpsell/index.ts index d7b2eaf5d..cd3c2a665 100644 --- a/src/equicordplugins/noNitroUpsell/index.ts +++ b/src/equicordplugins/noNitroUpsell/index.ts @@ -10,7 +10,8 @@ import { OverridePremiumTypeStore } from "@webpack/common"; export default definePlugin({ name: "NoNitroUpsell", - description: "Removes ALL of Discord's nitro upsells by tricking the client into thinking you have nitro.", + description: "Removes all of Discord's nitro upsells by tricking the client into thinking you have nitro.", + tags: ["Utility"], authors: [Devs.thororen], flux: { CONNECTION_OPEN() { diff --git a/src/equicordplugins/noPushToTalk/index.ts b/src/equicordplugins/noPushToTalk/index.ts index ff5ee8682..fb2d922e8 100644 --- a/src/equicordplugins/noPushToTalk/index.ts +++ b/src/equicordplugins/noPushToTalk/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoPushToTalk", description: "Bypasses the push-to-talk requirement for voice activity in channels that enforce it.", + tags: ["Servers", "Voice"], authors: [EquicordDevs.omaw], patches: [ { diff --git a/src/equicordplugins/noRPC.discordDesktop/index.ts b/src/equicordplugins/noRPC.discordDesktop/index.ts index 51ed1f962..df2d409de 100644 --- a/src/equicordplugins/noRPC.discordDesktop/index.ts +++ b/src/equicordplugins/noRPC.discordDesktop/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoRPC", description: "Disables Discord's RPC server.", + tags: ["Privacy", "Servers"], authors: [Devs.Cyn], patches: [ { diff --git a/src/equicordplugins/noRoleHeaders/index.ts b/src/equicordplugins/noRoleHeaders/index.ts index 6b4a7d3a0..c008e9273 100644 --- a/src/equicordplugins/noRoleHeaders/index.ts +++ b/src/equicordplugins/noRoleHeaders/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoRoleHeaders", description: "We are all equal!! Removes the role headers in the member list.", + tags: ["Appearance", "Fun", "Roles"], authors: [Devs.Samwich], patches: [ { diff --git a/src/equicordplugins/normalizeMessageLinks/index.ts b/src/equicordplugins/normalizeMessageLinks/index.ts index 062f1ee44..6ee61a440 100644 --- a/src/equicordplugins/normalizeMessageLinks/index.ts +++ b/src/equicordplugins/normalizeMessageLinks/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NormalizeMessageLinks", description: "Strip canary/ptb from message links", + tags: ["Chat"], authors: [Devs.bb010g], patches: [ { diff --git a/src/equicordplugins/notificationTitle.discordDesktop/index.tsx b/src/equicordplugins/notificationTitle.discordDesktop/index.tsx index 56d8b3fef..f2db23cac 100644 --- a/src/equicordplugins/notificationTitle.discordDesktop/index.tsx +++ b/src/equicordplugins/notificationTitle.discordDesktop/index.tsx @@ -20,6 +20,7 @@ const MessageTypes = findByPropsLazy("REPLY", "STAGE_RAISE_HAND", "CHANNEL_NAME_ export default definePlugin({ name: "NotificationTitle", description: "Makes desktop notifications more informative", + tags: ["Appearance", "Notifications"], authors: [Devs.Kyuuhachi], patches: [ diff --git a/src/equicordplugins/orbolayBridge/index.tsx b/src/equicordplugins/orbolayBridge/index.tsx index 6c9863ee4..36d1a6ad5 100644 --- a/src/equicordplugins/orbolayBridge/index.tsx +++ b/src/equicordplugins/orbolayBridge/index.tsx @@ -314,6 +314,7 @@ const createWebsocket = () => { export default definePlugin({ name: "OrbolayBridge", description: "Bridge plugin to connect Orbolay to Discord", + tags: ["Utility", "Voice"], authors: [EquicordDevs.SpikeHD], settings, flux: { diff --git a/src/equicordplugins/partyMode/index.ts b/src/equicordplugins/partyMode/index.ts index f7cddbf97..8641257ad 100644 --- a/src/equicordplugins/partyMode/index.ts +++ b/src/equicordplugins/partyMode/index.ts @@ -44,6 +44,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PartyMode", description: "Allows you to use party mode cause the party never ends ✨", + tags: ["Fun"], authors: [Devs.UwUDev], reporterTestable: ReporterTestable.None, settings, diff --git a/src/equicordplugins/pinIcon/index.tsx b/src/equicordplugins/pinIcon/index.tsx index 1e6f5987f..d44edfe8f 100644 --- a/src/equicordplugins/pinIcon/index.tsx +++ b/src/equicordplugins/pinIcon/index.tsx @@ -25,6 +25,7 @@ const PinIcon = findComponentByCodeLazy("1-.06-.63L6.16"); export default definePlugin({ name: "PinIcon", description: "Adds a pin icon to pinned messages", + tags: ["Appearance", "Chat"], authors: [EquicordDevs.iamme], patches: [ { diff --git a/src/equicordplugins/pingNotifications/index.tsx b/src/equicordplugins/pingNotifications/index.tsx index e6b0e45e2..1d96249b5 100644 --- a/src/equicordplugins/pingNotifications/index.tsx +++ b/src/equicordplugins/pingNotifications/index.tsx @@ -92,6 +92,7 @@ function isUserBlocked(userId) { export default definePlugin({ name: "PingNotifications", description: "Customizable notifications with improved mention formatting", + tags: ["Chat", "Friends", "Notifications", "Servers"], authors: [EquicordDevs.smuki], settings, diff --git a/src/equicordplugins/platformSpoofer/index.tsx b/src/equicordplugins/platformSpoofer/index.tsx index e15a5df17..b8e574f3b 100644 --- a/src/equicordplugins/platformSpoofer/index.tsx +++ b/src/equicordplugins/platformSpoofer/index.tsx @@ -52,6 +52,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PlatformSpoofer", description: "Spoof what platform or device you're on", + tags: ["Utility"], authors: [EquicordDevs.Drag, EquicordDevs.neoarz], settingsAboutComponent: () => ( diff --git a/src/equicordplugins/polishWording/index.ts b/src/equicordplugins/polishWording/index.ts index 57f925901..4f623c04a 100644 --- a/src/equicordplugins/polishWording/index.ts +++ b/src/equicordplugins/polishWording/index.ts @@ -64,6 +64,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PolishWording", description: "Tweaks your messages to make them look nicer and have better grammar. See settings", + tags: ["Chat"], authors: [Devs.Samwich, EquicordDevs.WKoA], onBeforeMessageSend: presendObject, settings, diff --git a/src/equicordplugins/profileSets/index.tsx b/src/equicordplugins/profileSets/index.tsx index a2db97aa4..c9828017f 100644 --- a/src/equicordplugins/profileSets/index.tsx +++ b/src/equicordplugins/profileSets/index.tsx @@ -29,6 +29,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ProfileSets", description: "Allows you to save and load different profile presets, via the Profile Section in Settings.", + tags: ["Appearance", "Customisation", "Utility"], authors: [EquicordDevs.omaw, EquicordDevs.justjxke], settings, patches: [ diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index cf0d1c4ab..c85e0be53 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -1360,6 +1360,7 @@ migratePluginToSettings(true, "Questify", "QuestCompleter", "completeVideoQuests export default definePlugin({ name: "Questify", description: "Enhance your Quest experience with a suite of features, or disable them entirely if they're not your thing.", + tags: ["Appearance", "Customisation", "Privacy", "Utility"], authors: [EquicordDevs.Etorix], dependencies: ["AudioPlayerAPI", "ServerListAPI"], startAt: StartAt.Init, // Needed in order to beat Read All Messages to inserting above the server list. diff --git a/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx b/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx index 449e35239..82e9af31c 100644 --- a/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx +++ b/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx @@ -244,6 +244,7 @@ const handleThemeNamesChange = () => settings.store.autoRefresh && debouncedRefr export default definePlugin({ name: "QuickThemeSwitcher", description: "Quickly switch between themes using keyboard shortcuts.", + tags: ["Appearance", "Utility"], authors: [Devs.prism], settings, startAt: StartAt.DOMContentLoaded, diff --git a/src/equicordplugins/quoter/index.tsx b/src/equicordplugins/quoter/index.tsx index 95825e3c1..d41104617 100644 --- a/src/equicordplugins/quoter/index.tsx +++ b/src/equicordplugins/quoter/index.tsx @@ -58,6 +58,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Quoter", description: "Adds the ability to create an inspirational quote image from a message.", + tags: ["Chat"], authors: [Devs.Samwich, Devs.thororen, EquicordDevs.neoarz, Devs.prism], settings, diff --git a/src/equicordplugins/randomVoice/index.tsx b/src/equicordplugins/randomVoice/index.tsx index 6017aad6b..05c4a25d5 100644 --- a/src/equicordplugins/randomVoice/index.tsx +++ b/src/equicordplugins/randomVoice/index.tsx @@ -671,6 +671,7 @@ function renderOperationGroup({ export default definePlugin({ name: "RandomVoice", description: "Adds a button near mute to join a random voice channel.", + tags: ["Fun", "Voice"], authors: [EquicordDevs.xijexo, EquicordDevs.omaw, Devs.thororen], settings, diff --git a/src/equicordplugins/recentDMSwitcher/index.tsx b/src/equicordplugins/recentDMSwitcher/index.tsx index 96a271861..48e5977fa 100644 --- a/src/equicordplugins/recentDMSwitcher/index.tsx +++ b/src/equicordplugins/recentDMSwitcher/index.tsx @@ -332,6 +332,7 @@ function showCycleToast() { export default definePlugin({ name: "RecentDMSwitcher", description: "Ctrl+Tab between most recently used DMs (Ctrl+Shift+Tab reverse)", + tags: ["Chat", "Utility"], authors: [EquicordDevs.mmeta], settings, diff --git a/src/equicordplugins/remix/index.tsx b/src/equicordplugins/remix/index.tsx index 19595a5ef..a03d89d09 100644 --- a/src/equicordplugins/remix/index.tsx +++ b/src/equicordplugins/remix/index.tsx @@ -71,6 +71,7 @@ export function sendRemix(blob: Blob) { export default definePlugin({ name: "RemixRevived", description: "Revives Remix and breings it to Desktop", + tags: ["Customisation", "Fun"], authors: [EquicordDevs.MrDiamond, EquicordDevs.meowabyte], contextMenus: { "channel-attach": UploadContextMenuPatch, diff --git a/src/equicordplugins/repeatMessages/index.tsx b/src/equicordplugins/repeatMessages/index.tsx index 6ca6bc494..ef45a1fc7 100644 --- a/src/equicordplugins/repeatMessages/index.tsx +++ b/src/equicordplugins/repeatMessages/index.tsx @@ -132,6 +132,7 @@ migratePluginSettings("RepeatMessages", "RepeatMessage"); export default definePlugin({ name: "RepeatMessages", description: "Allows you to repeat messages quickly. If you hold shift while clicking the Repeat option, it will reply to the message.", + tags: ["Chat"], authors: [EquicordDevs.Tolgchu, Devs.thororen], contextMenus: { "message": messageCtxPatch diff --git a/src/equicordplugins/replyPingControl/index.ts b/src/equicordplugins/replyPingControl/index.ts index aa877cfb6..0db11f68a 100644 --- a/src/equicordplugins/replyPingControl/index.ts +++ b/src/equicordplugins/replyPingControl/index.ts @@ -27,6 +27,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ReplyPingControl", description: "Control whether to always or never get pinged on message replies, with a whitelist feature", + tags: ["Chat", "Notifications"], authors: [Devs.ant0n, EquicordDevs.MrDiamond], settings, diff --git a/src/equicordplugins/richMagnetLinks/index.tsx b/src/equicordplugins/richMagnetLinks/index.tsx index 33a42efbb..4cfb0275f 100644 --- a/src/equicordplugins/richMagnetLinks/index.tsx +++ b/src/equicordplugins/richMagnetLinks/index.tsx @@ -13,6 +13,7 @@ export default definePlugin({ authors: [EquicordDevs.cassie, EquicordDevs.mochienya, EquicordDevs.secp192k1], name: "RichMagnetLinks", description: "Renders magnet links like message links", + tags: ["Appearance", "Chat"], patches: [ { find: "AUTO_MODERATION_SYSTEM_MESSAGE_RULES:", diff --git a/src/equicordplugins/richPresence/index.tsx b/src/equicordplugins/richPresence/index.tsx index 8c0d4874e..d5d90f5bb 100644 --- a/src/equicordplugins/richPresence/index.tsx +++ b/src/equicordplugins/richPresence/index.tsx @@ -22,80 +22,81 @@ type SettingsKey = keyof SettingsStore; const logger = new Logger("RichPresence"); -const services: Record = { - [ServiceTab.AudioBookShelf]: abs, - [ServiceTab.Tosu]: tosu, - [ServiceTab.StatsFm]: statsfm, - [ServiceTab.Jellyfin]: jellyfin, - [ServiceTab.ListenBrainz]: listenbrainz, - [ServiceTab.GensokyoRadio]: gensokyoRadio, +const services: Record = { + [ServiceTab.AudioBookShelf]: abs, + [ServiceTab.Tosu]: tosu, + [ServiceTab.StatsFm]: statsfm, + [ServiceTab.Jellyfin]: jellyfin, + [ServiceTab.ListenBrainz]: listenbrainz, + [ServiceTab.GensokyoRadio]: gensokyoRadio, }; const enableKeys: Record = { - [ServiceTab.AudioBookShelf]: "abs_enabled", - [ServiceTab.Tosu]: "tosu_enabled", - [ServiceTab.StatsFm]: "sfm_enabled", - [ServiceTab.Jellyfin]: "jf_enabled", - [ServiceTab.ListenBrainz]: "lb_enabled", - [ServiceTab.GensokyoRadio]: "gr_enabled", + [ServiceTab.AudioBookShelf]: "abs_enabled", + [ServiceTab.Tosu]: "tosu_enabled", + [ServiceTab.StatsFm]: "sfm_enabled", + [ServiceTab.Jellyfin]: "jf_enabled", + [ServiceTab.ListenBrainz]: "lb_enabled", + [ServiceTab.GensokyoRadio]: "gr_enabled", }; const activeServices = new Set(); function syncServices() { - const globalEnabled = settings.store.enabled; + const globalEnabled = settings.store.enabled; - for (const [id, service] of Object.entries(services)) { - const shouldRun = - globalEnabled && !!settings.store[enableKeys[id]]; - const isRunning = activeServices.has(id); + for (const [id, service] of Object.entries(services)) { + const shouldRun = + globalEnabled && !!settings.store[enableKeys[id]]; + const isRunning = activeServices.has(id); - if (shouldRun && !isRunning) { - logger.info(`Starting ${id} service`); - service.start(); - activeServices.add(id); - } else if (!shouldRun && isRunning) { - logger.info(`Stopping ${id} service`); - service.stop(); - activeServices.delete(id); - } - } + if (shouldRun && !isRunning) { + logger.info(`Starting ${id} service`); + service.start(); + activeServices.add(id); + } else if (!shouldRun && isRunning) { + logger.info(`Stopping ${id} service`); + service.stop(); + activeServices.delete(id); + } + } } function stopAllServices() { - for (const id of activeServices) { - logger.info(`Stopping ${id} service`); - services[id].stop(); - } - activeServices.clear(); + for (const id of activeServices) { + logger.info(`Stopping ${id} service`); + services[id].stop(); + } + activeServices.clear(); } export default definePlugin({ - name: "RichPresence", - description: "Unified rich presence hub for AudioBookShelf, osu!, stats.fm, Jellyfin, ListenBrainz, and Gensokyo Radio.", - authors: [ - EquicordDevs.vmohammad, - Devs.AutumnVN, - EquicordDevs.Crxa, - Devs.SerStars, - EquicordDevs.ZcraftElite, - EquicordDevs.qouesm, - Devs.RyanCaoDev, - EquicordDevs.Prince527, - EquicordDevs.creations, - ], - reporterTestable: ReporterTestable.None, + name: "RichPresence", + description: "Unified rich presence hub for AudioBookShelf, osu!, stats.fm, Jellyfin, ListenBrainz, and Gensokyo Radio.", + tags: ["Activity"], + authors: [ + EquicordDevs.vmohammad, + Devs.AutumnVN, + EquicordDevs.Crxa, + Devs.SerStars, + EquicordDevs.ZcraftElite, + EquicordDevs.qouesm, + Devs.RyanCaoDev, + EquicordDevs.Prince527, + EquicordDevs.creations, + ], + reporterTestable: ReporterTestable.None, - settings, + settings, - start() { - migrateOldSettings(); - syncServices(); - setOnServiceChange(syncServices); - }, + start() { + migrateOldSettings(); + syncServices(); + setOnServiceChange(syncServices); + }, - stop() { - stopAllServices(); - setOnServiceChange(null); - }, + stop() { + stopAllServices(); + setOnServiceChange(null); + }, }); diff --git a/src/equicordplugins/rpcEditor/index.tsx b/src/equicordplugins/rpcEditor/index.tsx index e60d6627f..b40009418 100644 --- a/src/equicordplugins/rpcEditor/index.tsx +++ b/src/equicordplugins/rpcEditor/index.tsx @@ -73,6 +73,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "RPCEditor", description: "Edit the type and content of any Rich Presence", + tags: ["Customisation"], authors: [Devs.Nyako, Devs.nin0dev], patches: [ { diff --git a/src/equicordplugins/rpcStats/index.tsx b/src/equicordplugins/rpcStats/index.tsx index 76f07a44a..0d0bc5f5c 100644 --- a/src/equicordplugins/rpcStats/index.tsx +++ b/src/equicordplugins/rpcStats/index.tsx @@ -172,6 +172,7 @@ async function updateData() { export default definePlugin({ name: "RPCStats", description: "Displays stats about your activity as an rpc", + tags: ["Utility"], authors: [Devs.Samwich], async start() { updateData(); diff --git a/src/equicordplugins/saveFavoriteGIFs/index.tsx b/src/equicordplugins/saveFavoriteGIFs/index.tsx index e5af23613..165a00705 100644 --- a/src/equicordplugins/saveFavoriteGIFs/index.tsx +++ b/src/equicordplugins/saveFavoriteGIFs/index.tsx @@ -115,6 +115,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SaveFavoriteGIFs", description: "Export favorited GIF urls", + tags: ["Emotes", "Utility"], authors: [Devs.thororen], settings, commands: [ diff --git a/src/equicordplugins/scheduledMessages/index.tsx b/src/equicordplugins/scheduledMessages/index.tsx index 7fee1cbd2..6d78464f8 100644 --- a/src/equicordplugins/scheduledMessages/index.tsx +++ b/src/equicordplugins/scheduledMessages/index.tsx @@ -86,6 +86,7 @@ function handleReactionEvent(event: FluxReactionEvent): void { export default definePlugin({ name: "ScheduledMessages", description: "Schedule messages to be sent at a specific time or after a delay.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.mmeta, Devs.prism], settings, diff --git a/src/equicordplugins/screenRecorder.equibop/index.tsx b/src/equicordplugins/screenRecorder.equibop/index.tsx index a24ef052b..b9446995c 100644 --- a/src/equicordplugins/screenRecorder.equibop/index.tsx +++ b/src/equicordplugins/screenRecorder.equibop/index.tsx @@ -14,7 +14,8 @@ let recoder: MediaRecorder; export default definePlugin({ name: "ScreenRecorder", - description: "epic screen recorder lol", + description: "Adds an option to record your screen and upload the recording to the channel", + tags: ["Chat"], authors: [Devs.AutumnVN], contextMenus: { "channel-attach": startRecording @@ -54,7 +55,7 @@ function stopRecording(children, props) { } action={() => { recoder.addEventListener("dataavailable", e => { - const file = new File([e.data], "watch if cute.webm", { type: "video/webm" }); + const file = new File([e.data], "recording.webm", { type: "video/webm" }); UploadHandler.promptToUpload([file], props.channel, 0); }); recoder.stop(); diff --git a/src/equicordplugins/searchFix/index.tsx b/src/equicordplugins/searchFix/index.tsx index e45e4cd16..f331c021b 100644 --- a/src/equicordplugins/searchFix/index.tsx +++ b/src/equicordplugins/searchFix/index.tsx @@ -39,6 +39,7 @@ function settingsComponent() { export default definePlugin({ name: "SearchFix", description: 'Fixes the annoying "We dropped the magnifying glass!" error.', + tags: ["Utility"], settingsAboutComponent: () => settingsComponent(), authors: [EquicordDevs.Jaxx], patches: [ diff --git a/src/equicordplugins/sekaiStickers/index.tsx b/src/equicordplugins/sekaiStickers/index.tsx index af1d6c1af..98e1ff8c5 100644 --- a/src/equicordplugins/sekaiStickers/index.tsx +++ b/src/equicordplugins/sekaiStickers/index.tsx @@ -33,6 +33,7 @@ let IS_FONTS_LOADED = false; export default definePlugin({ name: "SekaiStickers", description: "Sekai Stickers built in discord originally from github.com/TheOriginalAyaka", + tags: ["Chat", "Emotes"], authors: [Devs.MaiKokain], settings, chatBarButton: { diff --git a/src/equicordplugins/selfForward/index.ts b/src/equicordplugins/selfForward/index.ts index 74c9902bc..09672018c 100644 --- a/src/equicordplugins/selfForward/index.ts +++ b/src/equicordplugins/selfForward/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "SelfForward", description: "Adds the current channel to the forward list popup", + tags: ["Utility"], authors: [EquicordDevs.VillainsRule], patches: [ { diff --git a/src/equicordplugins/serverSearch/index.tsx b/src/equicordplugins/serverSearch/index.tsx index 82989cb7b..101650afc 100644 --- a/src/equicordplugins/serverSearch/index.tsx +++ b/src/equicordplugins/serverSearch/index.tsx @@ -28,6 +28,7 @@ export default definePlugin({ name: "ServerSearch", authors: [EquicordDevs.camila314], description: "Navigate your servers better with a quick search button", + tags: ["Shortcuts", "Servers"], renderButton() { return diff --git a/src/equicordplugins/showBadgesInChat/index.tsx b/src/equicordplugins/showBadgesInChat/index.tsx index f7a86d292..d5487236d 100644 --- a/src/equicordplugins/showBadgesInChat/index.tsx +++ b/src/equicordplugins/showBadgesInChat/index.tsx @@ -142,6 +142,7 @@ export default definePlugin({ name: "ShowBadgesInChat", authors: [Devs.Inbestigator, EquicordDevs.KrystalSkull], description: "Shows the message author's badges beside their name in chat.", + tags: ["Appearance", "Chat"], settings, renderMessageDecoration(props) { return props.message?.author ? : null; diff --git a/src/equicordplugins/showMessageEmbeds/index.tsx b/src/equicordplugins/showMessageEmbeds/index.tsx index d224923d3..d503c2f77 100644 --- a/src/equicordplugins/showMessageEmbeds/index.tsx +++ b/src/equicordplugins/showMessageEmbeds/index.tsx @@ -193,6 +193,7 @@ function showFailureToast(message: string) { export default definePlugin({ name: "ShowMessageEmbeds", description: "Adds a context menu option to show embeds for links that don't have one", + tags: ["Appearance", "Chat"], authors: [EquicordDevs.Suffocate], patches: [ diff --git a/src/equicordplugins/showResourceChannels/index.ts b/src/equicordplugins/showResourceChannels/index.ts index d3ca76589..ecf2132f1 100644 --- a/src/equicordplugins/showResourceChannels/index.ts +++ b/src/equicordplugins/showResourceChannels/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ShowResourceChannels", description: "shows the channels hidden behind the server resources in the channel list", + tags: ["Servers"], authors: [EquicordDevs.VillainsRule], patches: [ { diff --git a/src/equicordplugins/showSongName/index.tsx b/src/equicordplugins/showSongName/index.tsx index 96cdd5ae7..29716e129 100644 --- a/src/equicordplugins/showSongName/index.tsx +++ b/src/equicordplugins/showSongName/index.tsx @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ShowSongName", description: "Shows song name instead of artist for Spotify activity", + tags: ["Activity"], authors: [Devs.prism], patches: [ diff --git a/src/equicordplugins/sidebarChat/index.tsx b/src/equicordplugins/sidebarChat/index.tsx index 7b88e2603..2958acea9 100644 --- a/src/equicordplugins/sidebarChat/index.tsx +++ b/src/equicordplugins/sidebarChat/index.tsx @@ -130,6 +130,7 @@ export default definePlugin({ name: "SidebarChat", authors: [Devs.Joona], description: "Open a another channel or a DM as a sidebar or as a popout", + tags: ["Appearance", "Chat", "Servers"], patches: [ { find: 'case"pendingFriends":', diff --git a/src/equicordplugins/signature/index.tsx b/src/equicordplugins/signature/index.tsx index 1a7d28605..9379d2e6e 100644 --- a/src/equicordplugins/signature/index.tsx +++ b/src/equicordplugins/signature/index.tsx @@ -100,6 +100,7 @@ const ChatBarContextCheckbox: NavContextMenuPatchCallback = children => { export default definePlugin({ name: "Signature", description: "Automated fingerprint/end text", + tags: ["Appearance", "Chat"], authors: [Devs.Ven, Devs.Rini, Devs.ImBanana, EquicordDevs.KrystalSkull], onBeforeMessageSend(channelId, msg) { if (!settings.store.isEnabled) { diff --git a/src/equicordplugins/snowfall/index.tsx b/src/equicordplugins/snowfall/index.tsx index 7f103e9f4..abba96ae3 100644 --- a/src/equicordplugins/snowfall/index.tsx +++ b/src/equicordplugins/snowfall/index.tsx @@ -450,7 +450,8 @@ let container: HTMLDivElement | null = null; export default definePlugin({ name: "Snowfall", - description: "Let it snow on Discord! Ported from the BetterDiscord plugin by square.", + description: "Let it snow on Discord", + tags: ["Appearance"], authors: [EquicordDevs.ZcraftElite, EquicordDevs.square], settingsAboutComponent: () => ( diff --git a/src/equicordplugins/soggy/index.tsx b/src/equicordplugins/soggy/index.tsx index a622197d9..71d56a405 100644 --- a/src/equicordplugins/soggy/index.tsx +++ b/src/equicordplugins/soggy/index.tsx @@ -137,6 +137,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Soggy", description: "Adds a soggy button to the toolbox", + tags: ["Fun"], authors: [EquicordDevs.sliwka], settings, dependencies: ["AudioPlayerAPI"], diff --git a/src/equicordplugins/songLink.desktop/index.tsx b/src/equicordplugins/songLink.desktop/index.tsx index 2961f1bd7..9131869b3 100644 --- a/src/equicordplugins/songLink.desktop/index.tsx +++ b/src/equicordplugins/songLink.desktop/index.tsx @@ -51,6 +51,7 @@ export const Native = VencordNative.pluginHelpers.SongLink as PluginNative { export default definePlugin({ name: "StatusPresets", description: "Allows you to remember your statuses and set them later", + tags: ["Activity", "Utility"], authors: [EquicordDevs.iamme], settings: settings, dependencies: ["UserSettingsAPI"], diff --git a/src/equicordplugins/statusWhileActive.desktop/index.ts b/src/equicordplugins/statusWhileActive.desktop/index.ts index 9d950e4b7..efb79ef53 100644 --- a/src/equicordplugins/statusWhileActive.desktop/index.ts +++ b/src/equicordplugins/statusWhileActive.desktop/index.ts @@ -56,6 +56,7 @@ function setStatus(preq, status) { export default definePlugin({ name: "StatusWhileActive", description: "Automatically updates your online status when in a voice channel.", + tags: ["Activity", "Customisation", "Voice"], authors: [EquicordDevs.smuki], settings, flux: { diff --git a/src/equicordplugins/steamStatusSync/index.tsx b/src/equicordplugins/steamStatusSync/index.tsx index 7a20e9035..0ca190e11 100644 --- a/src/equicordplugins/steamStatusSync/index.tsx +++ b/src/equicordplugins/steamStatusSync/index.tsx @@ -85,6 +85,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "SteamStatusSync", description: "Sync your status to Steam! (Online, Away, Invisible, or Offline.)", + tags: ["Activity", "Appearance", "Customisation"], authors: [EquicordDevs.niko], settings, diff --git a/src/equicordplugins/stickerBlocker/index.tsx b/src/equicordplugins/stickerBlocker/index.tsx index 1993ebabb..7b2f59101 100644 --- a/src/equicordplugins/stickerBlocker/index.tsx +++ b/src/equicordplugins/stickerBlocker/index.tsx @@ -130,6 +130,7 @@ function isStickerBlocked(name) { export default definePlugin({ name: "StickerBlocker", description: "Allows you to block stickers from being displayed.", + tags: ["Chat", "Emotes", "Utility"], authors: [Devs.Samwich], patches: [ { diff --git a/src/equicordplugins/streamingCodecDisabler/index.ts b/src/equicordplugins/streamingCodecDisabler/index.ts index 24e3ece83..61d68d710 100644 --- a/src/equicordplugins/streamingCodecDisabler/index.ts +++ b/src/equicordplugins/streamingCodecDisabler/index.ts @@ -56,6 +56,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "StreamingCodecDisabler", description: "Disable codecs for streaming of your choice", + tags: ["Utility", "Voice"], authors: [EquicordDevs.davidkra230], settings, diff --git a/src/equicordplugins/talkInReverse/index.tsx b/src/equicordplugins/talkInReverse/index.tsx index c469c9b31..5424f65c2 100644 --- a/src/equicordplugins/talkInReverse/index.tsx +++ b/src/equicordplugins/talkInReverse/index.tsx @@ -66,6 +66,7 @@ export default definePlugin({ name: "TalkInReverse", authors: [EquicordDevs.Tolgchu], description: "Reverses the message content before sending it.", + tags: ["Chat", "Fun"], dependencies: ["MessageEventsAPI"], chatBarButton: { icon: ReverseMessageIcon, diff --git a/src/equicordplugins/themeLibrary/index.tsx b/src/equicordplugins/themeLibrary/index.tsx index 084ce9650..6a2fe0955 100644 --- a/src/equicordplugins/themeLibrary/index.tsx +++ b/src/equicordplugins/themeLibrary/index.tsx @@ -16,6 +16,7 @@ import { settings } from "./utils/settings"; export default definePlugin({ name: "ThemeLibrary", description: "A library of themes for Vencord.", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.Fafa], settings, toolboxActions: { diff --git a/src/equicordplugins/tidalEmbeds/index.tsx b/src/equicordplugins/tidalEmbeds/index.tsx index 1e9269859..5aa376fe1 100644 --- a/src/equicordplugins/tidalEmbeds/index.tsx +++ b/src/equicordplugins/tidalEmbeds/index.tsx @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "TidalEmbeds", description: "Embeds TIDAL songs to make them playable in Discord.", + tags: ["Appearance", "Chat", "Media"], authors: [EquicordDevs.vmohammad], dependencies: ["MessageUpdaterAPI"], patches: [ diff --git a/src/equicordplugins/tiktokTTS/index.ts b/src/equicordplugins/tiktokTTS/index.ts index da5d8c24c..0e2ddf9f4 100644 --- a/src/equicordplugins/tiktokTTS/index.ts +++ b/src/equicordplugins/tiktokTTS/index.ts @@ -211,6 +211,7 @@ async function processQueue() { export default definePlugin({ name: "TiktokTTS", description: "Adds a context menu option to read out chat messages with the good ol' Tiktok TTS voice :sob:", + tags: ["Accessibility", "Chat", "Voice"], authors: [EquicordDevs.VillainsRule, EquicordDevs.examplegit], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/timezones/index.tsx b/src/equicordplugins/timezones/index.tsx index b40c3a515..9901e3b8b 100644 --- a/src/equicordplugins/timezones/index.tsx +++ b/src/equicordplugins/timezones/index.tsx @@ -257,6 +257,7 @@ export default definePlugin({ name: "Timezones", authors: [Devs.Aria, EquicordDevs.creations], description: "Shows the local time of users in profiles and message headers", + tags: ["Appearance", "Chat", "Utility"], contextMenus: { "user-context": userContextMenuPatch }, diff --git a/src/equicordplugins/title/index.ts b/src/equicordplugins/title/index.ts index 9e67a72a0..a9c9138ed 100644 --- a/src/equicordplugins/title/index.ts +++ b/src/equicordplugins/title/index.ts @@ -29,6 +29,7 @@ function setTitle(v: string) { export default definePlugin({ name: "Title", description: "Replaces the window title prefix", + tags: ["Customisation"], authors: [Devs.Kyuuhachi], settings, diff --git a/src/equicordplugins/toastNotifications/index.tsx b/src/equicordplugins/toastNotifications/index.tsx index cd1be8023..dfa961176 100644 --- a/src/equicordplugins/toastNotifications/index.tsx +++ b/src/equicordplugins/toastNotifications/index.tsx @@ -210,6 +210,7 @@ const addMention = (id: string, type: string, guildId?: string): ReactNode => { export default definePlugin({ name: "ToastNotifications", description: "Show a toast notification whenever you receive a direct message.", + tags: ["Appearance", "Customisation", "Notifications"], authors: [EquicordDevs.Skully, EquicordDevs.Ethan, EquicordDevs.Buzzy], settings, flux: { diff --git a/src/equicordplugins/toggleVideoBind/index.ts b/src/equicordplugins/toggleVideoBind/index.ts index 3a56c4e8f..323a1e771 100644 --- a/src/equicordplugins/toggleVideoBind/index.ts +++ b/src/equicordplugins/toggleVideoBind/index.ts @@ -59,6 +59,7 @@ function handleKeydown({ code, ctrlKey, shiftKey, altKey }: KeyboardEvent) { export default definePlugin({ name: "ToggleVideoBind", description: "Adds a customizable bind to toggle webcam.", + tags: ["Utility", "Voice"], authors: [EquicordDevs.mochienya], settings, start() { diff --git a/src/equicordplugins/toneIndicators/index.tsx b/src/equicordplugins/toneIndicators/index.tsx index 6dc0ba1a0..cf70719f5 100644 --- a/src/equicordplugins/toneIndicators/index.tsx +++ b/src/equicordplugins/toneIndicators/index.tsx @@ -163,6 +163,7 @@ function patchChildrenTree(children: any): any { export default definePlugin({ name: "ToneIndicators", description: "Show tooltips for tone indicators like /srs, /gen, etc. in sent messages.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.justjxke], settings, diff --git a/src/equicordplugins/translatePlus/index.tsx b/src/equicordplugins/translatePlus/index.tsx index 78e48b120..cfe3e57c4 100644 --- a/src/equicordplugins/translatePlus/index.tsx +++ b/src/equicordplugins/translatePlus/index.tsx @@ -46,6 +46,7 @@ const messageCtxPatch: NavContextMenuPatchCallback = (children, { message }) => export default definePlugin({ name: "Translate+", description: "Vencord's translate plugin but with support for artistic languages!", + tags: ["Chat", "Utility"], authors: [Devs.Ven, EquicordDevs.Prince527], settings, contextMenus: { diff --git a/src/equicordplugins/triviaAI/index.tsx b/src/equicordplugins/triviaAI/index.tsx index f4c860347..29a2fa89f 100644 --- a/src/equicordplugins/triviaAI/index.tsx +++ b/src/equicordplugins/triviaAI/index.tsx @@ -40,6 +40,7 @@ const messageCtxPatch: NavContextMenuPatchCallback = (children, { message }: { m export default definePlugin({ name: "TriviaAI", description: "A plugin that helps you answer trivia questions using AI.", + tags: ["Appearance", "Customisation", "Fun"], authors: [EquicordDevs.yash], settings, contextMenus: { diff --git a/src/equicordplugins/unitConverter/index.tsx b/src/equicordplugins/unitConverter/index.tsx index 36d83568e..f8a3d11cb 100644 --- a/src/equicordplugins/unitConverter/index.tsx +++ b/src/equicordplugins/unitConverter/index.tsx @@ -48,6 +48,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "UnitConverter", description: "Converts metric units to Imperal units and vice versa", + tags: ["Utility"], authors: [Devs.sadan], messagePopoverButton: { icon: ConvertIcon, diff --git a/src/equicordplugins/universalMention/index.tsx b/src/equicordplugins/universalMention/index.tsx index 2d8a977bb..f6f8b6998 100644 --- a/src/equicordplugins/universalMention/index.tsx +++ b/src/equicordplugins/universalMention/index.tsx @@ -39,6 +39,7 @@ export default definePlugin({ name: "UniversalMention", authors: [EquicordDevs.justjxke], description: "Mention any user, regardless of channel access.", + tags: ["Chat", "Servers", "Utility"], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/unlimitedAccounts/index.ts b/src/equicordplugins/unlimitedAccounts/index.ts index cbf77811d..eeb41a955 100644 --- a/src/equicordplugins/unlimitedAccounts/index.ts +++ b/src/equicordplugins/unlimitedAccounts/index.ts @@ -32,6 +32,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UnlimitedAccounts", description: "Increases the amount of accounts you can add.", + tags: ["Utility"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/unreadBadgeCount/index.tsx b/src/equicordplugins/unreadBadgeCount/index.tsx index 0f08d06cd..a9135df54 100644 --- a/src/equicordplugins/unreadBadgeCount/index.tsx +++ b/src/equicordplugins/unreadBadgeCount/index.tsx @@ -33,6 +33,7 @@ export default definePlugin({ name: "UnreadCountBadge", authors: [Devs.Joona], description: "Shows unread message count badges on channels in the channel list", + tags: ["Appearance", "Customisation", "Servers"], settings, patches: [ diff --git a/src/equicordplugins/urlHighlighter/index.tsx b/src/equicordplugins/urlHighlighter/index.tsx index 6fbe9ba77..6a52b9495 100644 --- a/src/equicordplugins/urlHighlighter/index.tsx +++ b/src/equicordplugins/urlHighlighter/index.tsx @@ -121,6 +121,7 @@ function getMatchingPattern(url: string): PatternEntry | null { export default definePlugin({ name: "UrlHighlighter", description: "Highlights URLs in messages that match your patterns.", + tags: ["Appearance", "Customisation"], authors: [Devs.prism], settings, diff --git a/src/equicordplugins/userpfp/index.tsx b/src/equicordplugins/userpfp/index.tsx index 777fb40c5..d884dd59d 100644 --- a/src/equicordplugins/userpfp/index.tsx +++ b/src/equicordplugins/userpfp/index.tsx @@ -65,6 +65,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UserPFP", description: "Allows you to use an animated avatar without Nitro", + tags: ["Appearance", "Customisation", "Servers"], authors: [EquicordDevs.nexpid, Devs.thororen, EquicordDevs.soapphia], settings, data, diff --git a/src/equicordplugins/vcNarratorCustom/index.tsx b/src/equicordplugins/vcNarratorCustom/index.tsx index c9d80123c..fac57eced 100644 --- a/src/equicordplugins/vcNarratorCustom/index.tsx +++ b/src/equicordplugins/vcNarratorCustom/index.tsx @@ -895,6 +895,7 @@ const UserContextMenuPatch: NavContextMenuPatchCallback = (children, { user }: U export default definePlugin({ name: "VcNarratorCustom", description: "Announces when users join, leave, or move voice channels via narrator using TikTok TTS. Revamped and back from the dead.", + tags: ["Accessibility", "Voice"], authors: [Devs.Ven, Devs.Nyako, EquicordDevs.Loukios, EquicordDevs.examplegit], settings, contextMenus: { diff --git a/src/equicordplugins/vcPanelSettings/index.tsx b/src/equicordplugins/vcPanelSettings/index.tsx index bfc60e08f..24893ae04 100644 --- a/src/equicordplugins/vcPanelSettings/index.tsx +++ b/src/equicordplugins/vcPanelSettings/index.tsx @@ -238,6 +238,7 @@ function VoiceSettings() { export default definePlugin({ name: "VCPanelSettings", description: "Control voice settings right from the voice panel", + tags: ["Utility", "Voice"], authors: [Devs.nin0dev], settings, renderVoiceSettings() { return ; }, diff --git a/src/equicordplugins/viewRawVariant/index.tsx b/src/equicordplugins/viewRawVariant/index.tsx index 41597a401..97730526b 100644 --- a/src/equicordplugins/viewRawVariant/index.tsx +++ b/src/equicordplugins/viewRawVariant/index.tsx @@ -129,6 +129,7 @@ function makeContextCallback( export default definePlugin({ name: "ViewRawVariant", description: "Copy/View raw content of any message, channel, or guild, but show in the right click menu.", + tags: ["Appearance", "Customisation", "Chat", "Organisation", "Servers"], authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna, Devs.Kyuuhachi], contextMenus: { "guild-context": makeContextCallback("guild", val => diff --git a/src/equicordplugins/voiceButtons/index.tsx b/src/equicordplugins/voiceButtons/index.tsx index af960f502..4654572ff 100644 --- a/src/equicordplugins/voiceButtons/index.tsx +++ b/src/equicordplugins/voiceButtons/index.tsx @@ -16,6 +16,7 @@ import { UserChatButton, UserDeafenButton, UserMuteButton } from "./utils"; export default definePlugin({ name: "VoiceButtons", description: "Quickly DM, mute, or deafen any user right from the voice-call panel.", + tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.nicola02nb, EquicordDevs.omaw], settings, patches: [ diff --git a/src/equicordplugins/voiceChannelLog/index.tsx b/src/equicordplugins/voiceChannelLog/index.tsx index a0e4d1d9c..4ef728a57 100644 --- a/src/equicordplugins/voiceChannelLog/index.tsx +++ b/src/equicordplugins/voiceChannelLog/index.tsx @@ -54,6 +54,7 @@ const patchChannelContextMenu: NavContextMenuPatchCallback = (children, { channe export default definePlugin({ name: "VoiceChannelLog", description: "Logs voice channel activity including joins, leaves, soundboard, mute, camera, screenshare, and more.", + tags: ["Servers", "Utility", "Voice"], authors: [Devs.Sqaaakoi, Devs.thororen, EquicordDevs.nyx, Devs.Moxxie, EquicordDevs.Fres, Devs.amy], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/voiceChatUtils/index.tsx b/src/equicordplugins/voiceChatUtils/index.tsx index 421000cf7..a9ebea15f 100644 --- a/src/equicordplugins/voiceChatUtils/index.tsx +++ b/src/equicordplugins/voiceChatUtils/index.tsx @@ -174,6 +174,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "VoiceChatUtilities", description: "This plugin allows you to perform multiple actions on an entire channel (move, mute, disconnect, etc.) (originally by dutake)", + tags: ["Chat", "Servers", "Voice"], authors: [Devs.D3SOX, EquicordDevs.nickwoah], settings, diff --git a/src/equicordplugins/voiceJoinMessages/index.ts b/src/equicordplugins/voiceJoinMessages/index.ts index 12824ab91..3fdc3499b 100644 --- a/src/equicordplugins/voiceJoinMessages/index.ts +++ b/src/equicordplugins/voiceJoinMessages/index.ts @@ -111,6 +111,7 @@ let clientOldChannelId: string | undefined; export default definePlugin({ name: "VoiceJoinMessages", description: "Recieve client-side ephemeral messages when your friends join voice channels", + tags: ["Servers", "Utility", "Voice"], authors: [Devs.Sqaaakoi, Devs.thororen], settings, flux: { diff --git a/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx b/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx index f60724321..db2d8def3 100644 --- a/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx +++ b/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx @@ -314,6 +314,7 @@ export default definePlugin({ name: "VoiceMessageTranscriber", authors: [Devs.TheSun], description: "On-device transcriptions for voice messages powered by Whisper v3", + tags: ["Chat", "Media", "Utility", "Voice"], patches: [ { find: ".VOICE_MESSAGE)),", diff --git a/src/equicordplugins/voiceRejoin/index.tsx b/src/equicordplugins/voiceRejoin/index.tsx index 12042df43..291bd7aee 100644 --- a/src/equicordplugins/voiceRejoin/index.tsx +++ b/src/equicordplugins/voiceRejoin/index.tsx @@ -51,6 +51,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "VoiceRejoin", description: "Rejoins DM/Server call automatically when restarting Discord.", + tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.omaw, EquicordDevs.keircn], settings, diff --git a/src/equicordplugins/waitForSlot/index.tsx b/src/equicordplugins/waitForSlot/index.tsx index fbcfd636e..4df55ee89 100644 --- a/src/equicordplugins/waitForSlot/index.tsx +++ b/src/equicordplugins/waitForSlot/index.tsx @@ -64,6 +64,7 @@ function promptVoiceChannel(channel: Channel | null | undefined): boolean { export default definePlugin({ name: "WaitForSlot", description: "Automatically join a full voice channel when a slot opens.", + tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.omaw, Devs.prism], settings, patches: [ diff --git a/src/equicordplugins/wallpaperFree/index.tsx b/src/equicordplugins/wallpaperFree/index.tsx index cfc8fe99e..6cd0364c4 100644 --- a/src/equicordplugins/wallpaperFree/index.tsx +++ b/src/equicordplugins/wallpaperFree/index.tsx @@ -33,6 +33,7 @@ export default definePlugin({ name: "WallpaperFree", authors: [Devs.Joona], description: "Recreation of the old DM wallpaper experiment; Set a background image for any channel, user or server.", + tags: ["Appearance", "Chat", "Customisation"], patches: [ { find: ".handleSendMessage,onResize", diff --git a/src/equicordplugins/webpackTarball/index.tsx b/src/equicordplugins/webpackTarball/index.tsx index 536e1212c..c96e9011c 100644 --- a/src/equicordplugins/webpackTarball/index.tsx +++ b/src/equicordplugins/webpackTarball/index.tsx @@ -31,6 +31,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "WebpackTarball", description: "Converts Discord's webpack sources into a tarball.", + tags: ["Developers", "Utility"], authors: [Devs.Kyuuhachi], settings, diff --git a/src/equicordplugins/whitelistedEmojis/index.tsx b/src/equicordplugins/whitelistedEmojis/index.tsx index 70d21eb37..7a72e531f 100644 --- a/src/equicordplugins/whitelistedEmojis/index.tsx +++ b/src/equicordplugins/whitelistedEmojis/index.tsx @@ -597,6 +597,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhitelistedEmojis", description: "Adds the ability to disable all message emojis except for a whitelisted set.", + tags: ["Chat", "Emotes"], authors: [EquicordDevs.creations], patches: [ { diff --git a/src/equicordplugins/whosWatching/index.tsx b/src/equicordplugins/whosWatching/index.tsx index 2412d1827..e7dfe0020 100644 --- a/src/equicordplugins/whosWatching/index.tsx +++ b/src/equicordplugins/whosWatching/index.tsx @@ -82,6 +82,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhosWatching", description: "Hover over the screenshare icon to view what users are watching your stream", + tags: ["Activity"], authors: [EquicordDevs.Fres, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/wigglyText/index.tsx b/src/equicordplugins/wigglyText/index.tsx index 1f683e9e6..b3118029f 100644 --- a/src/equicordplugins/wigglyText/index.tsx +++ b/src/equicordplugins/wigglyText/index.tsx @@ -112,6 +112,7 @@ const updateStyles = () => { export default definePlugin({ name: "WigglyText", description: "Adds a new markdown formatting that makes text wiggly.", + tags: ["Appearance", "Customisation", "Fun"], authors: [EquicordDevs.nexpid], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/writeUpperCase/index.ts b/src/equicordplugins/writeUpperCase/index.ts index 263b1a231..81a9a329a 100644 --- a/src/equicordplugins/writeUpperCase/index.ts +++ b/src/equicordplugins/writeUpperCase/index.ts @@ -37,6 +37,7 @@ const presendObject: MessageSendListener = (_, msg) => { export default definePlugin({ name: "WriteUpperCase", description: "Changes the first Letter of each Sentence in Message Inputs to Uppercase", + tags: ["Appearance", "Customisation", "Chat"], authors: [Devs.Samwich, EquicordDevs.KrystalSkull], settings, From 913d5dfc98d9bd2653a29071a5ecda72363376ba Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 11:37:32 -0400 Subject: [PATCH 034/247] specify deps --- src/equicordplugins/baseDecoder/index.tsx | 1 + src/equicordplugins/betterCommands/index.ts | 1 + src/equicordplugins/collapsibleUi/index.tsx | 1 + src/equicordplugins/customSounds/index.tsx | 1 + src/equicordplugins/equicordHelper/index.tsx | 1 + src/equicordplugins/findReply/index.tsx | 1 + src/equicordplugins/githubRepos/index.tsx | 1 + src/equicordplugins/googleThat/index.tsx | 1 + src/equicordplugins/hideMessages/index.tsx | 1 + src/equicordplugins/holyNotes/index.tsx | 1 + src/equicordplugins/husk/index.tsx | 1 + src/equicordplugins/inRole/index.tsx | 2 +- src/equicordplugins/ingtoninator/index.tsx | 1 + src/equicordplugins/invisibleChat.desktop/index.tsx | 2 +- src/equicordplugins/messageBurst/index.ts | 1 + src/equicordplugins/messageFetchTimer/index.tsx | 1 + src/equicordplugins/messageLoggerEnhanced/index.tsx | 2 +- src/equicordplugins/messagePeek/index.tsx | 1 + src/equicordplugins/moreCommands/index.ts | 1 + src/equicordplugins/moreUserTags/index.tsx | 1 + src/equicordplugins/polishWording/index.ts | 1 + src/equicordplugins/randomVoice/index.tsx | 1 + src/equicordplugins/repeatMessages/index.tsx | 1 + src/equicordplugins/saveFavoriteGIFs/index.tsx | 1 + src/equicordplugins/scheduledMessages/index.tsx | 1 + src/equicordplugins/sekaiStickers/index.tsx | 1 + src/equicordplugins/showBadgesInChat/index.tsx | 1 + src/equicordplugins/signature/index.tsx | 1 + src/equicordplugins/soggy/index.tsx | 2 +- src/equicordplugins/songLink.desktop/index.tsx | 1 + src/equicordplugins/songSpotlight.desktop/index.tsx | 1 + src/equicordplugins/splitLargeMessages/index.ts | 1 + src/equicordplugins/spotifyActivityToggle/index.tsx | 1 + src/equicordplugins/talkInReverse/index.tsx | 2 +- src/equicordplugins/tidalEmbeds/index.tsx | 2 +- src/equicordplugins/translatePlus/index.tsx | 1 + src/equicordplugins/triviaAI/index.tsx | 1 + src/equicordplugins/unitConverter/index.tsx | 1 + src/equicordplugins/voiceChannelLog/index.tsx | 2 +- src/plugins/_core/supportHelper.tsx | 2 +- src/plugins/anonymiseFileNames/index.tsx | 1 + src/plugins/clearURLs/index.ts | 1 + src/plugins/customCommands/index.ts | 1 + src/plugins/favEmojiFirst/index.tsx | 1 + src/plugins/friendInvites/index.ts | 1 + src/plugins/gameActivityToggle/index.tsx | 2 +- src/plugins/hideAttachments/index.tsx | 2 +- src/plugins/petpet/index.ts | 1 + src/plugins/platformIndicators/index.tsx | 1 + src/plugins/previewMessage/index.tsx | 1 + src/plugins/quickMention/index.tsx | 1 + src/plugins/reviewDB/index.tsx | 1 + src/plugins/sendTimestamps/index.tsx | 1 + src/plugins/silentMessageToggle/index.tsx | 1 + src/plugins/silentTyping/index.tsx | 1 + src/plugins/spotifyShareCommands/index.ts | 1 + src/plugins/textReplace/index.tsx | 1 + src/plugins/translate/index.tsx | 1 + src/plugins/unindent/index.ts | 1 + src/plugins/userVoiceShow/index.tsx | 1 + src/plugins/viewRaw/index.tsx | 1 + 61 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/equicordplugins/baseDecoder/index.tsx b/src/equicordplugins/baseDecoder/index.tsx index 46253d954..9ecb51a9e 100644 --- a/src/equicordplugins/baseDecoder/index.tsx +++ b/src/equicordplugins/baseDecoder/index.tsx @@ -107,6 +107,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "DecodeBase64", description: "Decode base64 content of any message and copy the decoded content.", + dependencies: ["MessagePopoverAPI"], tags: ["Appearance", "Customisation", "Chat"], authors: [EquicordDevs.ThePirateStoner], settings, diff --git a/src/equicordplugins/betterCommands/index.ts b/src/equicordplugins/betterCommands/index.ts index e81f961e3..b405fdd52 100644 --- a/src/equicordplugins/betterCommands/index.ts +++ b/src/equicordplugins/betterCommands/index.ts @@ -33,6 +33,7 @@ function fetchIndex(target: object) { export default definePlugin({ name: "BetterCommands", description: "Enhances the command system with miscellaneous improvements.", + dependencies: ["CommandsAPI"], tags: ["Appearance", "Commands", "Shortcuts"], authors: [Devs.thororen], settings, diff --git a/src/equicordplugins/collapsibleUi/index.tsx b/src/equicordplugins/collapsibleUi/index.tsx index 7095cde41..d6c7d709c 100644 --- a/src/equicordplugins/collapsibleUi/index.tsx +++ b/src/equicordplugins/collapsibleUi/index.tsx @@ -109,6 +109,7 @@ export default definePlugin({ name: "CollapsibleUI", description: "Native collapsible channel, member, chat button, and user area surfaces.", tags: ["Appearance", "Customisation", "Chat", "Servers"], + dependencies: ["HeaderBarAPI"], authors: [EquicordDevs.benjii], searchTerms: ["ui", "sidebar", "layout"], managedStyle, diff --git a/src/equicordplugins/customSounds/index.tsx b/src/equicordplugins/customSounds/index.tsx index 9dbb11e90..5a99fe1c5 100644 --- a/src/equicordplugins/customSounds/index.tsx +++ b/src/equicordplugins/customSounds/index.tsx @@ -393,6 +393,7 @@ export function findOverride(id: string): SoundOverride | null { export default definePlugin({ name: "CustomSounds", description: "Customize Discord's sounds.", + dependencies: ["AudioPlayerAPI"], tags: ["Customisation", "Notifications", "Voice"], authors: [Devs.ScattrdBlade, Devs.TheKodeToad], settings, diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx index 8bf3f9fc3..a73639e7f 100644 --- a/src/equicordplugins/equicordHelper/index.tsx +++ b/src/equicordplugins/equicordHelper/index.tsx @@ -134,6 +134,7 @@ export default definePlugin({ name: "EquicordHelper", description: "Used to provide support, fix discord caused crashes, and other misc features.", tags: ["Appearance", "Commands", "Utility"], + dependencies: ["CommandsAPI", "HeaderBarAPI", "MessageAccessoriesAPI"], authors: [ Devs.thororen, EquicordDevs.nyx, diff --git a/src/equicordplugins/findReply/index.tsx b/src/equicordplugins/findReply/index.tsx index 7c86c64e2..33c28ba8f 100644 --- a/src/equicordplugins/findReply/index.tsx +++ b/src/equicordplugins/findReply/index.tsx @@ -89,6 +89,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FindReply", description: "Jumps to the earliest reply to a message in a channel (lets you follow past conversations more easily).", + dependencies: ["MessagePopoverAPI"], tags: ["Chat", "Shortcuts"], authors: [Devs.newwares], settings, diff --git a/src/equicordplugins/githubRepos/index.tsx b/src/equicordplugins/githubRepos/index.tsx index 0bfdd025b..cb2b3d58b 100644 --- a/src/equicordplugins/githubRepos/index.tsx +++ b/src/equicordplugins/githubRepos/index.tsx @@ -38,6 +38,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "GitHubRepos", description: "Displays a user's public GitHub repositories in their profile", + dependencies: ["ProfileCollectionsAPI"], tags: ["Appearance"], authors: [EquicordDevs.talhakf, EquicordDevs.Panniku, EquicordDevs.benjii], settings, diff --git a/src/equicordplugins/googleThat/index.tsx b/src/equicordplugins/googleThat/index.tsx index ef6005761..3f924d419 100644 --- a/src/equicordplugins/googleThat/index.tsx +++ b/src/equicordplugins/googleThat/index.tsx @@ -75,6 +75,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "GoogleThat", description: "Adds a command to send a internet search link", + dependencies: ["CommandsAPI"], tags: ["Commands", "Utility"], authors: [Devs.Samwich, EquicordDevs.KrystalSkull], searchTerms: ["search", "google", "query", "duckduckgo", "command"], diff --git a/src/equicordplugins/hideMessages/index.tsx b/src/equicordplugins/hideMessages/index.tsx index 4741a195f..dd7bf8538 100644 --- a/src/equicordplugins/hideMessages/index.tsx +++ b/src/equicordplugins/hideMessages/index.tsx @@ -49,6 +49,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "HideMessages", description: "A plugin to temporarily hide messages until you restart.", + dependencies: ["MessagePopoverAPI"], tags: ["Chat", "Utility"], authors: [EquicordDevs.yash], contextMenus: { diff --git a/src/equicordplugins/holyNotes/index.tsx b/src/equicordplugins/holyNotes/index.tsx index cab8fde2c..e4a57e819 100644 --- a/src/equicordplugins/holyNotes/index.tsx +++ b/src/equicordplugins/holyNotes/index.tsx @@ -72,6 +72,7 @@ function ToolBarHeader() { export default definePlugin({ name: "HolyNotes", description: "Save messages as notes to revisit later", + dependencies: ["MessagePopoverAPI", "HeaderBarAPI"], tags: ["Chat", "Organisation"], authors: [EquicordDevs.Wolfie], diff --git a/src/equicordplugins/husk/index.tsx b/src/equicordplugins/husk/index.tsx index 5f231db91..2596bb8a8 100644 --- a/src/equicordplugins/husk/index.tsx +++ b/src/equicordplugins/husk/index.tsx @@ -99,6 +99,7 @@ function getEmojiIdThatShouldBeUsed(guildId: string) { export default definePlugin({ name: "Husk", description: "Adds Husk button (check settings to change used emoji)", + dependencies: ["MessagePopoverAPI"], tags: ["Emotes", "Fun"], authors: [Devs.nin0dev], settings, diff --git a/src/equicordplugins/inRole/index.tsx b/src/equicordplugins/inRole/index.tsx index bba8ea205..847688f73 100644 --- a/src/equicordplugins/inRole/index.tsx +++ b/src/equicordplugins/inRole/index.tsx @@ -36,7 +36,7 @@ export default definePlugin({ description: "Know who is in a role with the role context menu or /inrole command (read plugin info!)", tags: ["Commands", "Roles"], authors: [Devs.nin0dev], - dependencies: ["UserSettingsAPI"], + dependencies: ["UserSettingsAPI", "CommandsAPI"], start() { // DeveloperMode needs to be enabled for the context menu to be shown DeveloperMode.updateSetting(true); diff --git a/src/equicordplugins/ingtoninator/index.tsx b/src/equicordplugins/ingtoninator/index.tsx index ad9ba2523..00a4909b0 100644 --- a/src/equicordplugins/ingtoninator/index.tsx +++ b/src/equicordplugins/ingtoninator/index.tsx @@ -146,6 +146,7 @@ function disabledIcon() { export default definePlugin({ name: "Ingtoninator", description: "Suffixes 'ington' to a random word in your message", + dependencies: ["ChatInputButtonAPI"], tags: ["Fun"], authors: [EquicordDevs.zyqunix, EquicordDevs.BioTomateDE], settings, diff --git a/src/equicordplugins/invisibleChat.desktop/index.tsx b/src/equicordplugins/invisibleChat.desktop/index.tsx index f45bb427c..c45149141 100644 --- a/src/equicordplugins/invisibleChat.desktop/index.tsx +++ b/src/equicordplugins/invisibleChat.desktop/index.tsx @@ -151,7 +151,7 @@ export default definePlugin({ description: "Encrypt your Messages in a non-suspicious way!", tags: ["Chat"], authors: [Devs.SammCheese], - dependencies: ["MessageUpdaterAPI"], + dependencies: ["MessageUpdaterAPI", "ChatInputButtonAPI", "MessagePopoverAPI"], reporterTestable: ReporterTestable.Patches, settings, diff --git a/src/equicordplugins/messageBurst/index.ts b/src/equicordplugins/messageBurst/index.ts index 9dd35b50a..18f8d6060 100644 --- a/src/equicordplugins/messageBurst/index.ts +++ b/src/equicordplugins/messageBurst/index.ts @@ -66,6 +66,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "MessageBurst", description: "Merges messages sent within a time period with your previous sent message if no one else sends a message before you.", + dependencies: ["MessagePopoverAPI"], tags: ["Chat"], authors: [EquicordDevs.port22exposed], settings, diff --git a/src/equicordplugins/messageFetchTimer/index.tsx b/src/equicordplugins/messageFetchTimer/index.tsx index a60462f1e..a0622668d 100644 --- a/src/equicordplugins/messageFetchTimer/index.tsx +++ b/src/equicordplugins/messageFetchTimer/index.tsx @@ -147,6 +147,7 @@ function handleMessageLoad(data: any) { export default definePlugin({ name: "MessageFetchTimer", description: "Shows how long it took to fetch messages for the current channel", + dependencies: ["ChatInputButtonAPI"], tags: ["Chat", "Utility"], authors: [EquicordDevs.GroupXyz], settings, diff --git a/src/equicordplugins/messageLoggerEnhanced/index.tsx b/src/equicordplugins/messageLoggerEnhanced/index.tsx index aad1f85f5..2abe5c7df 100644 --- a/src/equicordplugins/messageLoggerEnhanced/index.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/index.tsx @@ -259,7 +259,7 @@ export default definePlugin({ authors: [Devs.Aria, EquicordDevs.keircn], description: "Improves MessageLogger with edited message history, ghost ping detection and more", tags: ["Chat", "Servers"], - dependencies: ["MessageLogger"], + dependencies: ["MessageLogger", "HeaderBarAPI"], patches: [ { diff --git a/src/equicordplugins/messagePeek/index.tsx b/src/equicordplugins/messagePeek/index.tsx index b22824096..564838146 100644 --- a/src/equicordplugins/messagePeek/index.tsx +++ b/src/equicordplugins/messagePeek/index.tsx @@ -239,6 +239,7 @@ function shouldShowActivity(lastMessage: Message | undefined, hasActivity: boole export default definePlugin({ name: "MessagePeek", description: "Shows the last message preview and timestamp in the Direct Messages list.", + dependencies: ["MemberListDecoratorsAPI"], tags: ["Appearance", "Chat"], authors: [Devs.prism, EquicordDevs.justjxke], settings, diff --git a/src/equicordplugins/moreCommands/index.ts b/src/equicordplugins/moreCommands/index.ts index 317d1ecd0..9f6cbbfd9 100644 --- a/src/equicordplugins/moreCommands/index.ts +++ b/src/equicordplugins/moreCommands/index.ts @@ -52,6 +52,7 @@ migratePluginSettings("MoreCommands", "FriendCloud", "GifRoulette", "ImgToGif", export default definePlugin({ name: "MoreCommands", description: "Adds various fun and useful commands", + dependencies: ["CommandsAPI"], tags: ["Commands", "Fun", "Shortcuts"], authors: [ Devs.Arjix, diff --git a/src/equicordplugins/moreUserTags/index.tsx b/src/equicordplugins/moreUserTags/index.tsx index 5f681e137..395144257 100644 --- a/src/equicordplugins/moreUserTags/index.tsx +++ b/src/equicordplugins/moreUserTags/index.tsx @@ -37,6 +37,7 @@ migratePluginToSettings(true, "MoreUserTags", "NoAppsAllowed", "noAppsAllowed"); export default definePlugin({ name: "MoreUserTags", description: "Adds tags for webhooks and moderative roles (owner, admin, etc.)", + dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI", "NicknameIconsAPI"], tags: ["Appearance", "Chat"], authors: [Devs.Cyn, Devs.TheSun, Devs.RyanCaoDev, Devs.LordElias, Devs.AutumnVN, EquicordDevs.Hen, EquicordDevs.meowabyte], settings, diff --git a/src/equicordplugins/polishWording/index.ts b/src/equicordplugins/polishWording/index.ts index 4f623c04a..2f8f6d33c 100644 --- a/src/equicordplugins/polishWording/index.ts +++ b/src/equicordplugins/polishWording/index.ts @@ -64,6 +64,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PolishWording", description: "Tweaks your messages to make them look nicer and have better grammar. See settings", + dependencies: ["MessageEventsAPI"], tags: ["Chat"], authors: [Devs.Samwich, EquicordDevs.WKoA], onBeforeMessageSend: presendObject, diff --git a/src/equicordplugins/randomVoice/index.tsx b/src/equicordplugins/randomVoice/index.tsx index 05c4a25d5..9d78149d2 100644 --- a/src/equicordplugins/randomVoice/index.tsx +++ b/src/equicordplugins/randomVoice/index.tsx @@ -671,6 +671,7 @@ function renderOperationGroup({ export default definePlugin({ name: "RandomVoice", description: "Adds a button near mute to join a random voice channel.", + dependencies: ["UserAreaAPI"], tags: ["Fun", "Voice"], authors: [EquicordDevs.xijexo, EquicordDevs.omaw, Devs.thororen], settings, diff --git a/src/equicordplugins/repeatMessages/index.tsx b/src/equicordplugins/repeatMessages/index.tsx index ef45a1fc7..5bbcf3f2b 100644 --- a/src/equicordplugins/repeatMessages/index.tsx +++ b/src/equicordplugins/repeatMessages/index.tsx @@ -132,6 +132,7 @@ migratePluginSettings("RepeatMessages", "RepeatMessage"); export default definePlugin({ name: "RepeatMessages", description: "Allows you to repeat messages quickly. If you hold shift while clicking the Repeat option, it will reply to the message.", + dependencies: ["MessagePopoverAPI"], tags: ["Chat"], authors: [EquicordDevs.Tolgchu, Devs.thororen], contextMenus: { diff --git a/src/equicordplugins/saveFavoriteGIFs/index.tsx b/src/equicordplugins/saveFavoriteGIFs/index.tsx index 165a00705..268be6571 100644 --- a/src/equicordplugins/saveFavoriteGIFs/index.tsx +++ b/src/equicordplugins/saveFavoriteGIFs/index.tsx @@ -115,6 +115,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SaveFavoriteGIFs", description: "Export favorited GIF urls", + dependencies: ["CommandsAPI"], tags: ["Emotes", "Utility"], authors: [Devs.thororen], settings, diff --git a/src/equicordplugins/scheduledMessages/index.tsx b/src/equicordplugins/scheduledMessages/index.tsx index 6d78464f8..d79402226 100644 --- a/src/equicordplugins/scheduledMessages/index.tsx +++ b/src/equicordplugins/scheduledMessages/index.tsx @@ -87,6 +87,7 @@ export default definePlugin({ name: "ScheduledMessages", description: "Schedule messages to be sent at a specific time or after a delay.", tags: ["Chat", "Utility"], + dependencies: ["ChatInputButtonAPI", "MessageAccessoriesAPI", "MessageEventsAPI"], authors: [EquicordDevs.mmeta, Devs.prism], settings, diff --git a/src/equicordplugins/sekaiStickers/index.tsx b/src/equicordplugins/sekaiStickers/index.tsx index 98e1ff8c5..aa6188e1a 100644 --- a/src/equicordplugins/sekaiStickers/index.tsx +++ b/src/equicordplugins/sekaiStickers/index.tsx @@ -33,6 +33,7 @@ let IS_FONTS_LOADED = false; export default definePlugin({ name: "SekaiStickers", description: "Sekai Stickers built in discord originally from github.com/TheOriginalAyaka", + dependencies: ["ChatInputButtonAPI"], tags: ["Chat", "Emotes"], authors: [Devs.MaiKokain], settings, diff --git a/src/equicordplugins/showBadgesInChat/index.tsx b/src/equicordplugins/showBadgesInChat/index.tsx index d5487236d..5e05ba431 100644 --- a/src/equicordplugins/showBadgesInChat/index.tsx +++ b/src/equicordplugins/showBadgesInChat/index.tsx @@ -142,6 +142,7 @@ export default definePlugin({ name: "ShowBadgesInChat", authors: [Devs.Inbestigator, EquicordDevs.KrystalSkull], description: "Shows the message author's badges beside their name in chat.", + dependencies: ["MessageDecorationsAPI"], tags: ["Appearance", "Chat"], settings, renderMessageDecoration(props) { diff --git a/src/equicordplugins/signature/index.tsx b/src/equicordplugins/signature/index.tsx index 9379d2e6e..e09edf3e5 100644 --- a/src/equicordplugins/signature/index.tsx +++ b/src/equicordplugins/signature/index.tsx @@ -100,6 +100,7 @@ const ChatBarContextCheckbox: NavContextMenuPatchCallback = children => { export default definePlugin({ name: "Signature", description: "Automated fingerprint/end text", + dependencies: ["CommandsAPI", "ChatInputButtonAPI", "MessagePopoverAPI"], tags: ["Appearance", "Chat"], authors: [Devs.Ven, Devs.Rini, Devs.ImBanana, EquicordDevs.KrystalSkull], onBeforeMessageSend(channelId, msg) { diff --git a/src/equicordplugins/soggy/index.tsx b/src/equicordplugins/soggy/index.tsx index 71d56a405..099e94792 100644 --- a/src/equicordplugins/soggy/index.tsx +++ b/src/equicordplugins/soggy/index.tsx @@ -140,7 +140,7 @@ export default definePlugin({ tags: ["Fun"], authors: [EquicordDevs.sliwka], settings, - dependencies: ["AudioPlayerAPI"], + dependencies: ["AudioPlayerAPI", "HeaderBarAPI"], headerBarButton: { icon: () => ( diff --git a/src/equicordplugins/songLink.desktop/index.tsx b/src/equicordplugins/songLink.desktop/index.tsx index 9131869b3..0834d639a 100644 --- a/src/equicordplugins/songLink.desktop/index.tsx +++ b/src/equicordplugins/songLink.desktop/index.tsx @@ -51,6 +51,7 @@ export const Native = VencordNative.pluginHelpers.SongLink as PluginNative export default definePlugin({ name: "Translate+", description: "Vencord's translate plugin but with support for artistic languages!", + dependencies: ["MessageAccessoriesAPI", "MessagePopoverAPI"], tags: ["Chat", "Utility"], authors: [Devs.Ven, EquicordDevs.Prince527], settings, diff --git a/src/equicordplugins/triviaAI/index.tsx b/src/equicordplugins/triviaAI/index.tsx index 29a2fa89f..afa941109 100644 --- a/src/equicordplugins/triviaAI/index.tsx +++ b/src/equicordplugins/triviaAI/index.tsx @@ -40,6 +40,7 @@ const messageCtxPatch: NavContextMenuPatchCallback = (children, { message }: { m export default definePlugin({ name: "TriviaAI", description: "A plugin that helps you answer trivia questions using AI.", + dependencies: ["MessagePopoverAPI"], tags: ["Appearance", "Customisation", "Fun"], authors: [EquicordDevs.yash], settings, diff --git a/src/equicordplugins/unitConverter/index.tsx b/src/equicordplugins/unitConverter/index.tsx index f8a3d11cb..c8c67aa1e 100644 --- a/src/equicordplugins/unitConverter/index.tsx +++ b/src/equicordplugins/unitConverter/index.tsx @@ -48,6 +48,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "UnitConverter", description: "Converts metric units to Imperal units and vice versa", + dependencies: ["MessagePopoverAPI"], tags: ["Utility"], authors: [Devs.sadan], messagePopoverButton: { diff --git a/src/equicordplugins/voiceChannelLog/index.tsx b/src/equicordplugins/voiceChannelLog/index.tsx index 4ef728a57..377ff7503 100644 --- a/src/equicordplugins/voiceChannelLog/index.tsx +++ b/src/equicordplugins/voiceChannelLog/index.tsx @@ -56,7 +56,7 @@ export default definePlugin({ description: "Logs voice channel activity including joins, leaves, soundboard, mute, camera, screenshare, and more.", tags: ["Servers", "Utility", "Voice"], authors: [Devs.Sqaaakoi, Devs.thororen, EquicordDevs.nyx, Devs.Moxxie, EquicordDevs.Fres, Devs.amy], - dependencies: ["AudioPlayerAPI"], + dependencies: ["AudioPlayerAPI", "HeaderBarAPI"], settings, contextMenus: { "channel-context": patchChannelContextMenu diff --git a/src/plugins/_core/supportHelper.tsx b/src/plugins/_core/supportHelper.tsx index a2e1d8172..385472477 100644 --- a/src/plugins/_core/supportHelper.tsx +++ b/src/plugins/_core/supportHelper.tsx @@ -289,7 +289,7 @@ export default definePlugin({ required: true, description: "Helps us provide support to you", authors: [Devs.Ven], - dependencies: ["UserSettingsAPI"], + dependencies: ["UserSettingsAPI", "CommandsAPI", "MessageAccessoriesAPI"], settings, diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx index 192df3154..565ec1a39 100644 --- a/src/plugins/anonymiseFileNames/index.tsx +++ b/src/plugins/anonymiseFileNames/index.tsx @@ -75,6 +75,7 @@ export default definePlugin({ name: "AnonymiseFileNames", authors: [Devs.fawn], description: "Anonymise uploaded file names", + dependencies: ["CommandsAPI"], tags: ["Privacy", "Utility"], isModified: true, settings, diff --git a/src/plugins/clearURLs/index.ts b/src/plugins/clearURLs/index.ts index ed1d65962..6affa8f9b 100644 --- a/src/plugins/clearURLs/index.ts +++ b/src/plugins/clearURLs/index.ts @@ -50,6 +50,7 @@ interface RuleSet { export default definePlugin({ name: "ClearURLs", description: "Automatically removes tracking elements from URLs you send", + dependencies: ["MessageEventsAPI"], tags: ["Privacy", "Utility"], authors: [Devs.adryd, Devs.thororen], diff --git a/src/plugins/customCommands/index.ts b/src/plugins/customCommands/index.ts index c4490be26..bc77ab6f6 100644 --- a/src/plugins/customCommands/index.ts +++ b/src/plugins/customCommands/index.ts @@ -90,6 +90,7 @@ migratePluginSettings("CustomCommands", "MessageTags"); export default definePlugin({ name: "CustomCommands", description: "Allows you to create custom slash commands / tags", + dependencies: ["CommandsAPI"], searchTerms: ["MessageTags"], authors: [Devs.Ven, Devs.Luna,], tags: ["Commands", "Customisation", "Utility"], diff --git a/src/plugins/favEmojiFirst/index.tsx b/src/plugins/favEmojiFirst/index.tsx index 0d4d636a4..4c6261d78 100644 --- a/src/plugins/favEmojiFirst/index.tsx +++ b/src/plugins/favEmojiFirst/index.tsx @@ -1103,6 +1103,7 @@ export default definePlugin({ authors: [Devs.Aria, Devs.Ven, EquicordDevs.justjxke], tags: ["Emotes", "Customisation"], description: "Puts your favorite emoji first in the emoji autocomplete and also has emoji alias.", + dependencies: ["MessagePopoverAPI"], settings, contextMenus: { "expression-picker": expressionPickerPatch, diff --git a/src/plugins/friendInvites/index.ts b/src/plugins/friendInvites/index.ts index ec677e297..7cd486a7a 100644 --- a/src/plugins/friendInvites/index.ts +++ b/src/plugins/friendInvites/index.ts @@ -26,6 +26,7 @@ const FriendInvites = findByPropsLazy("createFriendInvite"); export default definePlugin({ name: "FriendInvites", description: "Create and manage friend invite links via slash commands (/create friend invite, /view friend invites, /revoke friend invites).", + dependencies: ["CommandsAPI"], tags: ["Friends", "Commands"], authors: [Devs.afn, Devs.Dziurwa], commands: [ diff --git a/src/plugins/gameActivityToggle/index.tsx b/src/plugins/gameActivityToggle/index.tsx index fc88b153a..c0ad504ae 100644 --- a/src/plugins/gameActivityToggle/index.tsx +++ b/src/plugins/gameActivityToggle/index.tsx @@ -100,7 +100,7 @@ export default definePlugin({ description: "Adds a button next to the mic and deafen button to toggle game activity.", tags: ["Activity", "Shortcuts"], authors: [Devs.Nuckyz, Devs.RuukuLada], - dependencies: ["UserSettingsAPI"], + dependencies: ["UserSettingsAPI", "UserAreaAPI"], settings, userAreaButton: { diff --git a/src/plugins/hideAttachments/index.tsx b/src/plugins/hideAttachments/index.tsx index 60e258dca..b47e053ac 100644 --- a/src/plugins/hideAttachments/index.tsx +++ b/src/plugins/hideAttachments/index.tsx @@ -58,7 +58,7 @@ export default definePlugin({ description: "Hide attachments and embeds for individual messages via hover button", tags: ["Chat", "Appearance"], authors: [Devs.Ven], - dependencies: ["MessageUpdaterAPI"], + dependencies: ["MessageUpdaterAPI", "MessageAccessoriesAPI", "MessagePopoverAPI"], patches: [{ find: "this.renderAttachments(", diff --git a/src/plugins/petpet/index.ts b/src/plugins/petpet/index.ts index 9a164ea4a..285fca355 100644 --- a/src/plugins/petpet/index.ts +++ b/src/plugins/petpet/index.ts @@ -110,6 +110,7 @@ migratePluginSettings("PetPet", "petpet"); export default definePlugin({ name: "PetPet", description: "Adds a /petpet slash command to create headpet gifs from any image", + dependencies: ["CommandsAPI"], tags: ["Fun", "Commands"], authors: [Devs.Ven, Devs.u32], commands: [ diff --git a/src/plugins/platformIndicators/index.tsx b/src/plugins/platformIndicators/index.tsx index f5b88c0bc..be877413d 100644 --- a/src/plugins/platformIndicators/index.tsx +++ b/src/plugins/platformIndicators/index.tsx @@ -219,6 +219,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PlatformIndicators", description: "Adds platform indicators (Desktop, Mobile, Web...) to users", + dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI", "NicknameIconsAPI"], tags: ["Appearance"], authors: [Devs.kemo, Devs.TheSun, Devs.Nuckyz, Devs.Ven, EquicordDevs.neoarz], isModified: true, diff --git a/src/plugins/previewMessage/index.tsx b/src/plugins/previewMessage/index.tsx index 007bcf82b..d49a82d01 100644 --- a/src/plugins/previewMessage/index.tsx +++ b/src/plugins/previewMessage/index.tsx @@ -120,6 +120,7 @@ const PreviewButton: ChatBarButtonFactory = ({ isAnyChat, isEmpty, type: { attac export default definePlugin({ name: "PreviewMessage", description: "Lets you preview your message before sending it.", + dependencies: ["ChatInputButtonAPI"], tags: ["Chat", "Utility"], authors: [Devs.Aria], // start early to ensure we're the first plugin to add our button diff --git a/src/plugins/quickMention/index.tsx b/src/plugins/quickMention/index.tsx index dac0ae971..edad6b5f0 100644 --- a/src/plugins/quickMention/index.tsx +++ b/src/plugins/quickMention/index.tsx @@ -41,6 +41,7 @@ export default definePlugin({ name: "QuickMention", authors: [Devs.kemo], description: "Adds a quick mention button to the message actions bar", + dependencies: ["MessagePopoverAPI"], tags: ["Chat", "Shortcuts"], messagePopoverButton: { diff --git a/src/plugins/reviewDB/index.tsx b/src/plugins/reviewDB/index.tsx index a5f384286..dca4e7217 100644 --- a/src/plugins/reviewDB/index.tsx +++ b/src/plugins/reviewDB/index.tsx @@ -69,6 +69,7 @@ const userContextPatch: NavContextMenuPatchCallback = (children, { user }: { use export default definePlugin({ name: "ReviewDB", description: "Review other users (Adds a new settings to profiles)", + dependencies: ["ProfileCollectionsAPI"], tags: ["Friends", "Servers"], authors: [Devs.mantikafasi, Devs.Ven], isModified: true, diff --git a/src/plugins/sendTimestamps/index.tsx b/src/plugins/sendTimestamps/index.tsx index 87f223a1d..930bf498e 100644 --- a/src/plugins/sendTimestamps/index.tsx +++ b/src/plugins/sendTimestamps/index.tsx @@ -170,6 +170,7 @@ const SendTimestampButton: ChatBarButtonFactory = ({ isAnyChat }) => { export default definePlugin({ name: "SendTimestamps", description: "Send timestamps easily via chat box button & text shortcuts. Read the extended description!", + dependencies: ["ChatInputButtonAPI", "MessagePopoverAPI"], tags: ["Chat", "Commands"], authors: [Devs.Ven, Devs.Tyler, Devs.Grzesiek11], settings, diff --git a/src/plugins/silentMessageToggle/index.tsx b/src/plugins/silentMessageToggle/index.tsx index 929a1804d..9e6eb724c 100644 --- a/src/plugins/silentMessageToggle/index.tsx +++ b/src/plugins/silentMessageToggle/index.tsx @@ -110,6 +110,7 @@ export default definePlugin({ name: "SilentMessageToggle", authors: [Devs.Nuckyz, Devs.CatNoir, EquicordDevs.Z1xus], description: "Adds a button to the chat bar to toggle sending a silent message.", + dependencies: ["ChatInputButtonAPI"], tags: ["Chat", "Utility"], settings, diff --git a/src/plugins/silentTyping/index.tsx b/src/plugins/silentTyping/index.tsx index 20e21e53c..31cbd60ec 100644 --- a/src/plugins/silentTyping/index.tsx +++ b/src/plugins/silentTyping/index.tsx @@ -297,6 +297,7 @@ export default definePlugin({ name: "SilentTyping", authors: [Devs.Ven, Devs.Rini, Devs.ImBanana, EquicordDevs.Etorix], description: "Hide that you are typing", + dependencies: ["CommandsAPI", "ChatInputButtonAPI"], tags: ["Chat", "Privacy"], isModified: true, settings, diff --git a/src/plugins/spotifyShareCommands/index.ts b/src/plugins/spotifyShareCommands/index.ts index ec350a255..b0d5e0fd2 100644 --- a/src/plugins/spotifyShareCommands/index.ts +++ b/src/plugins/spotifyShareCommands/index.ts @@ -98,6 +98,7 @@ function makeCommand(name: string, formatUrl: (track: Track) => string): Command export default definePlugin({ name: "SpotifyShareCommands", description: "Share your current Spotify track, album or artist via slash command (/track, /album, /artist)", + dependencies: ["CommandsAPI"], tags: ["Media", "Commands"], authors: [Devs.katlyn], commands: [ diff --git a/src/plugins/textReplace/index.tsx b/src/plugins/textReplace/index.tsx index beb6f632d..3374bd8fb 100644 --- a/src/plugins/textReplace/index.tsx +++ b/src/plugins/textReplace/index.tsx @@ -304,6 +304,7 @@ const TEXT_REPLACE_RULES_EXEMPT_CHANNEL_IDS = [ export default definePlugin({ name: "TextReplace", description: "Replace text in your messages. You can find pre-made rules in the #textreplace-rules channel in Vencord's Server", + dependencies: ["MessagePopoverAPI"], tags: ["Chat", "Customisation", "Utility"], authors: [Devs.AutumnVN, Devs.TheKodeToad, EquicordDevs.Etorix], diff --git a/src/plugins/translate/index.tsx b/src/plugins/translate/index.tsx index fab0128d3..caeb5ac62 100644 --- a/src/plugins/translate/index.tsx +++ b/src/plugins/translate/index.tsx @@ -63,6 +63,7 @@ let tooltipTimeout: any; export default definePlugin({ name: "Translate", description: "Translate messages with Google Translate or DeepL", + dependencies: ["ChatInputButtonAPI", "MessageAccessoriesAPI", "MessagePopoverAPI"], tags: ["Chat", "Utility"], authors: [Devs.Ven, Devs.AshtonMemer], settings, diff --git a/src/plugins/unindent/index.ts b/src/plugins/unindent/index.ts index 007993cf0..9ebbf8deb 100644 --- a/src/plugins/unindent/index.ts +++ b/src/plugins/unindent/index.ts @@ -23,6 +23,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "Unindent", description: "Trims leading indentation from codeblocks", + dependencies: ["MessageEventsAPI"], tags: ["Chat", "Utility"], authors: [Devs.Ven], diff --git a/src/plugins/userVoiceShow/index.tsx b/src/plugins/userVoiceShow/index.tsx index 74848f8ef..fb6f0c8df 100644 --- a/src/plugins/userVoiceShow/index.tsx +++ b/src/plugins/userVoiceShow/index.tsx @@ -49,6 +49,7 @@ export default definePlugin({ name: "UserVoiceShow", description: "Shows an indicator when a user is in a Voice Channel", tags: ["Voice", "Appearance", "Friends"], + dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI", "NicknameIconsAPI"], authors: [Devs.Nuckyz, Devs.LordElias, EquicordDevs.omaw], settings, renderNicknameIcon({ userId }) { diff --git a/src/plugins/viewRaw/index.tsx b/src/plugins/viewRaw/index.tsx index 3068ea670..212ea4e49 100644 --- a/src/plugins/viewRaw/index.tsx +++ b/src/plugins/viewRaw/index.tsx @@ -176,6 +176,7 @@ const devContextCallback: NavContextMenuPatchCallback = (children, { id }: { id: export default definePlugin({ name: "ViewRaw", description: "Copy and view the raw content/data of any message, channel or guild", + dependencies: ["MessagePopoverAPI"], tags: ["Chat", "Developers"], authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna], settings, From 8e19aecd92f54acd4087103432995d43103a67cc Mon Sep 17 00:00:00 2001 From: Etorix <92535668+EtorixDev@users.noreply.github.com> Date: Thu, 16 Apr 2026 08:40:55 -0700 Subject: [PATCH 035/247] SMYN: Fix patch. (#976) --- src/plugins/showMeYourName/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx index 101a6afa7..bda540684 100644 --- a/src/plugins/showMeYourName/index.tsx +++ b/src/plugins/showMeYourName/index.tsx @@ -1139,7 +1139,7 @@ export default definePlugin({ // Attach the group ID to their messages to allow animating gradients within a group. find: "CUSTOM_GIFT?\"\":", replacement: { - match: /(isHovered:(\i).{0,1300}?\(\i,\i,\i\);)(let \i=\i.id===\i)/, + match: /(isHovered:(\i).{0,1300})(let \i=\i.id===\i,\i=)/, replace: "$1arguments[0].message.showMeYourNameGroupId=!!arguments[0].groupId?`g-${arguments[0].groupId}`:null;$self.handleHoveringMessage(arguments[0].message,$2);$3" }, }, From c0459e2adbf0e9703b67d976af06ff90baa53987 Mon Sep 17 00:00:00 2001 From: nin0 Date: Thu, 16 Apr 2026 11:44:14 -0400 Subject: [PATCH 036/247] feat(plugin): UserpluginInstaller (#974) Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com> Co-authored-by: creations --- .../VariableWithCallbacks.ts | 40 + .../components/SettingsTab.tsx | 340 ++ .../components/UserpluginInstallButton.tsx | 55 + .../userpluginInstaller.dev/index.tsx | 138 + .../userpluginInstaller.dev/misc/constants.ts | 28 + .../misc/pluginValidate.txt | 158 + .../misc/setGitPath.txt | 118 + .../userpluginInstaller.dev/misc/style.css | 78 + .../misc/updateValidate.txt | 129 + .../userpluginInstaller.dev/native.ts | 473 ++ .../userpluginInstaller.dev/yaml.js | 5175 +++++++++++++++++ 11 files changed, 6732 insertions(+) create mode 100644 src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts create mode 100644 src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx create mode 100644 src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx create mode 100644 src/equicordplugins/userpluginInstaller.dev/index.tsx create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/constants.ts create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/style.css create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt create mode 100644 src/equicordplugins/userpluginInstaller.dev/native.ts create mode 100644 src/equicordplugins/userpluginInstaller.dev/yaml.js diff --git a/src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts b/src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts new file mode 100644 index 000000000..b87476fe2 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts @@ -0,0 +1,40 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +export class VariableWithCallbacks { + #value: T; + #callbacks: { + id: number; + callback: (value: T, id: number) => void; + }[] = []; + + constructor(value: T) { + this.#value = value; + } + + value(newValue?: T): T { + if (newValue !== undefined) { + this.#value = newValue; + this.#callbacks.forEach(c => c.callback(this.#value, c.id)); + } + return this.#value; + } + + registerCallback(callback: (value: T, id: number) => void): number { + const id = Date.now(); + this.#callbacks.push({ + id, + callback + }); + return id; + } + + deregisterCallback(id: number) { + const possibleFallback = this.#callbacks.find(cb => cb.id === id); + if (!possibleFallback) return; + this.#callbacks.splice(this.#callbacks.indexOf(possibleFallback), 1); + } +} diff --git a/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx b/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx new file mode 100644 index 000000000..3bdfc9859 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx @@ -0,0 +1,340 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { pluginRequiresRestart, startPlugin, stopPlugin } from "@api/PluginManager"; +import { useSettings } from "@api/Settings"; +import { BaseText } from "@components/BaseText"; +import { Button } from "@components/Button"; +import { Card } from "@components/Card"; +import { CheckedTextInput } from "@components/CheckedTextInput"; +import { HeadingTertiary } from "@components/Heading"; +import { DeleteIcon } from "@components/Icons"; +import { Paragraph } from "@components/Paragraph"; +import { AddonCard } from "@components/settings"; +import { + SettingsTab as STab, + wrapTab, +} from "@components/settings/tabs/BaseTab"; +import { classes, isObjectEmpty } from "@utils/misc"; +import { closeAllModals } from "@utils/modal"; +import { relaunch } from "@utils/native"; +import { Alerts, NavigationRouter, Toasts, useEffect, useState } from "@webpack/common"; + +import userpluginInstaller, { Native } from ".."; +import { + cl, + CLONE_LINK_REGEX, + showInstallFinishedAlert, +} from "../misc/constants"; + +function UserPluginsTab() { + const rs = useSettings(["plugins.*"]); + const [pluginsLoaded, loadPlugins] = useState(false); + const [plugins, setPlugins] = useState< + { + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; + directory?: string; + remote: string; + supportChannelID?: string; + }[] + >([]); + const [url, setUrl] = useState(""); + const [valid, setValid] = useState(false); + const [pluginsWithUpdates, setPluginsWithUpdates] = useState< + Record + >({}); + const [updatesLoaded, loadUpdates] = useState(false); + + useEffect(() => { + const { plugins: plgobj, pluginsWithUpdates: pwug } = + userpluginInstaller; + setPlugins(plgobj.value()); + loadPlugins(true); + const cid2 = plgobj.registerCallback(value => setPlugins(value)); + + const setPWU = value => { + const pwu = value.plugins.map(pg => ({ + [pg]: plgobj.value().find(pfjh => pfjh.directory === pg) + ?.name, + })); + setPluginsWithUpdates(Object.assign({}, ...pwu)); + loadUpdates(value.finished); + }; + const cid = pwug.registerCallback(value => { + setPWU(value); + }); + setPWU(pwug.value()); + + return () => { + pwug.deregisterCallback(cid); + plgobj.deregisterCallback(cid2); + }; + }, []); + + return ( + Vencord.Settings.plugins[p.name].enabled).length} enabled)` : ""}`} + > +
+ {isObjectEmpty(pluginsWithUpdates) ? ( + !updatesLoaded && ( + Checking for updates... + ) + ) : ( + + + Plugin Updates Available + + + The following plugins are out-of-date: +
    + {Object.values(pluginsWithUpdates) + .toSorted() + .map(pl => ( +
  • {pl}
  • + ))} +
+ {!updatesLoaded && + "and possibly more, as update checking is not finished. "} + You can update plugins below. +
+
+ )} +
+ + + Install Plugin + + + You can install a plugin from GitHub, GitLab, Codeberg, + git.nin0.dev, or plugins.nin0.dev by pasting its clone URL + here. + +
+ setUrl(t)} + validate={t => { + const match = t.match(CLONE_LINK_REGEX); + if (match) { + const idpl = match.includes("plugins.nin0.dev") + ? 1 + : 0; + const installed = plugins + .map(p => p.directory) + .includes(match[[3, 6][idpl]]); + if (installed) { + setValid(false); + return "Plugin already installed, update below"; + } + setValid(true); + return true; + } else { + setValid(false); + return "Invalid URL, read the notice above"; + } + }} + value={url} + /> +
+
+ +
+
+
+ {pluginsLoaded ? ( +
+ {plugins + .toSorted((a, b) => + a.name.localeCompare(b.name, "en", { + sensitivity: "base", + }), + ) + .toSorted((a, b) => { + const updatePendingNames = + Object.keys(pluginsWithUpdates); + const [aa, bb] = [ + updatePendingNames.includes(a.directory!) + ? 1000 + : 0, + updatePendingNames.includes(b.directory!) + ? 1000 + : 0, + ]; + return bb - aa; + }) + .map(plugin => { + + const pl = Vencord.Plugins.plugins[ + plugin.name + ]; + return { + await Native.rmPlugin( + plugin.directory!, + ); + Alerts.show({ + title: "Done!", + body: `${plugin.name} has been uninstalled. A ${plugin.usesNative ? "restart" : "refresh"} is needed to fully remove the plugin.`, + confirmText: + plugin.usesNative + ? "Restart" + : "Refresh", + cancelText: "Later", + onConfirm() { + plugin.usesNative + ? relaunch() + : window.location.reload(); + }, + }); + }} + className={cl("delete-button")} + > + + } + setEnabled={t => { + Vencord.Settings.plugins[pl.name].enabled = t; + if (pluginRequiresRestart(pl)) { + Toasts.show({ + id: Toasts.genId(), + message: "Restart to apply changes!", + type: Toasts.Type.MESSAGE + }); + } else { + (t ? startPlugin : stopPlugin)(pl); + } + }} + footer={( +
+ {Object.keys( + pluginsWithUpdates, + ).includes(plugin.directory!) && ( + + )} + + {plugin.supportChannelID && } +
+ )} + />; + })} +
+ ) : ( + Loading plugins... + )} +
+
+ ); +} + +export default wrapTab(UserPluginsTab, "UserPlugins"); diff --git a/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx b/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx new file mode 100644 index 000000000..753a93961 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx @@ -0,0 +1,55 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Button } from "@components/Button"; +import { Alerts, ChannelStore, useEffect, useState } from "@webpack/common"; + +import userpluginInstaller, { Native, OpenSettingsModule, settings } from ".."; +import { CLONE_LINK_REGEX, showInstallFinishedAlert, WHITELISTED_SHARE_CHANNELS } from "../misc/constants"; + +export default function UserpluginInstallButton({ props }: any) { + const [plugins, setPlugins] = useState<{ + directory?: string; + }[]>([]); + useEffect(() => { + const { plugins } = userpluginInstaller; + + setPlugins(plugins.value()); + const cid = plugins.registerCallback(value => setPlugins(plugins.value())); + return () => plugins.deregisterCallback(cid); + }); + const { message } = props; + if (![...WHITELISTED_SHARE_CHANNELS, ...(settings.store.allowlistedChannels || "").split(",")].includes(ChannelStore.getChannel(message.channel_id).parent_id) && !WHITELISTED_SHARE_CHANNELS.includes(message.channel_id)) + return; + const gitLink = (props.message.content as string).match(CLONE_LINK_REGEX); + if (!gitLink) return; + const idpl = gitLink.includes("plugins.nin0.dev") ? 1 : 0; + const installed = plugins.map(p => p.directory).includes(gitLink[[3, 6][idpl]]); + return <> +
+ +
+ ; +} diff --git a/src/equicordplugins/userpluginInstaller.dev/index.tsx b/src/equicordplugins/userpluginInstaller.dev/index.tsx new file mode 100644 index 000000000..1d30ce697 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/index.tsx @@ -0,0 +1,138 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "./misc/style.css"; + +import { showNotification } from "@api/Notifications"; +import { definePluginSettings } from "@api/Settings"; +import { Button } from "@components/Button"; +import plSettings from "@plugins/_core/settings"; +import { Devs } from "@utils/constants"; +import { relaunch } from "@utils/native"; +import definePlugin, { OptionType, PluginNative } from "@utils/types"; +import { findByPropsLazy, findComponentByCodeLazy } from "@webpack"; +import { Alerts } from "@webpack/common"; + +import SettingsTab from "./components/SettingsTab"; +import UserpluginInstallButton from "./components/UserpluginInstallButton"; +import { VariableWithCallbacks } from "./VariableWithCallbacks"; + +// @ts-ignore +export const Native = VencordNative.pluginHelpers.UserpluginInstaller as PluginNative; +export const OpenSettingsModule = findByPropsLazy("openUserSettings"); +const AppsIcon = findComponentByCodeLazy("2.95H20a2 2 0"); + +export const settings = definePluginSettings({ + allowlistedChannels: { + type: OptionType.STRING, + description: "Comma separated list of channels where the Install Plugin button should be displayed. It is always displayed in the Vencord Userplugin channels" + }, + notifyIfUpdate: { + type: OptionType.BOOLEAN, + description: "Show a Vencord notification if UserPlugins need to be updated", + default: true + }, + neverNotifyForPlugins: { + type: OptionType.STRING, + description: "Never show update notifications for these plugins (you can still update them from the UserPlugins tab)", + default: "" + }, + setGitPath: { + type: OptionType.COMPONENT, + component: () => + } +}); + +export default definePlugin({ + name: "UserpluginInstaller", + description: "Install userplugins with a simple button click", + async checkPluginUpdates() { + for (const p of this.plugins.value()) { + if (await Native.isUpdateAvailableForPlugin(p.directory!)) { + const t = this.pluginsWithUpdates.value().plugins; + t.push(p.directory!); + this.pluginsWithUpdates.value({ + finished: false, + plugins: t + }); + } + } + const t = this.pluginsWithUpdates.value().plugins; + this.pluginsWithUpdates.value({ + finished: true, + plugins: t + }); + }, + section: { + key: "vencord_userplugins", + title: "UserPlugins", + panelTitle: "UserPlugins", + Component: SettingsTab, + Icon: AppsIcon + }, + async start() { + if (!VencordNative.pluginHelpers.UserpluginInstaller) return void Alerts.show({ + title: "UserpluginInstaller not fully loaded", + body: "This usually happens if you didn't fully restart your client after installing the plugin, which prevents the native helpers from loading. Restart your client to fix the issue.", + confirmText: "Restart now", + onConfirm() { + relaunch(); + }, + cancelText: "Later" + }); + + plSettings.customEntries.push(this.section); + + this.pluginsWithUpdates.registerCallback((value, id) => { + if (value.plugins.length === 0) return; + if (settings.store.neverNotifyForPlugins.split(",").map(t => t.trim().toLowerCase()).includes(value.plugins[value.plugins.length - 1].toLowerCase())) + return; + this.pluginsWithUpdates.deregisterCallback(id); + if (settings.store.notifyIfUpdate) + showNotification({ + title: "Some UserPlugins are out of date!", + body: "Click to open the UserPlugin Updater", + noPersist: true, + permanent: true, + onClick() { + OpenSettingsModule.openUserSettings("vencord_userplugins_panel"); + }, + }); + }); + const pls = await Native.getUserplugins(); + // @ts-ignore :trolley: + this.plugins.value(pls); + await this.checkPluginUpdates(); + }, + stop() { + // @ts-ignore + plSettings.customEntries.splice(plSettings.customEntries.indexOf(this.section), 1); + }, + plugins: new VariableWithCallbacks<{ + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; + directory: string; + remote: string; + }[]>([]), + pluginsWithUpdates: new VariableWithCallbacks<{ + finished: boolean; + plugins: string[]; + }>({ + finished: false, + plugins: [] + }), + settings, + authors: [Devs.nin0dev], + renderMessageAccessory: props => { + return ; + } +}); diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts b/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts new file mode 100644 index 000000000..b860a82c3 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts @@ -0,0 +1,28 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { classNameFactory } from "@api/Styles"; +import { relaunch } from "@utils/native"; +import { Alerts } from "@webpack/common"; + +// if edited, also edit in native.ts!!! +export const CLONE_LINK_REGEX = /https:\/\/(?:((?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org))\/(?!user-attachments)((?:[a-zA-Z0-9]|-)+)\/((?:[a-zA-Z0-9]|-|\.)+)(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?/; +export const WHITELISTED_SHARE_CHANNELS = ["1256395889354997771", "1032200195582197831", "1301947896601509900", "1322935137591365683"]; +export const cl = classNameFactory("vc-userplugininstaller-"); + +export function showInstallFinishedAlert(pluginToEnable: string, native: boolean) { + Alerts.show({ + title: "Done!", + body: `${pluginToEnable} has been successfully installed.${native ? " However, as it makes use of native functions, a client restart is required." : ""} What now?`, + confirmText: `Enable & ${native ? "restart" : "refresh"}`, + cancelText: native ? "Restart" : "Refresh", + onConfirm() { + !Vencord.Plugins.plugins[pluginToEnable] ? Vencord.Settings.plugins[pluginToEnable] = { enabled: true } : Vencord.Settings.plugins[pluginToEnable].enabled = true; + native ? relaunch() : window.location.reload(); + }, + onCancel: () => native ? relaunch() : window.location.reload() + }); +} diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt b/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt new file mode 100644 index 000000000..9486605c9 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt @@ -0,0 +1,158 @@ + + + + + + Review userplugin + + + + %WARNINGHIDER% %NATIVETSHIDER% %PRESENDHIDER% + + + +

Plugin info

+
+

%PLUGINNAME%

+

%PLUGINDESC%

+
+ +

Warnings

+
+

Uses a native.ts file

+

+ Use of this file allows the plugin to escape the browser sandbox + and potentially do anything to your system and data. + ONLY INSTALL THIS PLUGIN AFTER REVIEWING THE CODE AND BEING + 100% SURE THAT NOTHING BAD CAN BE DONE! +

+
+ Acknowledge warning (required to allow + install) +
+
+

Has pre-send listeners

+

+ This allows the plugin to edit your messages before they are + sent. +

+
+

+ Reminder: installing a userplugin can be a destructive action. Make + sure that you know and trust the developer before installing any. +

+
+ + +
+ + diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt b/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt new file mode 100644 index 000000000..5e4e6938e --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt @@ -0,0 +1,118 @@ + + + + + + + Git Path + + + + + +

Git path

+

+ If you're having issues downloading userplugins because Git isn't properly detected, you can manually set a Git + path + that'll be used instead of + simply looking in PATH. +
+ If you do not specify anything, Git will be called from the PATH variable. Do not set this setting unless you + have issues. +
+
+ On Linux, Flatpak still isn't supported. +

+ +
+ + + +
+ + + diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/style.css b/src/equicordplugins/userpluginInstaller.dev/misc/style.css new file mode 100644 index 000000000..098e37ea6 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/style.css @@ -0,0 +1,78 @@ +.vc-userplugininstaller-info-card { + padding: 15px 20px; + margin-bottom: 20px; +} + +.vc-userplugininstaller-install-desc { + margin-top: 5px; +} + +.vc-userplugininstaller-install-field, +.vc-userplugininstaller-button-container { + margin-top: 10px; +} + +.vc-userplugininstaller-install-button { + margin-left: auto; +} + +.vc-userplugininstaller-update-check-container { + margin-top: 10px; +} + +.vc-userplugininstaller-plugins-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 10px; + align-items: start; +} + +.vc-userplugininstaller-info-button { + height: 24px; + width: 24px; + padding: 0; + background: transparent; + color: var(--icon-secondary); + transition: background-color 0.2s ease; + + &:hover { + color: var(--interactive-hover); + } +} + +.vc-userplugininstaller-settings-button:hover { + color: var(--interactive-hover); +} + +.vc-userplugininstaller-plugin-footer { + margin-top: 10px; + display: flex; + flex-wrap: wrap; + gap: 5px; + + div { + flex-basis: 100%; + margin-top: 5px; + font-size: 0.9rem; + } +} + +.vc-userplugininstaller-outdated-list { + padding-left: 30px; + margin: 3px 0; + list-style-type: disc; +} + +.vc-userplugininstaller-delete-button { + height: 24px; + width: 24px; + padding: 0; + background: transparent; + margin-right: 8px; + color: var(--icon-muted); + transition: background-color .2s ease; + + &:hover { + color: var(--red-new-46) + } +} diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt b/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt new file mode 100644 index 000000000..573200223 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt @@ -0,0 +1,129 @@ + + + + + + Review userplugin + + + + +

Plugin info

+
+

%PLUGINNAME%

+

%PLUGINDESC%

+
+

Update info

+
+

%COMMITMESSAGE%

+
+

+ You may want to review the + source code that will be applied. +

+
+ +

+ Reminder: installing a userplugin can be a destructive action. Make + sure that you know and trust the developer before installing any. +

+
+ + +
+ + diff --git a/src/equicordplugins/userpluginInstaller.dev/native.ts b/src/equicordplugins/userpluginInstaller.dev/native.ts new file mode 100644 index 000000000..8ab7a1c6d --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/native.ts @@ -0,0 +1,473 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { NativeSettings } from "@main/settings"; +import { exec, spawn } from "child_process"; +import { BrowserWindow, dialog, shell, WebContentsView } from "electron"; +import { existsSync, readdirSync, readFileSync } from "fs"; +import { readdir, readFile, rm } from "fs/promises"; +import { basename, join } from "path"; + +// @ts-ignore fuck off +import pluginValidateContent from "./misc/pluginValidate.txt"; // i would use HTML but esbuild is being whiny +// @ts-ignore fuck off +import setGitPathContent from "./misc/setGitPath.txt"; +// @ts-ignore fuck off +import updateValidateContent from "./misc/updateValidate.txt"; // see above +import YAML from "./yaml.js"; + +const PLUGIN_META_REGEX = /export default definePlugin\((?:\s|\/(?:\/|\*).*)*{\s*(?:\s|\/(?:\/|\*).*)*name:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*,(?:\s|\/(?:\/|\*).*)*(?:\s|\/(?:\/|\*).*)*description:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*/; +// if edited, also edit in misc/constants.ts!!! +const CLONE_LINK_REGEX = /https:\/\/(?:((?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org))\/(?!user-attachments)((?:[a-zA-Z0-9]|-)+)\/((?:[a-zA-Z0-9]|-|\.)+)(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?/; + +const vencordPath = ["desktop", "equibop"].includes(basename(__dirname)) ? join(__dirname, "../") : __dirname; + +export async function rmPlugin(_, name: string): Promise { + // eslint-disable-next-line + return new Promise(async (resolve, reject) => { + const ups = await getUserplugins(); + const pl = ups.find(p => p.directory! === name); + if (!pl) return; + + const deleteReqDialog = await dialog.showMessageBox({ + title: "Uninstall plugin", + message: `Uninstall ${pl.name}`, + type: "error", + detail: `The uninstall of the userplugin ${pl.name} has been requested. Would you like to do so?\n\nIf you did not initiate this, press No.`, + buttons: ["No", "Yes"] + }); + + if (deleteReqDialog.response !== 1) return reject("User rejected"); + await rm(join(vencordPath, "../src/userplugins", name), { recursive: true }); + + await build(); + resolve("Done"); + }); +} + +export async function isUpdateAvailableForPlugin(_, name: string): Promise { + return new Promise(resolve => { + const pluginDir = join(vencordPath, "../src/userplugins", name); + const otherProc = exec("git fetch", { + cwd: pluginDir + }); + otherProc.once("close", () => { + async function doStuff() { + try { + const head = (await readFile(join(pluginDir, ".git/HEAD"), "utf8")).match(/^ref: (.+)/)![1]; + const remoteHead = (await readFile(join(pluginDir, ".git/refs/remotes/origin/HEAD"), "utf8")).match(/^ref: (.+)/)![1]; + const localCommit = await readFile(join(pluginDir, ".git", head), "utf8"); + const remoteCommit = await readFile(join(pluginDir, ".git", remoteHead), "utf8"); + + resolve(localCommit !== remoteCommit); + } + catch (e) { + resolve(false); + } + } + doStuff(); + }); + }); +} + +export function initPluginInstall(_, link: string, source: string, owner: string, repo: string): Promise { + // eslint-disable-next-line + return new Promise(async (resolve, reject) => { + const verifiedRegex = link.match(CLONE_LINK_REGEX)!; + const idpl = source === "plugins.nin0.dev" ? 1 : 0; + if (![4, 7].includes(verifiedRegex.length) || verifiedRegex[0] !== link || verifiedRegex[[1, 4][idpl]] !== source || verifiedRegex[[2, 5][idpl]] !== owner || verifiedRegex[[3, 6][idpl]] !== repo) return reject("Invalid link"); + + // Ask for clone + const cloneDialog = await dialog.showMessageBox({ + title: "Clone userplugin", + message: `You are about to clone a userplugin from ${source}.`, + type: "question", + detail: `The repository name is "${repo}" and it is owned by "${owner}".\nThe repository URL is ${link}\n\n(If you did not request this intentionally, choose Cancel)`, + buttons: ["Cancel", "Clone repository and continue install", "Open repository in browser"] + }); + switch (cloneDialog.response) { + case 0: { + return reject("Rejected by user"); + } + case 1: { + await cloneRepo(link, repo); + break; + } + case 2: { + await shell.openExternal(link); + return reject("silentStop"); + } + } + + // Get plugin meta + const meta = await getPluginMeta(join(vencordPath, "..", "src", "userplugins", repo)); + + // Review plugin + const win = new BrowserWindow({ + maximizable: false, + minimizable: false, + width: 560, + height: meta.usesNative || meta.usesPreSend ? 650 : 360, + resizable: false, + webPreferences: { + devTools: true + }, + title: "Review userplugin", + modal: true, + parent: BrowserWindow.getAllWindows()[0], + show: false, + autoHideMenuBar: true + }); + const reView /* haha got it */ = new WebContentsView({ + webPreferences: { + devTools: true, + nodeIntegration: true + } + }); + win.contentView.addChildView(reView); + win.loadURL(generateReviewPluginContent(meta)); + win.on("page-title-updated", async e => { + switch (win.webContents.getTitle() as "abortInstall" | "reviewCode" | "install") { + case "abortInstall": { + win.close(); + await rm(join(vencordPath, "..", "src", "userplugins", repo), { + recursive: true + }); + return reject("Rejected by user"); + } + case "install": { + win.close(); + try { + await build(); + } + catch (e) { + reject((e as Error).toString()); + } + resolve(JSON.stringify({ + name: meta.name, + native: meta.usesNative + })); + break; + } + } + }); + win.show(); + }); +} + +async function build(): Promise { + return new Promise((resolve, reject) => { + const proc = exec("pnpm build --dev", { + cwd: join(vencordPath, ".."), + shell: process.env.SHELL || process.env.ComSpec || "/bin/sh" + }); + proc.once("close", () => { + if (proc.exitCode !== 0) { + reject("Failed to build Vencord, try building from console"); + } + resolve("Success"); + }); + }); +} + +async function getPluginMeta(path: string, extra: object = {}): Promise<{ + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; + directory?: string; + remote: string; + supportChannelID?: string; +}> { + return new Promise((resolve, reject) => { + const files = readdirSync(path); + let fileToRead: "index.ts" | "index.tsx" | "index.js" | "index.jsx" | undefined; + files.forEach(f => { + if (f === "index.ts") fileToRead = "index.ts"; + if (f === "index.tsx") fileToRead = "index.tsx"; + if (f === "index.js") fileToRead = "index.js"; + if (f === "index.jsx") fileToRead = "index.jsx"; + }); + if (!fileToRead) reject("Invalid plugin"); + + const file = readFileSync(`${path}/${fileToRead}`, "utf8"); + let remoteURL; + try { + const remoteC = readFileSync(join(path, ".git/config"), "utf8"); + remoteURL = remoteC.match(/\[remote "origin"]\s+url = (https:\/\/(?:(?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org)\/(?!user-attachments)(?:[a-zA-Z0-9]|-)+\/(?:[a-zA-Z0-9]|-|\.)+(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?)\n/); + } catch { + remoteURL = null; + } + + let supportChannelID; + try { + const meta = readFileSync(join(path, "meta.yml"), "utf8"); + console.log(meta); + const parsed = YAML.load(meta); + if (parsed.thread && typeof parsed.thread === "string" && /^\d+$/.test(parsed.thread)) { + supportChannelID = parsed.thread; + } + } catch { + supportChannelID = null; + } + + const rawMeta = file.match(PLUGIN_META_REGEX); + resolve({ + name: rawMeta![1], + description: rawMeta![2], + usesPreSend: file.includes("PreSendListener") || file.includes("onBeforeMessage"), + usesNative: files.includes("native.ts") || files.includes("native.js"), + remote: remoteURL ? remoteURL[1] : "", + supportChannelID, + ...extra + }); + + }); +} + +async function cloneRepo(link: string, repo: string): Promise { + return new Promise((resolve, reject) => { + const proc = spawn("git", ["clone", link], { + cwd: join(vencordPath, "..", "src", "userplugins") + }); + proc.once("close", async () => { + if (proc.exitCode !== 0) { + if (!existsSync(join(vencordPath, "..", "src", "userplugins", repo))) + return reject("Failed to clone"); + const deleteReqDialog = await dialog.showMessageBox({ + title: "Error", + message: "Plugin already exists", + type: "error", + detail: `The plugin that you tried to clone already exists at ${join(vencordPath, "..", "src", "userplugins")}.\nWould you like to reclone it? Only do this if you want to reinstall or update the plugin.`, + buttons: ["No", "Yes"] + }); + if (deleteReqDialog.response !== 1) return reject("User rejected"); + await rm(join(vencordPath, "..", "src", "userplugins", repo), { + recursive: true + }); + await cloneRepo(link, repo); + } + resolve(); + }); + }); +} + +function generateReviewPluginContent(meta: { + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; +}): string { + const template = pluginValidateContent.replace("%PLUGINNAME%", meta.name.replaceAll("<", "<")).replace("%PLUGINDESC%", meta.description.replaceAll("<", "<")).replace("%WARNINGHIDER%", !meta.usesNative && !meta.usesPreSend ? "[data-useless=\"warning\"] { display: none !important; }" : "").replace("%NATIVETSHIDER%", meta.usesNative ? "" : "#native-ts-warning { display: none !important; }").replace("%PRESENDHIDER%", meta.usesPreSend ? "" : "#pre-send-warning { display: none !important; }"); + const buf = Buffer.from(template).toString("base64"); + return `data:text/html;base64,${buf}`; +} + +function generateUpdatePluginContent(meta: { + name: string; + description: string; + remote: string; + commit: string; +}): string { + const template = updateValidateContent.replace("%PLUGINNAME%", meta.name.replaceAll("<", "<")).replace("%PLUGINDESC%", meta.description.replaceAll("<", "<")).replace("%REMOTE%", meta.remote).replace("%COMMITMESSAGE%", meta.commit.replaceAll("\n", "
")); + const buf = Buffer.from(template).toString("base64"); + return `data:text/html;base64,${buf}`; +} + +export async function getUserplugins() { + const folderContents = await readdir(join(vencordPath, "..", "src", "userplugins"), { + withFileTypes: true + }); + const plugins = await Promise.allSettled( + folderContents + .filter(item => item.isDirectory()) + .map(item => ({ + path: join(item.parentPath, item.name), + directory: item.name + })) + .map(({ path, directory }) => getPluginMeta(path, { directory })) + ); + + return plugins + .filter(p => p.status === "fulfilled") + .map(p => p.value); +} + +export async function updatePlugin(_, directory: string) { + return new Promise((resolve, reject) => { + const pluginDir = join(vencordPath, "../src/userplugins", directory); + + async function doStuff() { + const pluginMeta = await getPluginMeta(pluginDir); + + const win = new BrowserWindow({ + maximizable: false, + minimizable: false, + width: 560, + height: 600, + resizable: false, + webPreferences: { + devTools: true + }, + title: "Review userplugin", + modal: true, + parent: BrowserWindow.getAllWindows()[0], + show: false, + autoHideMenuBar: true + }); + const reView /* haha got it */ = new WebContentsView({ + webPreferences: { + devTools: true, + nodeIntegration: true + } + }); + win.contentView.addChildView(reView); + + const commitProc = exec("git log origin/HEAD...HEAD --oneline --pretty=format:%an////////%h////////%H////////%s", { + cwd: pluginDir + }); + let rawOutput = ""; + commitProc.stdout?.on("data", d => { + rawOutput += String(d); + }); + commitProc.once("close", () => { + win.loadURL(generateUpdatePluginContent({ + name: pluginMeta.name, + description: pluginMeta.description, + remote: pluginMeta.remote, + commit: rawOutput.split("\n").map(line => line.split("////////")).map(([user, shortCommit, longCommit, message]) => `${user} (${shortCommit}) ~ ${message}`).join("\n") + })); + win.on("page-title-updated", async e => { + if (win.webContents.getTitle().startsWith("openLink:")) { + await shell.openExternal(win.webContents.getTitle().replace("openLink:", "")); + } + switch (win.webContents.getTitle() as "abortInstall" | "install") { + case "abortInstall": { + win.close(); + return reject("Rejected by user"); + } + case "install": { + win.close(); + try { + const otherProc = exec("git rebase origin/HEAD", { + cwd: pluginDir + }); + let errored = ""; + otherProc.stderr?.on("data", d => { if (String(d).includes("Success")) return; errored += String(d); }); + otherProc.once("close", () => { + if (errored) if (!errored.includes("Success")) return reject(`Failed to apply the update, chances are you have local changes that conflict with your remote. Git errors:\n\n${errored}`); + build().then(() => resolve(JSON.stringify({ + name: pluginMeta.name, + native: pluginMeta.usesNative + }))); + }); + } + catch (e) { + reject((e as Error).toString()); + } + break; + } + } + }); + }); + win.show(); + } + doStuff(); + }); +} + +export async function openGitPathModal(_: any) { + const gitPathSet: string | undefined = NativeSettings.store.plugins.UserpluginInstaller?.gitPath; + const win = new BrowserWindow({ + maximizable: false, + minimizable: false, + width: 560, + height: 400, + resizable: false, + webPreferences: { + devTools: true + }, + title: "Set Git path", + modal: true, + parent: BrowserWindow.getAllWindows()[0], + show: false, + autoHideMenuBar: true + }); + const reView = new WebContentsView({ + webPreferences: { + devTools: true, + nodeIntegration: true + } + }); + win.contentView.addChildView(reView); + win.loadURL(`data:text/html;base64,${Buffer.from(setGitPathContent).toString("base64")}`); + win.on("page-title-updated", async _ => { + const t = win.webContents.getTitle(); + if (t === "abort") win.close(); + if (t.startsWith("ok")) { + if (!NativeSettings.store.plugins.UserpluginInstaller) { + NativeSettings.store.plugins.UserpluginInstaller = { + gitPath: undefined + }; + } + if (t === "ok-") { + NativeSettings.store.plugins.UserpluginInstaller.gitPath = undefined; + } else { + const gitPath2 = t.split("-").toSpliced(0, 1).join("-"); + NativeSettings.store.plugins.UserpluginInstaller.gitPath = gitPath2; + } + win.close(); + } + if (t.startsWith("check")) { + try { + const gitProc = spawn(t === "check-" ? "git" : t.split("-").toSpliced(0, 1).join("-"), ["--version"]); + let rawOutput = ""; + gitProc.stdout?.on("data", d => { + rawOutput += String(d); + }); + gitProc.on("error", e => { + dialog.showMessageBox({ + title: "Error", + message: "Git error", + type: "error", + detail: `${e}\n\nDouble-check the path you entered.`, + buttons: ["OK"] + }); + }); + gitProc.once("close", () => { + if (gitProc.exitCode === 0) { + dialog.showMessageBox({ + title: "Success", + message: "Git works!", + type: "info", + detail: `Successfully called ${rawOutput.trim()}`, + buttons: ["OK"] + }); + } + }); + } catch(e) { + dialog.showMessageBox({ + title: "Error", + message: "Git error", + type: "error", + detail: `${e}\n\nDouble-check the path you entered.`, + buttons: ["OK"] + }); + } + } + }); + win.show(); + if (gitPathSet) { + win.webContents.executeJavaScript(`document.querySelector("input").value = ${JSON.stringify(gitPathSet)};`); + } + + console.log(YAML.load(` + name: test + items: + - a + - b + `)); +} diff --git a/src/equicordplugins/userpluginInstaller.dev/yaml.js b/src/equicordplugins/userpluginInstaller.dev/yaml.js new file mode 100644 index 000000000..6baea2a59 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/yaml.js @@ -0,0 +1,5175 @@ +/* eslint-disable */ +// This is from the https://github.com/connec/yaml-js library, licensed under the WTFPL License +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __require = /* @__PURE__ */ (x => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] +}) : x)(function(x) { + if (typeof require !== "undefined") return require.apply(this, arguments); + throw Error('Dynamic require of "' + x + '" is not supported'); +}); +var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (const key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/yaml-js/lib/events.js +var require_events = __commonJS({ + "node_modules/yaml-js/lib/events.js"(exports) { + (function() { + this.Event = class Event { + constructor(start_mark1, end_mark1) { + this.start_mark = start_mark1; + this.end_mark = end_mark1; + } + }; + this.NodeEvent = class NodeEvent extends this.Event { + constructor(anchor1, start_mark, end_mark) { + super(start_mark, end_mark); + this.anchor = anchor1; + } + }; + this.CollectionStartEvent = class CollectionStartEvent extends this.NodeEvent { + constructor(anchor, tag, implicit, start_mark, end_mark, flow_style) { + super(anchor, start_mark, end_mark); + this.tag = tag; + this.implicit = implicit; + this.flow_style = flow_style; + } + }; + this.CollectionEndEvent = class CollectionEndEvent extends this.Event { + }; + this.StreamStartEvent = class StreamStartEvent extends this.Event { + constructor(start_mark, end_mark, encoding) { + super(start_mark, end_mark); + this.encoding = encoding; + } + }; + this.StreamEndEvent = class StreamEndEvent extends this.Event { + }; + this.DocumentStartEvent = class DocumentStartEvent extends this.Event { + constructor(start_mark, end_mark, explicit, version, tags) { + super(start_mark, end_mark); + this.explicit = explicit; + this.version = version; + this.tags = tags; + } + }; + this.DocumentEndEvent = class DocumentEndEvent extends this.Event { + constructor(start_mark, end_mark, explicit) { + super(start_mark, end_mark); + this.explicit = explicit; + } + }; + this.AliasEvent = class AliasEvent extends this.NodeEvent { + }; + this.ScalarEvent = class ScalarEvent extends this.NodeEvent { + constructor(anchor, tag, implicit, value, start_mark, end_mark, style) { + super(anchor, start_mark, end_mark); + this.tag = tag; + this.implicit = implicit; + this.value = value; + this.style = style; + } + }; + this.SequenceStartEvent = class SequenceStartEvent extends this.CollectionStartEvent { + }; + this.SequenceEndEvent = class SequenceEndEvent extends this.CollectionEndEvent { + }; + this.MappingStartEvent = class MappingStartEvent extends this.CollectionStartEvent { + }; + this.MappingEndEvent = class MappingEndEvent extends this.CollectionEndEvent { + }; + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/errors.js +var require_errors = __commonJS({ + "node_modules/yaml-js/lib/errors.js"(exports) { + (function() { + var { indexOf } = []; + this.Mark = class Mark { + constructor(line, column, buffer, pointer) { + this.line = line; + this.column = column; + this.buffer = buffer; + this.pointer = pointer; + } + get_snippet(indent = 4, max_length = 75) { + var break_chars, end, head, ref, ref1, start, tail; + if (this.buffer == null) { + return null; + } + break_chars = "\0\r\n\x85\u2028\u2029"; + head = ""; + start = this.pointer; + while (start > 0 && (ref = this.buffer[start - 1], indexOf.call(break_chars, ref) < 0)) { + start--; + if (this.pointer - start > max_length / 2 - 1) { + head = " ... "; + start += 5; + break; + } + } + tail = ""; + end = this.pointer; + while (end < this.buffer.length && (ref1 = this.buffer[end], indexOf.call(break_chars, ref1) < 0)) { + end++; + if (end - this.pointer > max_length / 2 - 1) { + tail = " ... "; + end -= 5; + break; + } + } + return `${new Array(indent).join(" ")}${head}${this.buffer.slice(start, end)}${tail} +${new Array(indent + this.pointer - start + head.length).join(" ")}^`; + } + toString() { + var snippet, where; + snippet = this.get_snippet(); + where = ` on line ${this.line + 1}, column ${this.column + 1}`; + if (snippet) { + return where; + } else { + return `${where}: +${snippet}`; + } + } + }; + this.YAMLError = class YAMLError extends Error { + constructor(message) { + super(message); + Object.defineProperty(this, "stack", { + get: function() { + return this.toString() + "\n" + new Error().stack.split("\n").slice(1).join("\n"); + } + }); + } + toString() { + return this.message; + } + }; + this.MarkedYAMLError = class MarkedYAMLError extends this.YAMLError { + constructor(context, context_mark, problem, problem_mark, note) { + super(); + this.context = context; + this.context_mark = context_mark; + this.problem = problem; + this.problem_mark = problem_mark; + this.note = note; + } + toString() { + var lines; + lines = []; + if (this.context != null) { + lines.push(this.context); + } + if (this.context_mark != null && (this.problem == null || this.problem_mark == null || this.context_mark.line !== this.problem_mark.line || this.context_mark.column !== this.problem_mark.column)) { + lines.push(this.context_mark.toString()); + } + if (this.problem != null) { + lines.push(this.problem); + } + if (this.problem_mark != null) { + lines.push(this.problem_mark.toString()); + } + if (this.note != null) { + lines.push(this.note); + } + return lines.join("\n"); + } + }; + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/nodes.js +var require_nodes = __commonJS({ + "node_modules/yaml-js/lib/nodes.js"(exports) { + (function() { + var unique_id; + unique_id = 0; + this.Node = class Node { + constructor(tag1, value1, start_mark1, end_mark1) { + this.tag = tag1; + this.value = value1; + this.start_mark = start_mark1; + this.end_mark = end_mark1; + this.unique_id = `node_${unique_id++}`; + } + }; + this.ScalarNode = (function() { + class ScalarNode extends this.Node { + constructor(tag, value, start_mark, end_mark, style) { + super(tag, value, start_mark, end_mark); + this.style = style; + } + } + + ScalarNode.prototype.id = "scalar"; + return ScalarNode; + }).call(this); + this.CollectionNode = class CollectionNode extends this.Node { + constructor(tag, value, start_mark, end_mark, flow_style) { + super(tag, value, start_mark, end_mark); + this.flow_style = flow_style; + } + }; + this.SequenceNode = (function() { + class SequenceNode extends this.CollectionNode { + } + + SequenceNode.prototype.id = "sequence"; + return SequenceNode; + }).call(this); + this.MappingNode = (function() { + class MappingNode extends this.CollectionNode { + } + + MappingNode.prototype.id = "mapping"; + return MappingNode; + }).call(this); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/composer.js +var require_composer = __commonJS({ + "node_modules/yaml-js/lib/composer.js"(exports) { + (function() { + var MarkedYAMLError, events, nodes; + events = require_events(); + ({ MarkedYAMLError } = require_errors()); + nodes = require_nodes(); + this.ComposerError = class ComposerError extends MarkedYAMLError { + }; + this.Composer = (function() { + var ctor; + class Composer { + constructor() { + return ctor.apply(this, arguments); + } + /* + Initialise a `Composer` instance. + */ + initialise() { + return this.anchors = {}; + } + /* + Checks if a document can be composed from the event stream. + + So long as the event stream hasn't ended (no [StreamEndEvent]), another document can be composed. + + @return {Boolean} True if a document can be composed, false otherwise. + */ + check_node() { + if (this.check_event(events.StreamStartEvent)) { + this.get_event(); + } + return !this.check_event(events.StreamEndEvent); + } + /* + Compose a document from the remaining event stream. + + {Composer#check_node} must be called before calling this method. + + @return {Node} The next document in the stream. Returns `undefined` if the event stream has ended. + */ + get_node() { + if (!this.check_event(events.StreamEndEvent)) { + return this.compose_document(); + } + } + /* + Compose a single document from the entire event stream. + + @throw {ComposerError} if there's more than one document is in the stream. + + @return {Node} The single document in the stream. + */ + get_single_node() { + var document, event; + this.get_event(); + document = null; + if (!this.check_event(events.StreamEndEvent)) { + document = this.compose_document(); + } + if (!this.check_event(events.StreamEndEvent)) { + event = this.get_event(); + throw new exports.ComposerError("expected a single document in the stream", document.start_mark, "but found another document", event.start_mark); + } + this.get_event(); + return document; + } + /* + Compose a document node from the event stream. + + A 'document' node is any single {Node} subclass. {DocumentStart} and {DocumentEnd} events delimit + the events used for composition. + + @private + + @return {Node} The document node. + */ + compose_document() { + var node; + this.get_event(); + node = this.compose_node(); + this.get_event(); + this.anchors = {}; + return node; + } + /* + Compose a node from the event stream. + + Composes a {ScalarNode}, {SequenceNode}, or {MappingNode} from the event stream, depending on the + first event encountered ({ScalarEvent}, {SequenceStartEvent}, or {MappingStartEvent} + respectively). + + @private + + @param parent {Node} The parent of the new node. + @param index {Number} The index of the new node within the parent's children. + @throw {ComposerError} if an alias is encountered for an undefined anchor. + @throw {ComposerError} if a duplicate anchor is envountered. + @return {Node} The composed node. + */ + compose_node(parent, index) { + var anchor, event, node; + if (this.check_event(events.AliasEvent)) { + event = this.get_event(); + anchor = event.anchor; + if (!(anchor in this.anchors)) { + throw new exports.ComposerError(null, null, `found undefined alias ${anchor}`, event.start_mark); + } + return this.anchors[anchor]; + } + event = this.peek_event(); + anchor = event.anchor; + if (anchor !== null && anchor in this.anchors) { + throw new exports.ComposerError(`found duplicate anchor ${anchor}; first occurence`, this.anchors[anchor].start_mark, "second occurrence", event.start_mark); + } + this.descend_resolver(parent, index); + if (this.check_event(events.ScalarEvent)) { + node = this.compose_scalar_node(anchor); + } else if (this.check_event(events.SequenceStartEvent)) { + node = this.compose_sequence_node(anchor); + } else if (this.check_event(events.MappingStartEvent)) { + node = this.compose_mapping_node(anchor); + } + this.ascend_resolver(); + return node; + } + /* + Compose a {ScalarNode} from the event stream. + + @private + + @param anchor {String} The anchor name for the node (if any). + @return {ScalarNode} The node composed from a {ScalarEvent}. + */ + compose_scalar_node(anchor) { + var event, node, tag; + event = this.get_event(); + tag = event.tag; + if (tag === null || tag === "!") { + tag = this.resolve(nodes.ScalarNode, event.value, event.implicit); + } + node = new nodes.ScalarNode(tag, event.value, event.start_mark, event.end_mark, event.style); + if (anchor !== null) { + this.anchors[anchor] = node; + } + return node; + } + /* + Compose a {SequenceNode} from the event stream. + + The contents of the node are composed from events between a {SequenceStartEvent} and a + {SequenceEndEvent}. + + @private + + @param anchor {String} The anchor name for the node (if any). + @return {SequenceNode} The composed node. + */ + compose_sequence_node(anchor) { + var end_event, index, node, start_event, tag; + start_event = this.get_event(); + tag = start_event.tag; + if (tag === null || tag === "!") { + tag = this.resolve(nodes.SequenceNode, null, start_event.implicit); + } + node = new nodes.SequenceNode(tag, [], start_event.start_mark, null, start_event.flow_style); + if (anchor !== null) { + this.anchors[anchor] = node; + } + index = 0; + while (!this.check_event(events.SequenceEndEvent)) { + node.value.push(this.compose_node(node, index)); + index++; + } + end_event = this.get_event(); + node.end_mark = end_event.end_mark; + return node; + } + /* + Compose a {MappingNode} from the event stream. + + The contents of the node are composed from events between a {MappingStartEvent} and a + {MappingEndEvent}. + + @private + + @param anchor {String} The anchor name for the node (if any). + @return {MappingNode} The composed node. + */ + compose_mapping_node(anchor) { + var end_event, item_key, item_value, node, start_event, tag; + start_event = this.get_event(); + tag = start_event.tag; + if (tag === null || tag === "!") { + tag = this.resolve(nodes.MappingNode, null, start_event.implicit); + } + node = new nodes.MappingNode(tag, [], start_event.start_mark, null, start_event.flow_style); + if (anchor !== null) { + this.anchors[anchor] = node; + } + while (!this.check_event(events.MappingEndEvent)) { + item_key = this.compose_node(node); + item_value = this.compose_node(node, item_key); + node.value.push([item_key, item_value]); + } + end_event = this.get_event(); + node.end_mark = end_event.end_mark; + return node; + } + } + + ctor = Composer.prototype.initialise; + return Composer; + }).call(this); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/util.js +var require_util = __commonJS({ + "node_modules/yaml-js/lib/util.js"(exports) { + (function() { + var ref, ref1, ref2, hasProp = {}.hasOwnProperty; + this.StringStream = class StringStream { + constructor() { + this.string = ""; + } + write(chunk) { + return this.string += chunk; + } + }; + this.clone = obj => { + return Object.assign({}, obj); + }; + this.extend = function(destination, ...sources) { + var i, j, len, len1, name, ref3, source; + for (i = 0, len = sources.length; i < len; i++) { + source = sources[i]; + while (source !== Object.prototype) { + ref3 = Object.getOwnPropertyNames(source); + for (j = 0, len1 = ref3.length; j < len1; j++) { + name = ref3[j]; + if (destination[name] == null) { + destination[name] = source[name]; + } + } + source = Object.getPrototypeOf(source); + } + } + return destination; + }; + this.is_empty = function(obj) { + var key; + if (Array.isArray(obj) || typeof obj === "string") { + return obj.length === 0; + } + for (key in obj) { + if (!hasProp.call(obj, key)) continue; + return false; + } + return true; + }; + this.inspect = (ref = (ref1 = (ref2 = __require("util")) != null ? ref2.inspect : void 0) != null ? ref1 : global.inspect) != null ? ref : function(a) { + return `${a}`; + }; + this.pad_left = function(str, char, length) { + str = String(str); + if (str.length >= length) { + return str; + } else if (str.length + 1 === length) { + return `${char}${str}`; + } else { + return `${new Array(length - str.length + 1).join(char)}${str}`; + } + }; + this.to_hex = function(num) { + if (typeof num === "string") { + num = num.charCodeAt(0); + } + return num.toString(16); + }; + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/constructor.js +var require_constructor = __commonJS({ + "node_modules/yaml-js/lib/constructor.js"(exports) { + (function() { + var MarkedYAMLError, nodes, util, { indexOf } = []; + ({ MarkedYAMLError } = require_errors()); + nodes = require_nodes(); + util = require_util(); + this.ConstructorError = class ConstructorError extends MarkedYAMLError { + }; + this.BaseConstructor = (function() { + var ctor; + class BaseConstructor { + constructor() { + return ctor.apply(this, arguments); + } + /* + Add a constructor function for a specific tag. + + The constructor will be used to turn {Node Nodes} with the given tag into a Javascript object. + + @param tag {String} The tag for which the constructor should apply. + @param constructor {Function} A function that turns a {Node} with the given tag into a + Javascript object. + @return {Function} Returns the supplied `constructor`. + */ + static add_constructor(tag, constructor) { + if (!this.prototype.hasOwnProperty("yaml_constructors")) { + this.prototype.yaml_constructors = util.extend({}, this.prototype.yaml_constructors); + } + return this.prototype.yaml_constructors[tag] = constructor; + } + /* + Add a constructor function for a tag prefix. + + The constructor will be used to turn {Node Nodes} with the given tag prefix into a Javascript + object. + + @param tag_prefix {String} The tag prefix for which the constructor should apply. + @param multi_constructor {Function} A function that turns a {Node} with the given tag + prefix into a Javascript object. + @return {Function} Returns the supplied `multi_constructor`. + */ + static add_multi_constructor(tag_prefix, multi_constructor) { + if (!this.prototype.hasOwnProperty("yaml_multi_constructors")) { + this.prototype.yaml_multi_constructors = util.extend({}, this.prototype.yaml_multi_constructors); + } + return this.prototype.yaml_multi_constructors[tag_prefix] = multi_constructor; + } + /* + Initialise a new instance. + */ + initialise() { + this.constructed_objects = {}; + this.constructing_nodes = []; + return this.deferred_constructors = []; + } + /* + Checks if a document can be constructed from the representation stream. + + So long as the representation stream hasn't ended, another document can be constructed. + + @return {Boolean} True if a document can be constructed, false otherwise. + */ + check_data() { + return this.check_node(); + } + /* + Construct a document from the remaining representation stream. + + {Constructor#check_data} must be called before calling this method. + + @return {any} The next document in the stream. Returns `undefined` if the stream has ended. + */ + get_data() { + if (this.check_node()) { + return this.construct_document(this.get_node()); + } + } + /* + Construct a single document from the entire representation stream. + + @throw {ComposerError} if there's more than one document is in the stream. + + @return {Node} The single document in the stream. + */ + get_single_data() { + var node; + node = this.get_single_node(); + if (node != null) { + return this.construct_document(node); + } + return null; + } + /* + Construct a document node + + @private + */ + construct_document(node) { + var data; + data = this.construct_object(node); + while (!util.is_empty(this.deferred_constructors)) { + this.deferred_constructors.pop()(); + } + return data; + } + defer(f) { + return this.deferred_constructors.push(f); + } + construct_object(node) { + var constructor, object, ref, tag_prefix, tag_suffix; + if (node.unique_id in this.constructed_objects) { + return this.constructed_objects[node.unique_id]; + } + if (ref = node.unique_id, indexOf.call(this.constructing_nodes, ref) >= 0) { + throw new exports.ConstructorError(null, null, "found unconstructable recursive node", node.start_mark); + } + this.constructing_nodes.push(node.unique_id); + constructor = null; + tag_suffix = null; + if (node.tag in this.yaml_constructors) { + constructor = this.yaml_constructors[node.tag]; + } else { + for (tag_prefix in this.yaml_multi_constructors) { + if (node.tag.indexOf(tag_prefix === 0)) { + tag_suffix = node.tag.slice(tag_prefix.length); + constructor = this.yaml_multi_constructors[tag_prefix]; + break; + } + } + if (constructor == null) { + if (null in this.yaml_multi_constructors) { + tag_suffix = node.tag; + constructor = this.yaml_multi_constructors.null; + } else if (null in this.yaml_constructors) { + constructor = this.yaml_constructors.null; + } else if (node instanceof nodes.ScalarNode) { + constructor = this.construct_scalar; + } else if (node instanceof nodes.SequenceNode) { + constructor = this.construct_sequence; + } else if (node instanceof nodes.MappingNode) { + constructor = this.construct_mapping; + } + } + } + object = constructor.call(this, tag_suffix != null ? tag_suffix : node, node); + this.constructed_objects[node.unique_id] = object; + this.constructing_nodes.pop(); + return object; + } + construct_scalar(node) { + if (!(node instanceof nodes.ScalarNode)) { + throw new exports.ConstructorError(null, null, `expected a scalar node but found ${node.id}`, node.start_mark); + } + return node.value; + } + construct_sequence(node) { + var child, i, len, ref, results; + if (!(node instanceof nodes.SequenceNode)) { + throw new exports.ConstructorError(null, null, `expected a sequence node but found ${node.id}`, node.start_mark); + } + ref = node.value; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + child = ref[i]; + results.push(this.construct_object(child)); + } + return results; + } + construct_mapping(node) { + var i, key, key_node, len, mapping, ref, value, value_node; + if (!(node instanceof nodes.MappingNode)) { + throw new ConstructorError(null, null, `expected a mapping node but found ${node.id}`, node.start_mark); + } + mapping = {}; + ref = node.value; + for (i = 0, len = ref.length; i < len; i++) { + [key_node, value_node] = ref[i]; + key = this.construct_object(key_node); + if (typeof key === "object") { + throw new exports.ConstructorError("while constructing a mapping", node.start_mark, "found unhashable key", key_node.start_mark); + } + value = this.construct_object(value_node); + mapping[key] = value; + } + return mapping; + } + construct_pairs(node) { + var i, key, key_node, len, pairs, ref, value, value_node; + if (!(node instanceof nodes.MappingNode)) { + throw new exports.ConstructorError(null, null, `expected a mapping node but found ${node.id}`, node.start_mark); + } + pairs = []; + ref = node.value; + for (i = 0, len = ref.length; i < len; i++) { + [key_node, value_node] = ref[i]; + key = this.construct_object(key_node); + value = this.construct_object(value_node); + pairs.push([key, value]); + } + return pairs; + } + } + + BaseConstructor.prototype.yaml_constructors = {}; + BaseConstructor.prototype.yaml_multi_constructors = {}; + ctor = BaseConstructor.prototype.initialise; + return BaseConstructor; + }).call(this); + this.Constructor = (function() { + var BOOL_VALUES, TIMESTAMP_PARTS, TIMESTAMP_REGEX; + class Constructor extends this.BaseConstructor { + construct_scalar(node) { + var i, key_node, len, ref, value_node; + if (node instanceof nodes.MappingNode) { + ref = node.value; + for (i = 0, len = ref.length; i < len; i++) { + [key_node, value_node] = ref[i]; + if (key_node.tag === "tag:yaml.org,2002:value") { + return this.construct_scalar(value_node); + } + } + } + return super.construct_scalar(node); + } + flatten_mapping(node) { + var i, index, j, key_node, len, len1, merge, ref, submerge, subnode, value, value_node; + merge = []; + index = 0; + while (index < node.value.length) { + [key_node, value_node] = node.value[index]; + if (key_node.tag === "tag:yaml.org,2002:merge") { + node.value.splice(index, 1); + if (value_node instanceof nodes.MappingNode) { + this.flatten_mapping(value_node); + merge = merge.concat(value_node.value); + } else if (value_node instanceof nodes.SequenceNode) { + submerge = []; + ref = value_node.value; + for (i = 0, len = ref.length; i < len; i++) { + subnode = ref[i]; + if (!(subnode instanceof nodes.MappingNode)) { + throw new exports.ConstructorError("while constructing a mapping", node.start_mark, `expected a mapping for merging, but found ${subnode.id}`, subnode.start_mark); + } + this.flatten_mapping(subnode); + submerge.push(subnode.value); + } + submerge.reverse(); + for (j = 0, len1 = submerge.length; j < len1; j++) { + value = submerge[j]; + merge = merge.concat(value); + } + } else { + throw new exports.ConstructorError("while constructing a mapping", node.start_mark, `expected a mapping or list of mappings for merging but found ${value_node.id}`, value_node.start_mark); + } + } else if (key_node.tag === "tag:yaml.org,2002:value") { + key_node.tag = "tag:yaml.org,2002:str"; + index++; + } else { + index++; + } + } + if (merge.length) { + return node.value = merge.concat(node.value); + } + } + construct_mapping(node) { + if (node instanceof nodes.MappingNode) { + this.flatten_mapping(node); + } + return super.construct_mapping(node); + } + construct_yaml_null(node) { + this.construct_scalar(node); + return null; + } + construct_yaml_bool(node) { + var value; + value = this.construct_scalar(node); + return BOOL_VALUES[value.toLowerCase()]; + } + construct_yaml_int(node) { + var base, digit, digits, i, len, part, ref, sign, value; + value = this.construct_scalar(node); + value = value.replace(/_/g, ""); + sign = value[0] === "-" ? -1 : 1; + if (ref = value[0], indexOf.call("+-", ref) >= 0) { + value = value.slice(1); + } + if (value === "0") { + return 0; + } else if (value.indexOf("0b") === 0) { + return sign * parseInt(value.slice(2), 2); + } else if (value.indexOf("0x") === 0) { + return sign * parseInt(value.slice(2), 16); + } else if (value.indexOf("0o") === 0) { + return sign * parseInt(value.slice(2), 8); + } else if (value[0] === "0") { + return sign * parseInt(value, 8); + } else if (indexOf.call(value, ":") >= 0) { + digits = (function() { + var i2, len2, ref1, results; + ref1 = value.split(/:/g); + results = []; + for (i2 = 0, len2 = ref1.length; i2 < len2; i2++) { + part = ref1[i2]; + results.push(parseInt(part)); + } + return results; + })(); + digits.reverse(); + base = 1; + value = 0; + for (i = 0, len = digits.length; i < len; i++) { + digit = digits[i]; + value += digit * base; + base *= 60; + } + return sign * value; + } else { + return sign * parseInt(value); + } + } + construct_yaml_float(node) { + var base, digit, digits, i, len, part, ref, sign, value; + value = this.construct_scalar(node); + value = value.replace(/_/g, "").toLowerCase(); + sign = value[0] === "-" ? -1 : 1; + if (ref = value[0], indexOf.call("+-", ref) >= 0) { + value = value.slice(1); + } + if (value === ".inf") { + return sign * Infinity; + } else if (value === ".nan") { + return 0 / 0; + } else if (indexOf.call(value, ":") >= 0) { + digits = (function() { + var i2, len2, ref1, results; + ref1 = value.split(/:/g); + results = []; + for (i2 = 0, len2 = ref1.length; i2 < len2; i2++) { + part = ref1[i2]; + results.push(parseFloat(part)); + } + return results; + })(); + digits.reverse(); + base = 1; + value = 0; + for (i = 0, len = digits.length; i < len; i++) { + digit = digits[i]; + value += digit * base; + base *= 60; + } + return sign * value; + } else { + return sign * parseFloat(value); + } + } + construct_yaml_binary(node) { + var error, value; + value = this.construct_scalar(node); + try { + if (typeof window !== "undefined" && window !== null) { + return atob(value); + } + return new Buffer(value, "base64").toString("ascii"); + } catch (error1) { + error = error1; + throw new exports.ConstructorError(null, null, `failed to decode base64 data: ${error}`, node.start_mark); + } + } + construct_yaml_timestamp(node) { + var date, day, fraction, hour, index, key, match, millisecond, minute, month, second, tz_hour, tz_minute, tz_sign, value, values, year; + value = this.construct_scalar(node); + match = node.value.match(TIMESTAMP_REGEX); + values = {}; + for (key in TIMESTAMP_PARTS) { + index = TIMESTAMP_PARTS[key]; + values[key] = match[index]; + } + year = parseInt(values.year); + month = parseInt(values.month) - 1; + day = parseInt(values.day); + if (!values.hour) { + return new Date(Date.UTC(year, month, day)); + } + hour = parseInt(values.hour); + minute = parseInt(values.minute); + second = parseInt(values.second); + millisecond = 0; + if (values.fraction) { + fraction = values.fraction.slice(0, 6); + while (fraction.length < 6) { + fraction += "0"; + } + fraction = parseInt(fraction); + millisecond = Math.round(fraction / 1e3); + } + if (values.tz_sign) { + tz_sign = values.tz_sign === "-" ? 1 : -1; + if (tz_hour = parseInt(values.tz_hour)) { + hour += tz_sign * tz_hour; + } + if (tz_minute = parseInt(values.tz_minute)) { + minute += tz_sign * tz_minute; + } + } + date = new Date(Date.UTC(year, month, day, hour, minute, second, millisecond)); + return date; + } + construct_yaml_pair_list(type, node) { + var list; + list = []; + if (!(node instanceof nodes.SequenceNode)) { + throw new exports.ConstructorError(`while constructing ${type}`, node.start_mark, `expected a sequence but found ${node.id}`, node.start_mark); + } + this.defer(() => { + var i, key, key_node, len, ref, results, subnode, value, value_node; + ref = node.value; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + subnode = ref[i]; + if (!(subnode instanceof nodes.MappingNode)) { + throw new exports.ConstructorError(`while constructing ${type}`, node.start_mark, `expected a mapping of length 1 but found ${subnode.id}`, subnode.start_mark); + } + if (subnode.value.length !== 1) { + throw new exports.ConstructorError(`while constructing ${type}`, node.start_mark, `expected a mapping of length 1 but found ${subnode.id}`, subnode.start_mark); + } + [key_node, value_node] = subnode.value[0]; + key = this.construct_object(key_node); + value = this.construct_object(value_node); + results.push(list.push([key, value])); + } + return results; + }); + return list; + } + construct_yaml_omap(node) { + return this.construct_yaml_pair_list("an ordered map", node); + } + construct_yaml_pairs(node) { + return this.construct_yaml_pair_list("pairs", node); + } + construct_yaml_set(node) { + var data; + data = []; + this.defer(() => { + var item, results; + results = []; + for (item in this.construct_mapping(node)) { + results.push(data.push(item)); + } + return results; + }); + return data; + } + construct_yaml_str(node) { + return this.construct_scalar(node); + } + construct_yaml_seq(node) { + var data; + data = []; + this.defer(() => { + var i, item, len, ref, results; + ref = this.construct_sequence(node); + results = []; + for (i = 0, len = ref.length; i < len; i++) { + item = ref[i]; + results.push(data.push(item)); + } + return results; + }); + return data; + } + construct_yaml_map(node) { + var data; + data = {}; + this.defer(() => { + var key, ref, results, value; + ref = this.construct_mapping(node); + results = []; + for (key in ref) { + value = ref[key]; + results.push(data[key] = value); + } + return results; + }); + return data; + } + construct_yaml_object(node, klass) { + var data; + data = new klass(); + this.defer(() => { + var key, ref, results, value; + ref = this.construct_mapping(node, true); + results = []; + for (key in ref) { + value = ref[key]; + results.push(data[key] = value); + } + return results; + }); + return data; + } + construct_undefined(node) { + throw new exports.ConstructorError(null, null, `could not determine a constructor for the tag ${node.tag}`, node.start_mark); + } + } + + BOOL_VALUES = { + on: true, + off: false, + true: true, + false: false, + yes: true, + no: false + }; + TIMESTAMP_REGEX = /^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[\x20\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\.([0-9]*))?(?:[\x20\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$/; + TIMESTAMP_PARTS = { + year: 1, + month: 2, + day: 3, + hour: 4, + minute: 5, + second: 6, + fraction: 7, + tz: 8, + tz_sign: 9, + tz_hour: 10, + tz_minute: 11 + }; + return Constructor; + }).call(this); + this.Constructor.add_constructor("tag:yaml.org,2002:null", this.Constructor.prototype.construct_yaml_null); + this.Constructor.add_constructor("tag:yaml.org,2002:bool", this.Constructor.prototype.construct_yaml_bool); + this.Constructor.add_constructor("tag:yaml.org,2002:int", this.Constructor.prototype.construct_yaml_int); + this.Constructor.add_constructor("tag:yaml.org,2002:float", this.Constructor.prototype.construct_yaml_float); + this.Constructor.add_constructor("tag:yaml.org,2002:binary", this.Constructor.prototype.construct_yaml_binary); + this.Constructor.add_constructor("tag:yaml.org,2002:timestamp", this.Constructor.prototype.construct_yaml_timestamp); + this.Constructor.add_constructor("tag:yaml.org,2002:omap", this.Constructor.prototype.construct_yaml_omap); + this.Constructor.add_constructor("tag:yaml.org,2002:pairs", this.Constructor.prototype.construct_yaml_pairs); + this.Constructor.add_constructor("tag:yaml.org,2002:set", this.Constructor.prototype.construct_yaml_set); + this.Constructor.add_constructor("tag:yaml.org,2002:str", this.Constructor.prototype.construct_yaml_str); + this.Constructor.add_constructor("tag:yaml.org,2002:seq", this.Constructor.prototype.construct_yaml_seq); + this.Constructor.add_constructor("tag:yaml.org,2002:map", this.Constructor.prototype.construct_yaml_map); + this.Constructor.add_constructor(null, this.Constructor.prototype.construct_undefined); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/emitter.js +var require_emitter = __commonJS({ + "node_modules/yaml-js/lib/emitter.js"(exports) { + (function() { + var ScalarAnalysis, YAMLError, events, util, hasProp = {}.hasOwnProperty, { indexOf } = []; + events = require_events(); + util = require_util(); + ({ YAMLError } = require_errors()); + this.EmitterError = class EmitterError extends YAMLError { + }; + this.Emitter = (function() { + var C_WHITESPACE, DEFAULT_TAG_PREFIXES, ESCAPE_REPLACEMENTS, ctor; + class Emitter { + constructor() { + return ctor.apply(this, arguments); + } + initialise(stream, options) { + var ref; + this.stream = stream; + this.encoding = null; + this.states = []; + this.state = this.expect_stream_start; + this.events = []; + this.event = null; + this.indents = []; + this.indent = null; + this.flow_level = 0; + this.root_context = false; + this.sequence_context = false; + this.mapping_context = false; + this.simple_key_context = false; + this.line = 0; + this.column = 0; + this.whitespace = true; + this.indentation = true; + this.open_ended = false; + ({ canonical: this.canonical, allow_unicode: this.allow_unicode } = options); + if (this.canonical == null) { + this.canonical = false; + } + if (this.allow_unicode == null) { + this.allow_unicode = true; + } + this.best_indent = options.indent > 1 && options.indent < 10 ? options.indent : 2; + this.best_width = options.width > this.indent * 2 ? options.width : 80; + this.best_line_break = (ref = options.line_break) === "\r" || ref === "\n" || ref === "\r\n" ? options.line_break : "\n"; + this.tag_prefixes = null; + this.prepared_anchor = null; + this.prepared_tag = null; + this.analysis = null; + return this.style = null; + } + /* + Reset the state attributes (to clear self-references) + */ + dispose() { + this.states = []; + return this.state = null; + } + emit(event) { + var results; + this.events.push(event); + results = []; + while (!this.need_more_events()) { + this.event = this.events.shift(); + this.state(); + results.push(this.event = null); + } + return results; + } + /* + In some cases, we wait for a few next events before emitting. + */ + need_more_events() { + var event; + if (this.events.length === 0) { + return true; + } + event = this.events[0]; + if (event instanceof events.DocumentStartEvent) { + return this.need_events(1); + } else if (event instanceof events.SequenceStartEvent) { + return this.need_events(2); + } else if (event instanceof events.MappingStartEvent) { + return this.need_events(3); + } else { + return false; + } + } + need_events(count) { + var event, i, len, level, ref; + level = 0; + ref = this.events.slice(1); + for (i = 0, len = ref.length; i < len; i++) { + event = ref[i]; + if (event instanceof events.DocumentStartEvent || event instanceof events.CollectionStartEvent) { + level++; + } else if (event instanceof events.DocumentEndEvent || event instanceof events.CollectionEndEvent) { + level--; + } else if (event instanceof events.StreamEndEvent) { + level = -1; + } + if (level < 0) { + return false; + } + } + return this.events.length < count + 1; + } + increase_indent(options = {}) { + this.indents.push(this.indent); + if (this.indent == null) { + return this.indent = options.flow ? this.best_indent : 0; + } else if (!options.indentless) { + return this.indent += this.best_indent; + } + } + // Stream states + expect_stream_start() { + if (this.event instanceof events.StreamStartEvent) { + if (this.event.encoding && !("encoding" in this.stream)) { + this.encoding = this.event.encoding; + } + this.write_stream_start(); + return this.state = this.expect_first_document_start; + } else { + return this.error("expected StreamStartEvent, but got", this.event); + } + } + expect_nothing() { + return this.error("expected nothing, but got", this.event); + } + // Document states + expect_first_document_start() { + return this.expect_document_start(true); + } + expect_document_start(first = false) { + var explicit, handle, i, k, len, prefix, ref; + if (this.event instanceof events.DocumentStartEvent) { + if ((this.event.version || this.event.tags) && this.open_ended) { + this.write_indicator("...", true); + this.write_indent(); + } + if (this.event.version) { + this.write_version_directive(this.prepare_version(this.event.version)); + } + this.tag_prefixes = util.clone(DEFAULT_TAG_PREFIXES); + if (this.event.tags) { + ref = (function() { + var ref2, results; + ref2 = this.event.tags; + results = []; + for (k in ref2) { + if (!hasProp.call(ref2, k)) continue; + results.push(k); + } + return results; + }).call(this).sort(); + for (i = 0, len = ref.length; i < len; i++) { + handle = ref[i]; + prefix = this.event.tags[handle]; + this.tag_prefixes[prefix] = handle; + this.write_tag_directive(this.prepare_tag_handle(handle), this.prepare_tag_prefix(prefix)); + } + } + explicit = !first || this.event.explicit || this.canonical || this.event.version || this.event.tags || this.check_empty_document(); + if (explicit) { + this.write_indent(); + this.write_indicator("---", true); + if (this.canonical) { + this.write_indent(); + } + } + return this.state = this.expect_document_root; + } else if (this.event instanceof events.StreamEndEvent) { + if (this.open_ended) { + this.write_indicator("...", true); + this.write_indent(); + } + this.write_stream_end(); + return this.state = this.expect_nothing; + } else { + return this.error("expected DocumentStartEvent, but got", this.event); + } + } + expect_document_end() { + if (this.event instanceof events.DocumentEndEvent) { + this.write_indent(); + if (this.event.explicit) { + this.write_indicator("...", true); + this.write_indent(); + } + this.flush_stream(); + return this.state = this.expect_document_start; + } else { + return this.error("expected DocumentEndEvent, but got", this.event); + } + } + expect_document_root() { + this.states.push(this.expect_document_end); + return this.expect_node({ + root: true + }); + } + // Node states + expect_node(expect = {}) { + this.root_context = !!expect.root; + this.sequence_context = !!expect.sequence; + this.mapping_context = !!expect.mapping; + this.simple_key_context = !!expect.simple_key; + if (this.event instanceof events.AliasEvent) { + return this.expect_alias(); + } else if (this.event instanceof events.ScalarEvent || this.event instanceof events.CollectionStartEvent) { + this.process_anchor("&"); + this.process_tag(); + if (this.event instanceof events.ScalarEvent) { + return this.expect_scalar(); + } else if (this.event instanceof events.SequenceStartEvent) { + if (this.flow_level || this.canonical || this.event.flow_style || this.check_empty_sequence()) { + return this.expect_flow_sequence(); + } else { + return this.expect_block_sequence(); + } + } else if (this.event instanceof events.MappingStartEvent) { + if (this.flow_level || this.canonical || this.event.flow_style || this.check_empty_mapping()) { + return this.expect_flow_mapping(); + } else { + return this.expect_block_mapping(); + } + } + } else { + return this.error("expected NodeEvent, but got", this.event); + } + } + expect_alias() { + if (!this.event.anchor) { + this.error("anchor is not specified for alias"); + } + this.process_anchor("*"); + return this.state = this.states.pop(); + } + expect_scalar() { + this.increase_indent({ + flow: true + }); + this.process_scalar(); + this.indent = this.indents.pop(); + return this.state = this.states.pop(); + } + // Flow sequence states + expect_flow_sequence() { + this.write_indicator("[", true, { + whitespace: true + }); + this.flow_level++; + this.increase_indent({ + flow: true + }); + return this.state = this.expect_first_flow_sequence_item; + } + expect_first_flow_sequence_item() { + if (this.event instanceof events.SequenceEndEvent) { + this.indent = this.indents.pop(); + this.flow_level--; + this.write_indicator("]", false); + return this.state = this.states.pop(); + } else { + if (this.canonical || this.column > this.best_width) { + this.write_indent(); + } + this.states.push(this.expect_flow_sequence_item); + return this.expect_node({ + sequence: true + }); + } + } + expect_flow_sequence_item() { + if (this.event instanceof events.SequenceEndEvent) { + this.indent = this.indents.pop(); + this.flow_level--; + if (this.canonical) { + this.write_indicator(",", false); + this.write_indent(); + } + this.write_indicator("]", false); + return this.state = this.states.pop(); + } else { + this.write_indicator(",", false); + if (this.canonical || this.column > this.best_width) { + this.write_indent(); + } + this.states.push(this.expect_flow_sequence_item); + return this.expect_node({ + sequence: true + }); + } + } + // Flow mapping states + expect_flow_mapping() { + this.write_indicator("{", true, { + whitespace: true + }); + this.flow_level++; + this.increase_indent({ + flow: true + }); + return this.state = this.expect_first_flow_mapping_key; + } + expect_first_flow_mapping_key() { + if (this.event instanceof events.MappingEndEvent) { + this.indent = this.indents.pop(); + this.flow_level--; + this.write_indicator("}", false); + return this.state = this.states.pop(); + } else { + if (this.canonical || this.column > this.best_width) { + this.write_indent(); + } + if (!this.canonical && this.check_simple_key()) { + this.states.push(this.expect_flow_mapping_simple_value); + return this.expect_node({ + mapping: true, + simple_key: true + }); + } else { + this.write_indicator("?", true); + this.states.push(this.expect_flow_mapping_value); + return this.expect_node({ + mapping: true + }); + } + } + } + expect_flow_mapping_key() { + if (this.event instanceof events.MappingEndEvent) { + this.indent = this.indents.pop(); + this.flow_level--; + if (this.canonical) { + this.write_indicator(",", false); + this.write_indent(); + } + this.write_indicator("}", false); + return this.state = this.states.pop(); + } else { + this.write_indicator(",", false); + if (this.canonical || this.column > this.best_width) { + this.write_indent(); + } + if (!this.canonical && this.check_simple_key()) { + this.states.push(this.expect_flow_mapping_simple_value); + return this.expect_node({ + mapping: true, + simple_key: true + }); + } else { + this.write_indicator("?", true); + this.states.push(this.expect_flow_mapping_value); + return this.expect_node({ + mapping: true + }); + } + } + } + expect_flow_mapping_simple_value() { + this.write_indicator(":", false); + this.states.push(this.expect_flow_mapping_key); + return this.expect_node({ + mapping: true + }); + } + expect_flow_mapping_value() { + if (this.canonical || this.column > this.best_width) { + this.write_indent(); + } + this.write_indicator(":", true); + this.states.push(this.expect_flow_mapping_key); + return this.expect_node({ + mapping: true + }); + } + // Block sequence states + expect_block_sequence() { + var indentless; + indentless = this.mapping_context && !this.indentation; + this.increase_indent({ indentless }); + return this.state = this.expect_first_block_sequence_item; + } + expect_first_block_sequence_item() { + return this.expect_block_sequence_item(true); + } + expect_block_sequence_item(first = false) { + if (!first && this.event instanceof events.SequenceEndEvent) { + this.indent = this.indents.pop(); + return this.state = this.states.pop(); + } else { + this.write_indent(); + this.write_indicator("-", true, { + indentation: true + }); + this.states.push(this.expect_block_sequence_item); + return this.expect_node({ + sequence: true + }); + } + } + // Block mapping states + expect_block_mapping() { + this.increase_indent(); + return this.state = this.expect_first_block_mapping_key; + } + expect_first_block_mapping_key() { + return this.expect_block_mapping_key(true); + } + expect_block_mapping_key(first = false) { + if (!first && this.event instanceof events.MappingEndEvent) { + this.indent = this.indents.pop(); + return this.state = this.states.pop(); + } else { + this.write_indent(); + if (this.check_simple_key()) { + this.states.push(this.expect_block_mapping_simple_value); + return this.expect_node({ + mapping: true, + simple_key: true + }); + } else { + this.write_indicator("?", true, { + indentation: true + }); + this.states.push(this.expect_block_mapping_value); + return this.expect_node({ + mapping: true + }); + } + } + } + expect_block_mapping_simple_value() { + this.write_indicator(":", false); + this.states.push(this.expect_block_mapping_key); + return this.expect_node({ + mapping: true + }); + } + expect_block_mapping_value() { + this.write_indent(); + this.write_indicator(":", true, { + indentation: true + }); + this.states.push(this.expect_block_mapping_key); + return this.expect_node({ + mapping: true + }); + } + // Checkers + check_empty_document() { + var event; + if (!(this.event instanceof events.DocumentStartEvent) || this.events.length === 0) { + return false; + } + event = this.events[0]; + return event instanceof events.ScalarEvent && event.anchor == null && event.tag == null && event.implicit && event.value === ""; + } + check_empty_sequence() { + return this.event instanceof events.SequenceStartEvent && this.events[0] instanceof events.SequenceEndEvent; + } + check_empty_mapping() { + return this.event instanceof events.MappingStartEvent && this.events[0] instanceof events.MappingEndEvent; + } + check_simple_key() { + var length; + length = 0; + if (this.event instanceof events.NodeEvent && this.event.anchor != null) { + if (this.prepared_anchor == null) { + this.prepared_anchor = this.prepare_anchor(this.event.anchor); + } + length += this.prepared_anchor.length; + } + if (this.event.tag != null && (this.event instanceof events.ScalarEvent || this.event instanceof events.CollectionStartEvent)) { + if (this.prepared_tag == null) { + this.prepared_tag = this.prepare_tag(this.event.tag); + } + length += this.prepared_tag.length; + } + if (this.event instanceof events.ScalarEvent) { + if (this.analysis == null) { + this.analysis = this.analyze_scalar(this.event.value); + } + length += this.analysis.scalar.length; + } + return length < 128 && (this.event instanceof events.AliasEvent || this.event instanceof events.ScalarEvent && !this.analysis.empty && !this.analysis.multiline || this.check_empty_sequence() || this.check_empty_mapping()); + } + // Anchor, Tag and Scalar processors + process_anchor(indicator) { + if (this.event.anchor == null) { + this.prepared_anchor = null; + return; + } + if (this.prepared_anchor == null) { + this.prepared_anchor = this.prepare_anchor(this.event.anchor); + } + if (this.prepared_anchor) { + this.write_indicator(`${indicator}${this.prepared_anchor}`, true); + } + return this.prepared_anchor = null; + } + process_tag() { + var tag; + tag = this.event.tag; + if (this.event instanceof events.ScalarEvent) { + if (this.style == null) { + this.style = this.choose_scalar_style(); + } + if ((!this.canonical || tag == null) && (this.style === "" && this.event.implicit[0] || this.style !== "" && this.event.implicit[1])) { + this.prepared_tag = null; + return; + } + if (this.event.implicit[0] && tag == null) { + tag = "!"; + this.prepared_tag = null; + } + } else if ((!this.canonical || tag == null) && this.event.implicit) { + this.prepared_tag = null; + return; + } + if (tag == null) { + this.error("tag is not specified"); + } + if (this.prepared_tag == null) { + this.prepared_tag = this.prepare_tag(tag); + } + this.write_indicator(this.prepared_tag, true); + return this.prepared_tag = null; + } + process_scalar() { + var split; + if (this.analysis == null) { + this.analysis = this.analyze_scalar(this.event.value); + } + if (this.style == null) { + this.style = this.choose_scalar_style(); + } + split = !this.simple_key_context; + switch (this.style) { + case '"': + this.write_double_quoted(this.analysis.scalar, split); + break; + case "'": + this.write_single_quoted(this.analysis.scalar, split); + break; + case ">": + this.write_folded(this.analysis.scalar); + break; + case "|": + this.write_literal(this.analysis.scalar); + break; + default: + this.write_plain(this.analysis.scalar, split); + } + this.analysis = null; + return this.style = null; + } + choose_scalar_style() { + var ref; + if (this.analysis == null) { + this.analysis = this.analyze_scalar(this.event.value); + } + if (this.event.style === '"' || this.canonical) { + return '"'; + } + if (!this.event.style && this.event.implicit[0] && !(this.simple_key_context && (this.analysis.empty || this.analysis.multiline)) && (this.flow_level && this.analysis.allow_flow_plain || !this.flow_level && this.analysis.allow_block_plain)) { + return ""; + } + if (this.event.style && (ref = this.event.style, indexOf.call("|>", ref) >= 0) && !this.flow_level && !this.simple_key_context && this.analysis.allow_block) { + return this.event.style; + } + if ((!this.event.style || this.event.style === "'") && this.analysis.allow_single_quoted && !(this.simple_key_context && this.analysis.multiline)) { + return "'"; + } + return '"'; + } + // Analyzers + prepare_version([major, minor]) { + var version; + version = `${major}.${minor}`; + if (major === 1) { + return version; + } else { + return this.error("unsupported YAML version", version); + } + } + prepare_tag_handle(handle) { + var char, i, len, ref; + if (!handle) { + this.error("tag handle must not be empty"); + } + if (handle[0] !== "!" || handle.slice(-1) !== "!") { + this.error("tag handle must start and end with '!':", handle); + } + ref = handle.slice(1, -1); + for (i = 0, len = ref.length; i < len; i++) { + char = ref[i]; + if (!(char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0)) { + this.error(`invalid character '${char}' in the tag handle:`, handle); + } + } + return handle; + } + prepare_tag_prefix(prefix) { + var char, chunks, end, start; + if (!prefix) { + this.error("tag prefix must not be empty"); + } + chunks = []; + start = 0; + end = +(prefix[0] === "!"); + while (end < prefix.length) { + char = prefix[end]; + if (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-;/?!:@&=+$,_.~*'()[]", char) >= 0) { + end++; + } else { + if (start < end) { + chunks.push(prefix.slice(start, end)); + } + start = end += 1; + chunks.push(char); + } + } + if (start < end) { + chunks.push(prefix.slice(start, end)); + } + return chunks.join(""); + } + prepare_tag(tag) { + var char, chunks, end, handle, i, k, len, prefix, ref, start, suffix, suffix_text; + if (!tag) { + this.error("tag must not be empty"); + } + if (tag === "!") { + return tag; + } + handle = null; + suffix = tag; + ref = (function() { + var ref2, results; + ref2 = this.tag_prefixes; + results = []; + for (k in ref2) { + if (!hasProp.call(ref2, k)) continue; + results.push(k); + } + return results; + }).call(this).sort(); + for (i = 0, len = ref.length; i < len; i++) { + prefix = ref[i]; + if (tag.indexOf(prefix) === 0 && (prefix === "!" || prefix.length < tag.length)) { + handle = this.tag_prefixes[prefix]; + suffix = tag.slice(prefix.length); + } + } + chunks = []; + start = end = 0; + while (end < suffix.length) { + char = suffix[end]; + if (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-;/?!:@&=+$,_.~*'()[]", char) >= 0 || char === "!" && handle !== "!") { + end++; + } else { + if (start < end) { + chunks.push(suffix.slice(start, end)); + } + start = end += 1; + chunks.push(char); + } + } + if (start < end) { + chunks.push(suffix.slice(start, end)); + } + suffix_text = chunks.join(""); + if (handle) { + return `${handle}${suffix_text}`; + } else { + return `!<${suffix_text}>`; + } + } + prepare_anchor(anchor) { + var char, i, len; + if (!anchor) { + this.error("anchor must not be empty"); + } + for (i = 0, len = anchor.length; i < len; i++) { + char = anchor[i]; + if (!(char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0)) { + this.error(`invalid character '${char}' in the anchor:`, anchor); + } + } + return anchor; + } + analyze_scalar(scalar) { + var allow_block, allow_block_plain, allow_double_quoted, allow_flow_plain, allow_single_quoted, block_indicators, break_space, char, flow_indicators, followed_by_whitespace, i, index, leading_break, leading_space, len, line_breaks, preceded_by_whitespace, previous_break, previous_space, ref, ref1, space_break, special_characters, trailing_break, trailing_space, unicode_characters; + if (!scalar) { + new ScalarAnalysis(scalar, true, false, false, true, true, true, false); + } + block_indicators = false; + flow_indicators = false; + line_breaks = false; + special_characters = false; + unicode_characters = false; + leading_space = false; + leading_break = false; + trailing_space = false; + trailing_break = false; + break_space = false; + space_break = false; + if (scalar.indexOf("---") === 0 || scalar.indexOf("...") === 0) { + block_indicators = true; + flow_indicators = true; + } + preceded_by_whitespace = true; + followed_by_whitespace = scalar.length === 1 || (ref = scalar[1], indexOf.call("\0 \r\n\x85\u2028\u2029", ref) >= 0); + previous_space = false; + previous_break = false; + index = 0; + for (index = i = 0, len = scalar.length; i < len; index = ++i) { + char = scalar[index]; + if (index === 0) { + if (indexOf.call("#,[]{}&*!|>'\"%@`", char) >= 0 || char === "-" && followed_by_whitespace) { + flow_indicators = true; + block_indicators = true; + } else if (indexOf.call("?:", char) >= 0) { + flow_indicators = true; + if (followed_by_whitespace) { + block_indicators = true; + } + } + } else { + if (indexOf.call(",?[]{}", char) >= 0) { + flow_indicators = true; + } else if (char === ":") { + flow_indicators = true; + if (followed_by_whitespace) { + block_indicators = true; + } + } else if (char === "#" && preceded_by_whitespace) { + flow_indicators = true; + block_indicators = true; + } + } + if (indexOf.call("\n\x85\u2028\u2029", char) >= 0) { + line_breaks = true; + } + if (!(char === "\n" || char >= " " && char <= "~")) { + if (char !== "\uFEFF" && (char === "\x85" || char >= "\xA0" && char <= "\uD7FF" || char >= "\uE000" && char <= "\uFFFD")) { + unicode_characters = true; + if (!this.allow_unicode) { + special_characters = true; + } + } else { + special_characters = true; + } + } + if (char === " ") { + if (index === 0) { + leading_space = true; + } + if (index === scalar.length - 1) { + trailing_space = true; + } + if (previous_break) { + break_space = true; + } + previous_break = false; + previous_space = true; + } else if (indexOf.call("\n\x85\u2028\u2029", char) >= 0) { + if (index === 0) { + leading_break = true; + } + if (index === scalar.length - 1) { + trailing_break = true; + } + if (previous_space) { + space_break = true; + } + previous_break = true; + previous_space = false; + } else { + previous_break = false; + previous_space = false; + } + preceded_by_whitespace = indexOf.call(C_WHITESPACE, char) >= 0; + followed_by_whitespace = index + 2 >= scalar.length || (ref1 = scalar[index + 2], indexOf.call(C_WHITESPACE, ref1) >= 0); + } + allow_flow_plain = true; + allow_block_plain = true; + allow_single_quoted = true; + allow_double_quoted = true; + allow_block = true; + if (leading_space || leading_break || trailing_space || trailing_break) { + allow_flow_plain = allow_block_plain = false; + } + if (trailing_space) { + allow_block = false; + } + if (break_space) { + allow_flow_plain = allow_block_plain = allow_single_quoted = false; + } + if (space_break || special_characters) { + allow_flow_plain = allow_block_plain = allow_single_quoted = allow_block = false; + } + if (line_breaks) { + allow_flow_plain = allow_block_plain = false; + } + if (flow_indicators) { + allow_flow_plain = false; + } + if (block_indicators) { + allow_block_plain = false; + } + return new ScalarAnalysis(scalar, false, line_breaks, allow_flow_plain, allow_block_plain, allow_single_quoted, allow_double_quoted, allow_block); + } + // Writers + /* + Write BOM if needed. + */ + write_stream_start() { + if (this.encoding && this.encoding.indexOf("utf-16") === 0) { + return this.stream.write("\uFEFF", this.encoding); + } + } + write_stream_end() { + return this.flush_stream(); + } + write_indicator(indicator, need_whitespace, options = {}) { + var data; + data = this.whitespace || !need_whitespace ? indicator : " " + indicator; + this.whitespace = !!options.whitespace; + this.indentation && (this.indentation = !!options.indentation); + this.column += data.length; + this.open_ended = false; + return this.stream.write(data, this.encoding); + } + write_indent() { + var data, indent, ref; + indent = (ref = this.indent) != null ? ref : 0; + if (!this.indentation || this.column > indent || this.column === indent && !this.whitespace) { + this.write_line_break(); + } + if (this.column < indent) { + this.whitespace = true; + data = new Array(indent - this.column + 1).join(" "); + this.column = indent; + return this.stream.write(data, this.encoding); + } + } + write_line_break(data) { + this.whitespace = true; + this.indentation = true; + this.line += 1; + this.column = 0; + return this.stream.write(data != null ? data : this.best_line_break, this.encoding); + } + write_version_directive(version_text) { + this.stream.write(`%YAML ${version_text}`, this.encoding); + return this.write_line_break(); + } + write_tag_directive(handle_text, prefix_text) { + this.stream.write(`%TAG ${handle_text} ${prefix_text}`, this.encoding); + return this.write_line_break(); + } + write_single_quoted(text, split = true) { + var br, breaks, char, data, end, i, len, ref, spaces, start; + this.write_indicator("'", true); + spaces = false; + breaks = false; + start = end = 0; + while (end <= text.length) { + char = text[end]; + if (spaces) { + if (char == null || char !== " ") { + if (start + 1 === end && this.column > this.best_width && split && start !== 0 && end !== text.length) { + this.write_indent(); + } else { + data = text.slice(start, end); + this.column += data.length; + this.stream.write(data, this.encoding); + } + start = end; + } + } else if (breaks) { + if (char == null || indexOf.call("\n\x85\u2028\u2029", char) < 0) { + if (text[start] === "\n") { + this.write_line_break(); + } + ref = text.slice(start, end); + for (i = 0, len = ref.length; i < len; i++) { + br = ref[i]; + if (br === "\n") { + this.write_line_break(); + } else { + this.write_line_break(br); + } + } + this.write_indent(); + start = end; + } + } else if ((char == null || indexOf.call(" \n\x85\u2028\u2029", char) >= 0 || char === "'") && start < end) { + data = text.slice(start, end); + this.column += data.length; + this.stream.write(data, this.encoding); + start = end; + } + if (char === "'") { + this.column += 2; + this.stream.write("''", this.encoding); + start = end + 1; + } + if (char != null) { + spaces = char === " "; + breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; + } + end++; + } + return this.write_indicator("'", false); + } + write_double_quoted(text, split = true) { + var char, data, end, start; + this.write_indicator('"', true); + start = end = 0; + while (end <= text.length) { + char = text[end]; + if (char == null || indexOf.call('"\\\x85\u2028\u2029\uFEFF', char) >= 0 || !(char >= " " && char <= "~" || this.allow_unicode && (char >= "\xA0" && char <= "\uD7FF" || char >= "\uE000" && char <= "\uFFFD"))) { + if (start < end) { + data = text.slice(start, end); + this.column += data.length; + this.stream.write(data, this.encoding); + start = end; + } + if (char != null) { + data = char in ESCAPE_REPLACEMENTS ? "\\" + ESCAPE_REPLACEMENTS[char] : char <= "\xFF" ? `\\x${util.pad_left(util.to_hex(char), "0", 2)}` : char <= "\uFFFF" ? `\\u${util.pad_left(util.to_hex(char), "0", 4)}` : `\\U${util.pad_left(util.to_hex(char), "0", 16)}`; + this.column += data.length; + this.stream.write(data, this.encoding); + start = end + 1; + } + } + if (split && (end > 0 && end < text.length - 1) && (char === " " || start >= end) && this.column + (end - start) > this.best_width) { + data = `${text.slice(start, end)}\\`; + if (start < end) { + start = end; + } + this.column += data.length; + this.stream.write(data, this.encoding); + this.write_indent(); + this.whitespace = false; + this.indentation = false; + if (text[start] === " ") { + data = "\\"; + this.column += data.length; + this.stream.write(data, this.encoding); + } + } + end++; + } + return this.write_indicator('"', false); + } + write_folded(text) { + var br, breaks, char, data, end, hints, i, leading_space, len, ref, results, spaces, start; + hints = this.determine_block_hints(text); + this.write_indicator(`>${hints}`, true); + if (hints.slice(-1) === "+") { + this.open_ended = true; + } + this.write_line_break(); + leading_space = true; + breaks = true; + spaces = false; + start = end = 0; + results = []; + while (end <= text.length) { + char = text[end]; + if (breaks) { + if (char == null || indexOf.call("\n\x85\u2028\u2029", char) < 0) { + if (!leading_space && char != null && char !== " " && text[start] === "\n") { + this.write_line_break(); + } + leading_space = char === " "; + ref = text.slice(start, end); + for (i = 0, len = ref.length; i < len; i++) { + br = ref[i]; + if (br === "\n") { + this.write_line_break(); + } else { + this.write_line_break(br); + } + } + if (char != null) { + this.write_indent(); + } + start = end; + } + } else if (spaces) { + if (char !== " ") { + if (start + 1 === end && this.column > this.best_width) { + this.write_indent(); + } else { + data = text.slice(start, end); + this.column += data.length; + this.stream.write(data, this.encoding); + } + start = end; + } + } else if (char == null || indexOf.call(" \n\x85\u2028\u2029", char) >= 0) { + data = text.slice(start, end); + this.column += data.length; + this.stream.write(data, this.encoding); + if (char == null) { + this.write_line_break(); + } + start = end; + } + if (char != null) { + breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; + spaces = char === " "; + } + results.push(end++); + } + return results; + } + write_literal(text) { + var br, breaks, char, data, end, hints, i, len, ref, results, start; + hints = this.determine_block_hints(text); + this.write_indicator(`|${hints}`, true); + if (hints.slice(-1) === "+") { + this.open_ended = true; + } + this.write_line_break(); + breaks = true; + start = end = 0; + results = []; + while (end <= text.length) { + char = text[end]; + if (breaks) { + if (char == null || indexOf.call("\n\x85\u2028\u2029", char) < 0) { + ref = text.slice(start, end); + for (i = 0, len = ref.length; i < len; i++) { + br = ref[i]; + if (br === "\n") { + this.write_line_break(); + } else { + this.write_line_break(br); + } + } + if (char != null) { + this.write_indent(); + } + start = end; + } + } else { + if (char == null || indexOf.call("\n\x85\u2028\u2029", char) >= 0) { + data = text.slice(start, end); + this.stream.write(data, this.encoding); + if (char == null) { + this.write_line_break(); + } + start = end; + } + } + if (char != null) { + breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; + } + results.push(end++); + } + return results; + } + write_plain(text, split = true) { + var br, breaks, char, data, end, i, len, ref, results, spaces, start; + if (!text) { + return; + } + if (this.root_context) { + this.open_ended = true; + } + if (!this.whitespace) { + data = " "; + this.column += data.length; + this.stream.write(data, this.encoding); + } + this.whitespace = false; + this.indentation = false; + spaces = false; + breaks = false; + start = end = 0; + results = []; + while (end <= text.length) { + char = text[end]; + if (spaces) { + if (char !== " ") { + if (start + 1 === end && this.column > this.best_width && split) { + this.write_indent(); + this.whitespace = false; + this.indentation = false; + } else { + data = text.slice(start, end); + this.column += data.length; + this.stream.write(data, this.encoding); + } + start = end; + } + } else if (breaks) { + if (indexOf.call("\n\x85\u2028\u2029", char) < 0) { + if (text[start] === "\n") { + this.write_line_break(); + } + ref = text.slice(start, end); + for (i = 0, len = ref.length; i < len; i++) { + br = ref[i]; + if (br === "\n") { + this.write_line_break(); + } else { + this.write_line_break(br); + } + } + this.write_indent(); + this.whitespace = false; + this.indentation = false; + start = end; + } + } else { + if (char == null || indexOf.call(" \n\x85\u2028\u2029", char) >= 0) { + data = text.slice(start, end); + this.column += data.length; + this.stream.write(data, this.encoding); + start = end; + } + } + if (char != null) { + spaces = char === " "; + breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; + } + results.push(end++); + } + return results; + } + determine_block_hints(text) { + var first, hints, i, last, penultimate; + hints = ""; + first = text[0], i = text.length - 2, penultimate = text[i++], last = text[i++]; + if (indexOf.call(" \n\x85\u2028\u2029", first) >= 0) { + hints += this.best_indent; + } + if (indexOf.call("\n\x85\u2028\u2029", last) < 0) { + hints += "-"; + } else if (text.length === 1 || indexOf.call("\n\x85\u2028\u2029", penultimate) >= 0) { + hints += "+"; + } + return hints; + } + flush_stream() { + var base; + return typeof (base = this.stream).flush === "function" ? base.flush() : void 0; + } + /* + Helper for common error pattern. + */ + error(message, context) { + var ref, ref1; + if (context) { + context = (ref = context != null ? (ref1 = context.constructor) != null ? ref1.name : void 0 : void 0) != null ? ref : util.inspect(context); + } + throw new exports.EmitterError(`${message}${context ? ` ${context}` : ""}`); + } + } + + C_WHITESPACE = "\0 \r\n\x85\u2028\u2029"; + DEFAULT_TAG_PREFIXES = { + "!": "!", + "tag:yaml.org,2002:": "!!" + }; + ESCAPE_REPLACEMENTS = { + "\0": "0", + "\x07": "a", + "\b": "b", + " ": "t", + "\n": "n", + "\v": "v", + "\f": "f", + "\r": "r", + "\x1B": "e", + '"': '"', + "\\": "\\", + "\x85": "N", + "\xA0": "_", + "\u2028": "L", + "\u2029": "P" + }; + ctor = Emitter.prototype.initialise; + return Emitter; + }).call(this); + ScalarAnalysis = class ScalarAnalysis { + constructor(scalar1, empty, multiline, allow_flow_plain1, allow_block_plain1, allow_single_quoted1, allow_double_quoted1, allow_block1) { + this.scalar = scalar1; + this.empty = empty; + this.multiline = multiline; + this.allow_flow_plain = allow_flow_plain1; + this.allow_block_plain = allow_block_plain1; + this.allow_single_quoted = allow_single_quoted1; + this.allow_double_quoted = allow_double_quoted1; + this.allow_block = allow_block1; + } + }; + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/serializer.js +var require_serializer = __commonJS({ + "node_modules/yaml-js/lib/serializer.js"(exports) { + (function() { + var YAMLError, events, nodes, util; + events = require_events(); + nodes = require_nodes(); + util = require_util(); + ({ YAMLError } = require_errors()); + this.SerializerError = class SerializerError extends YAMLError { + }; + this.Serializer = (function() { + var ctor; + class Serializer { + constructor() { + return ctor.apply(this, arguments); + } + initialise({ + encoding, + explicit_start, + explicit_end, + version, + tags + } = {}) { + this.encoding = encoding; + this.explicit_start = explicit_start; + this.explicit_end = explicit_end; + this.version = version; + this.tags = tags; + this.serialized_nodes = {}; + this.anchors = {}; + this.last_anchor_id = 0; + return this.closed = null; + } + open() { + if (this.closed === null) { + this.emit(new events.StreamStartEvent(this.encoding)); + return this.closed = false; + } else if (this.closed) { + throw new SerializerError("serializer is closed"); + } else { + throw new SerializerError("serializer is already open"); + } + } + close() { + if (this.closed === null) { + throw new SerializerError("serializer is not opened"); + } else if (!this.closed) { + this.emit(new events.StreamEndEvent()); + return this.closed = true; + } + } + serialize(node) { + if (this.closed === null) { + throw new SerializerError("serializer is not opened"); + } else if (this.closed) { + throw new SerializerError("serializer is closed"); + } + if (node != null) { + this.emit(new events.DocumentStartEvent(void 0, void 0, this.explicit_start, this.version, this.tags)); + this.anchor_node(node); + this.serialize_node(node); + this.emit(new events.DocumentEndEvent(void 0, void 0, this.explicit_end)); + } + this.serialized_nodes = {}; + this.anchors = {}; + return this.last_anchor_id = 0; + } + anchor_node(node) { + var base, i, item, j, key, len, len1, name, ref, ref1, results, results1, value; + if (node.unique_id in this.anchors) { + return (base = this.anchors)[name = node.unique_id] != null ? base[name] : base[name] = this.generate_anchor(node); + } else { + this.anchors[node.unique_id] = null; + if (node instanceof nodes.SequenceNode) { + ref = node.value; + results = []; + for (i = 0, len = ref.length; i < len; i++) { + item = ref[i]; + results.push(this.anchor_node(item)); + } + return results; + } else if (node instanceof nodes.MappingNode) { + ref1 = node.value; + results1 = []; + for (j = 0, len1 = ref1.length; j < len1; j++) { + [key, value] = ref1[j]; + this.anchor_node(key); + results1.push(this.anchor_node(value)); + } + return results1; + } + } + } + generate_anchor(node) { + return `id${util.pad_left(++this.last_anchor_id, "0", 4)}`; + } + serialize_node(node, parent, index) { + var alias, default_tag, detected_tag, i, implicit, item, j, key, len, len1, ref, ref1, value; + alias = this.anchors[node.unique_id]; + if (node.unique_id in this.serialized_nodes) { + return this.emit(new events.AliasEvent(alias)); + } else { + this.serialized_nodes[node.unique_id] = true; + this.descend_resolver(parent, index); + if (node instanceof nodes.ScalarNode) { + detected_tag = this.resolve(nodes.ScalarNode, node.value, [true, false]); + default_tag = this.resolve(nodes.ScalarNode, node.value, [false, true]); + implicit = [node.tag === detected_tag, node.tag === default_tag]; + this.emit(new events.ScalarEvent(alias, node.tag, implicit, node.value, void 0, void 0, node.style)); + } else if (node instanceof nodes.SequenceNode) { + implicit = node.tag === this.resolve(nodes.SequenceNode, node.value, true); + this.emit(new events.SequenceStartEvent(alias, node.tag, implicit, void 0, void 0, node.flow_style)); + ref = node.value; + for (index = i = 0, len = ref.length; i < len; index = ++i) { + item = ref[index]; + this.serialize_node(item, node, index); + } + this.emit(new events.SequenceEndEvent()); + } else if (node instanceof nodes.MappingNode) { + implicit = node.tag === this.resolve(nodes.MappingNode, node.value, true); + this.emit(new events.MappingStartEvent(alias, node.tag, implicit, void 0, void 0, node.flow_style)); + ref1 = node.value; + for (j = 0, len1 = ref1.length; j < len1; j++) { + [key, value] = ref1[j]; + this.serialize_node(key, node, null); + this.serialize_node(value, node, key); + } + this.emit(new events.MappingEndEvent()); + } + return this.ascend_resolver(); + } + } + } + + ctor = Serializer.prototype.initialise; + return Serializer; + }).call(this); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/representer.js +var require_representer = __commonJS({ + "node_modules/yaml-js/lib/representer.js"(exports) { + (function() { + var YAMLError, nodes, hasProp = {}.hasOwnProperty; + nodes = require_nodes(); + ({ YAMLError } = require_errors()); + this.RepresenterError = class RepresenterError extends YAMLError { + }; + this.BaseRepresenter = (function() { + var ctor; + class BaseRepresenter { + constructor() { + return ctor.apply(this, arguments); + } + static add_representer(data_type, handler) { + if (!this.prototype.hasOwnProperty("yaml_representers_types")) { + this.prototype.yaml_representers_types = [].concat(this.prototype.yaml_representers_types); + } + if (!this.prototype.hasOwnProperty("yaml_representers_handlers")) { + this.prototype.yaml_representers_handlers = [].concat(this.prototype.yaml_representers_handlers); + } + this.prototype.yaml_representers_types.push(data_type); + return this.prototype.yaml_representers_handlers.push(handler); + } + static add_multi_representer(data_type, handler) { + if (!this.prototype.hasOwnProperty("yaml_multi_representers_types")) { + this.prototype.yaml_multi_representers_types = [].concat(this.prototype.yaml_multi_representers_types); + } + if (!this.prototype.hasOwnProperty("yaml_multi_representers_handlers")) { + this.prototype.yaml_multi_representers_handlers = [].concat(this.prototype.yaml_multi_representers_handlers); + } + this.prototype.yaml_multi_representers_types.push(data_type); + return this.prototype.yaml_multi_representers_handlers.push(handler); + } + initialise({ + default_style, + default_flow_style + } = {}) { + this.default_style = default_style; + this.default_flow_style = default_flow_style; + this.represented_objects = {}; + this.object_keeper = []; + return this.alias_key = null; + } + represent(data) { + var node; + node = this.represent_data(data); + this.serialize(node); + this.represented_objects = {}; + this.object_keeper = []; + return this.alias_key = null; + } + represent_data(data) { + var data_type, i, j, len, ref, representer, type; + if (this.ignore_aliases(data)) { + this.alias_key = null; + } else if ((i = this.object_keeper.indexOf(data)) !== -1) { + this.alias_key = i; + if (this.alias_key in this.represented_objects) { + return this.represented_objects[this.alias_key]; + } + } else { + this.alias_key = this.object_keeper.length; + this.object_keeper.push(data); + } + representer = null; + data_type = data === null ? "null" : typeof data; + if (data_type === "object") { + data_type = data.constructor; + } + if ((i = this.yaml_representers_types.lastIndexOf(data_type)) !== -1) { + representer = this.yaml_representers_handlers[i]; + } + if (representer == null) { + ref = this.yaml_multi_representers_types; + for (i = j = 0, len = ref.length; j < len; i = ++j) { + type = ref[i]; + if (!(data instanceof type)) { + continue; + } + representer = this.yaml_multi_representers_handlers[i]; + break; + } + } + if (representer == null) { + if ((i = this.yaml_multi_representers_types.lastIndexOf(void 0)) !== -1) { + representer = this.yaml_multi_representers_handlers[i]; + } else if ((i = this.yaml_representers_types.lastIndexOf(void 0)) !== -1) { + representer = this.yaml_representers_handlers[i]; + } + } + if (representer != null) { + return representer.call(this, data); + } else { + return new nodes.ScalarNode(null, `${data}`); + } + } + represent_scalar(tag, value, style = this.default_style) { + var node; + node = new nodes.ScalarNode(tag, value, null, null, style); + if (this.alias_key != null) { + this.represented_objects[this.alias_key] = node; + } + return node; + } + represent_sequence(tag, sequence, flow_style) { + var best_style, item, j, len, node, node_item, ref, value; + value = []; + node = new nodes.SequenceNode(tag, value, null, null, flow_style); + if (this.alias_key != null) { + this.represented_objects[this.alias_key] = node; + } + best_style = true; + for (j = 0, len = sequence.length; j < len; j++) { + item = sequence[j]; + node_item = this.represent_data(item); + if (!(node_item instanceof nodes.ScalarNode || node_item.style)) { + best_style = false; + } + value.push(node_item); + } + if (flow_style == null) { + node.flow_style = (ref = this.default_flow_style) != null ? ref : best_style; + } + return node; + } + represent_mapping(tag, mapping, flow_style) { + var best_style, item_key, item_value, node, node_key, node_value, ref, value; + value = []; + node = new nodes.MappingNode(tag, value, flow_style); + if (this.alias_key) { + this.represented_objects[this.alias_key] = node; + } + best_style = true; + for (item_key in mapping) { + if (!hasProp.call(mapping, item_key)) continue; + item_value = mapping[item_key]; + node_key = this.represent_data(item_key); + node_value = this.represent_data(item_value); + if (!(node_key instanceof nodes.ScalarNode || node_key.style)) { + best_style = false; + } + if (!(node_value instanceof nodes.ScalarNode || node_value.style)) { + best_style = false; + } + value.push([node_key, node_value]); + } + if (!flow_style) { + node.flow_style = (ref = this.default_flow_style) != null ? ref : best_style; + } + return node; + } + ignore_aliases(data) { + return false; + } + } + + BaseRepresenter.prototype.yaml_representers_types = []; + BaseRepresenter.prototype.yaml_representers_handlers = []; + BaseRepresenter.prototype.yaml_multi_representers_types = []; + BaseRepresenter.prototype.yaml_multi_representers_handlers = []; + ctor = BaseRepresenter.prototype.initialise; + return BaseRepresenter; + }).call(this); + this.Representer = class Representer extends this.BaseRepresenter { + represent_boolean(data) { + return this.represent_scalar("tag:yaml.org,2002:bool", data ? "true" : "false"); + } + represent_null(data) { + return this.represent_scalar("tag:yaml.org,2002:null", "null"); + } + represent_number(data) { + var tag, value; + tag = `tag:yaml.org,2002:${data % 1 === 0 ? "int" : "float"}`; + value = data !== data ? ".nan" : data === Infinity ? ".inf" : data === -Infinity ? "-.inf" : data.toString(); + return this.represent_scalar(tag, value); + } + represent_string(data) { + return this.represent_scalar("tag:yaml.org,2002:str", data); + } + represent_array(data) { + return this.represent_sequence("tag:yaml.org,2002:seq", data); + } + represent_date(data) { + return this.represent_scalar("tag:yaml.org,2002:timestamp", data.toISOString()); + } + represent_object(data) { + return this.represent_mapping("tag:yaml.org,2002:map", data); + } + represent_undefined(data) { + throw new exports.RepresenterError(`cannot represent an onbject: ${data}`); + } + ignore_aliases(data) { + var ref; + if (data == null) { + return true; + } + if ((ref = typeof data) === "boolean" || ref === "number" || ref === "string") { + return true; + } + return false; + } + }; + this.Representer.add_representer("boolean", this.Representer.prototype.represent_boolean); + this.Representer.add_representer("null", this.Representer.prototype.represent_null); + this.Representer.add_representer("number", this.Representer.prototype.represent_number); + this.Representer.add_representer("string", this.Representer.prototype.represent_string); + this.Representer.add_representer(Array, this.Representer.prototype.represent_array); + this.Representer.add_representer(Date, this.Representer.prototype.represent_date); + this.Representer.add_representer(Object, this.Representer.prototype.represent_object); + this.Representer.add_representer(null, this.Representer.prototype.represent_undefined); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/resolver.js +var require_resolver = __commonJS({ + "node_modules/yaml-js/lib/resolver.js"(exports) { + (function() { + var YAMLError, nodes, util, { indexOf } = []; + nodes = require_nodes(); + util = require_util(); + ({ YAMLError } = require_errors()); + this.ResolverError = class ResolverError extends YAMLError { + }; + this.BaseResolver = (function() { + var DEFAULT_MAPPING_TAG, DEFAULT_SCALAR_TAG, DEFAULT_SEQUENCE_TAG, ctor; + class BaseResolver { + constructor() { + return ctor.apply(this, arguments); + } + static add_implicit_resolver(tag, regexp, first = [null]) { + var base, char, i, len, results; + if (!this.prototype.hasOwnProperty("yaml_implicit_resolvers")) { + this.prototype.yaml_implicit_resolvers = util.extend({}, this.prototype.yaml_implicit_resolvers); + } + results = []; + for (i = 0, len = first.length; i < len; i++) { + char = first[i]; + results.push(((base = this.prototype.yaml_implicit_resolvers)[char] != null ? base[char] : base[char] = []).push([tag, regexp])); + } + return results; + } + initialise() { + this.resolver_exact_paths = []; + return this.resolver_prefix_paths = []; + } + descend_resolver(current_node, current_index) { + var depth, exact_paths, i, j, kind, len, len1, path, prefix_paths, ref, ref1; + if (util.is_empty(this.yaml_path_resolvers)) { + return; + } + exact_paths = {}; + prefix_paths = []; + if (current_node) { + depth = this.resolver_prefix_paths.length; + ref = this.resolver_prefix_paths.slice(-1)[0]; + for (i = 0, len = ref.length; i < len; i++) { + [path, kind] = ref[i]; + if (this.check_resolver_prefix(depth, path, kind, current_node, current_index)) { + if (path.length > depth) { + prefix_paths.push([path, kind]); + } else { + exact_paths[kind] = this.yaml_path_resolvers[path][kind]; + } + } + } + } else { + ref1 = this.yaml_path_resolvers; + for (j = 0, len1 = ref1.length; j < len1; j++) { + [path, kind] = ref1[j]; + if (!path) { + exact_paths[kind] = this.yaml_path_resolvers[path][kind]; + } else { + prefix_paths.push([path, kind]); + } + } + } + this.resolver_exact_paths.push(exact_paths); + return this.resolver_prefix_paths.push(prefix_paths); + } + ascend_resolver() { + if (util.is_empty(this.yaml_path_resolvers)) { + return; + } + this.resolver_exact_paths.pop(); + return this.resolver_prefix_paths.pop(); + } + check_resolver_prefix(depth, path, kind, current_node, current_index) { + var index_check, node_check; + [node_check, index_check] = path[depth - 1]; + if (typeof node_check === "string") { + if (current_node.tag !== node_check) { + return; + } + } else if (node_check !== null) { + if (!(current_node instanceof node_check)) { + return; + } + } + if (index_check === true && current_index !== null) { + return; + } + if ((index_check === false || index_check === null) && current_index === null) { + return; + } + if (typeof index_check === "string") { + if (!(current_index instanceof nodes.ScalarNode) && index_check === current_index.value) { + return; + } + } else if (typeof index_check === "number") { + if (index_check !== current_index) { + return; + } + } + return true; + } + resolve(kind, value, implicit) { + var empty, exact_paths, i, k, len, ref, ref1, ref2, regexp, resolvers, tag; + if (kind === nodes.ScalarNode && implicit[0]) { + if (value === "") { + resolvers = (ref = this.yaml_implicit_resolvers[""]) != null ? ref : []; + } else { + resolvers = (ref1 = this.yaml_implicit_resolvers[value[0]]) != null ? ref1 : []; + } + resolvers = resolvers.concat((ref2 = this.yaml_implicit_resolvers.null) != null ? ref2 : []); + for (i = 0, len = resolvers.length; i < len; i++) { + [tag, regexp] = resolvers[i]; + if (value.match(regexp)) { + return tag; + } + } + implicit = implicit[1]; + } + empty = true; + for (k in this.yaml_path_resolvers) { + if ({}[k] == null) { + empty = false; + } + } + if (!empty) { + exact_paths = this.resolver_exact_paths.slice(-1)[0]; + if (indexOf.call(exact_paths, kind) >= 0) { + return exact_paths[kind]; + } + if (indexOf.call(exact_paths, null) >= 0) { + return exact_paths.null; + } + } + if (kind === nodes.ScalarNode) { + return DEFAULT_SCALAR_TAG; + } + if (kind === nodes.SequenceNode) { + return DEFAULT_SEQUENCE_TAG; + } + if (kind === nodes.MappingNode) { + return DEFAULT_MAPPING_TAG; + } + } + } + + DEFAULT_SCALAR_TAG = "tag:yaml.org,2002:str"; + DEFAULT_SEQUENCE_TAG = "tag:yaml.org,2002:seq"; + DEFAULT_MAPPING_TAG = "tag:yaml.org,2002:map"; + BaseResolver.prototype.yaml_implicit_resolvers = {}; + BaseResolver.prototype.yaml_path_resolvers = {}; + ctor = BaseResolver.prototype.initialise; + return BaseResolver; + }).call(this); + this.Resolver = class Resolver extends this.BaseResolver { + }; + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:bool", /^(?:yes|Yes|YES|true|True|TRUE|on|On|ON|no|No|NO|false|False|FALSE|off|Off|OFF)$/, "yYnNtTfFoO"); + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:float", /^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)?|\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*|[-+]?\.(?:inf|Inf|INF)|\.(?:nan|NaN|NAN))$/, "-+0123456789."); + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:int", /^(?:[-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[0-9a-fA-F_]+|[-+]?0o[0-7_]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$/, "-+0123456789"); + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:merge", /^(?:<<)$/, "<"); + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:null", /^(?:~|null|Null|NULL|)$/, ["~", "n", "N", ""]); + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:timestamp", /^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?(?:[Tt]|[\x20\t]+)[0-9][0-9]?:[0-9][0-9]:[0-9][0-9](?:\.[0-9]*)?(?:[\x20\t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$/, "0123456789"); + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:value", /^(?:=)$/, "="); + this.Resolver.add_implicit_resolver("tag:yaml.org,2002:yaml", /^(?:!|&|\*)$/, "!&*"); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/dumper.js +var require_dumper = __commonJS({ + "node_modules/yaml-js/lib/dumper.js"(exports) { + (function() { + var emitter, representer, resolver, serializer, util; + util = require_util(); + emitter = require_emitter(); + serializer = require_serializer(); + representer = require_representer(); + resolver = require_resolver(); + this.make_dumper = function(Emitter = emitter.Emitter, Serializer = serializer.Serializer, Representer = representer.Representer, Resolver = resolver.Resolver) { + var Dumper, components; + components = [Emitter, Serializer, Representer, Resolver]; + return Dumper = (function() { + var component; + class Dumper2 { + constructor(stream, options = {}) { + var i, len, ref; + components[0].prototype.initialise.call(this, stream, options); + ref = components.slice(1); + for (i = 0, len = ref.length; i < len; i++) { + component = ref[i]; + component.prototype.initialise.call(this, options); + } + } + } + + util.extend(Dumper2.prototype, ...(function() { + var i, len, results; + results = []; + for (i = 0, len = components.length; i < len; i++) { + component = components[i]; + results.push(component.prototype); + } + return results; + })()); + return Dumper2; + }).call(this); + }; + this.Dumper = this.make_dumper(); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/reader.js +var require_reader = __commonJS({ + "node_modules/yaml-js/lib/reader.js"(exports) { + (function() { + var Mark, YAMLError, { indexOf } = []; + ({ Mark, YAMLError } = require_errors()); + this.ReaderError = class ReaderError extends YAMLError { + constructor(position1, character1, reason) { + super(); + this.position = position1; + this.character = character1; + this.reason = reason; + } + toString() { + return `unacceptable character #${this.character.charCodeAt(0).toString(16)}: ${this.reason} + position ${this.position}`; + } + }; + this.Reader = (function() { + var NON_PRINTABLE, ctor; + class Reader { + constructor() { + return ctor.apply(this, arguments); + } + initialise(string) { + this.string = string; + this.line = 0; + this.column = 0; + this.index = 0; + this.check_printable(); + return this.string += "\0"; + } + peek(index = 0) { + return this.string[this.index + index]; + } + prefix(length = 1) { + return this.string.slice(this.index, this.index + length); + } + forward(length = 1) { + var char, results; + results = []; + while (length) { + char = this.string[this.index]; + this.index++; + if (indexOf.call("\n\x85\u2082\u2029", char) >= 0 || char === "\r" && this.string[this.index] !== "\n") { + this.line++; + this.column = 0; + } else { + this.column++; + } + results.push(length--); + } + return results; + } + get_mark() { + return new Mark(this.line, this.column, this.string, this.index); + } + check_printable() { + var character, match, position; + match = NON_PRINTABLE.exec(this.string); + if (match) { + character = match[0]; + position = this.string.length - this.index + match.index; + throw new exports.ReaderError(position, character, "special characters are not allowed"); + } + } + } + + NON_PRINTABLE = /[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uFFFD]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; + ctor = Reader.prototype.initialise; + return Reader; + }).call(this); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/tokens.js +var require_tokens = __commonJS({ + "node_modules/yaml-js/lib/tokens.js"(exports) { + (function() { + this.Token = class Token { + constructor(start_mark1, end_mark1) { + this.start_mark = start_mark1; + this.end_mark = end_mark1; + } + }; + this.DirectiveToken = (function() { + class DirectiveToken extends this.Token { + constructor(name, value, start_mark, end_mark) { + super(start_mark, end_mark); + this.name = name; + this.value = value; + } + } + + DirectiveToken.prototype.id = ""; + return DirectiveToken; + }).call(this); + this.DocumentStartToken = (function() { + class DocumentStartToken extends this.Token { + } + + DocumentStartToken.prototype.id = ""; + return DocumentStartToken; + }).call(this); + this.DocumentEndToken = (function() { + class DocumentEndToken extends this.Token { + } + + DocumentEndToken.prototype.id = ""; + return DocumentEndToken; + }).call(this); + this.StreamStartToken = (function() { + class StreamStartToken extends this.Token { + constructor(start_mark, end_mark, encoding) { + super(start_mark, end_mark); + this.encoding = encoding; + } + } + + StreamStartToken.prototype.id = ""; + return StreamStartToken; + }).call(this); + this.StreamEndToken = (function() { + class StreamEndToken extends this.Token { + } + + StreamEndToken.prototype.id = ""; + return StreamEndToken; + }).call(this); + this.BlockSequenceStartToken = (function() { + class BlockSequenceStartToken extends this.Token { + } + + BlockSequenceStartToken.prototype.id = ""; + return BlockSequenceStartToken; + }).call(this); + this.BlockMappingStartToken = (function() { + class BlockMappingStartToken extends this.Token { + } + + BlockMappingStartToken.prototype.id = ""; + return BlockMappingStartToken; + }).call(this); + this.BlockEndToken = (function() { + class BlockEndToken extends this.Token { + } + + BlockEndToken.prototype.id = ""; + return BlockEndToken; + }).call(this); + this.FlowSequenceStartToken = (function() { + class FlowSequenceStartToken extends this.Token { + } + + FlowSequenceStartToken.prototype.id = "["; + return FlowSequenceStartToken; + }).call(this); + this.FlowMappingStartToken = (function() { + class FlowMappingStartToken extends this.Token { + } + + FlowMappingStartToken.prototype.id = "{"; + return FlowMappingStartToken; + }).call(this); + this.FlowSequenceEndToken = (function() { + class FlowSequenceEndToken extends this.Token { + } + + FlowSequenceEndToken.prototype.id = "]"; + return FlowSequenceEndToken; + }).call(this); + this.FlowMappingEndToken = (function() { + class FlowMappingEndToken extends this.Token { + } + + FlowMappingEndToken.prototype.id = "}"; + return FlowMappingEndToken; + }).call(this); + this.KeyToken = (function() { + class KeyToken extends this.Token { + } + + KeyToken.prototype.id = "?"; + return KeyToken; + }).call(this); + this.ValueToken = (function() { + class ValueToken extends this.Token { + } + + ValueToken.prototype.id = ":"; + return ValueToken; + }).call(this); + this.BlockEntryToken = (function() { + class BlockEntryToken extends this.Token { + } + + BlockEntryToken.prototype.id = "-"; + return BlockEntryToken; + }).call(this); + this.FlowEntryToken = (function() { + class FlowEntryToken extends this.Token { + } + + FlowEntryToken.prototype.id = ","; + return FlowEntryToken; + }).call(this); + this.AliasToken = (function() { + class AliasToken extends this.Token { + constructor(value, start_mark, end_mark) { + super(start_mark, end_mark); + this.value = value; + } + } + + AliasToken.prototype.id = ""; + return AliasToken; + }).call(this); + this.AnchorToken = (function() { + class AnchorToken extends this.Token { + constructor(value, start_mark, end_mark) { + super(start_mark, end_mark); + this.value = value; + } + } + + AnchorToken.prototype.id = ""; + return AnchorToken; + }).call(this); + this.TagToken = (function() { + class TagToken extends this.Token { + constructor(value, start_mark, end_mark) { + super(start_mark, end_mark); + this.value = value; + } + } + + TagToken.prototype.id = ""; + return TagToken; + }).call(this); + this.ScalarToken = (function() { + class ScalarToken extends this.Token { + constructor(value, plain, start_mark, end_mark, style) { + super(start_mark, end_mark); + this.value = value; + this.plain = plain; + this.style = style; + } + } + + ScalarToken.prototype.id = ""; + return ScalarToken; + }).call(this); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/scanner.js +var require_scanner = __commonJS({ + "node_modules/yaml-js/lib/scanner.js"(exports) { + (function() { + var MarkedYAMLError, SimpleKey, tokens, util, hasProp = {}.hasOwnProperty, { indexOf } = []; + ({ MarkedYAMLError } = require_errors()); + tokens = require_tokens(); + util = require_util(); + this.ScannerError = class ScannerError extends MarkedYAMLError { + }; + SimpleKey = class SimpleKey { + constructor(token_number1, required1, index, line, column1, mark1) { + this.token_number = token_number1; + this.required = required1; + this.index = index; + this.line = line; + this.column = column1; + this.mark = mark1; + } + }; + this.Scanner = (function() { + var C_LB, C_NUMBERS, C_WS, ESCAPE_CODES, ESCAPE_REPLACEMENTS, ctor; + class Scanner { + constructor() { + return ctor.apply(this, arguments); + } + /* + Initialise the Scanner + */ + initialise() { + this.done = false; + this.flow_level = 0; + this.tokens = []; + this.fetch_stream_start(); + this.tokens_taken = 0; + this.indent = -1; + this.indents = []; + this.allow_simple_key = true; + return this.possible_simple_keys = {}; + } + // API methods. + /* + Check if the next token is one of the given types. + */ + check_token(...choices) { + var choice, i, len; + while (this.need_more_tokens()) { + this.fetch_more_tokens(); + } + if (this.tokens.length !== 0) { + if (choices.length === 0) { + return true; + } + for (i = 0, len = choices.length; i < len; i++) { + choice = choices[i]; + if (this.tokens[0] instanceof choice) { + return true; + } + } + } + return false; + } + /* + Return the next token, but do not delete it from the queue. + */ + peek_token() { + while (this.need_more_tokens()) { + this.fetch_more_tokens(); + } + if (this.tokens.length !== 0) { + return this.tokens[0]; + } + } + /* + Return the next token, and remove it from the queue. + */ + get_token() { + while (this.need_more_tokens()) { + this.fetch_more_tokens(); + } + if (this.tokens.length !== 0) { + this.tokens_taken++; + return this.tokens.shift(); + } + } + // Non-API methods. + need_more_tokens() { + if (this.done) { + return false; + } + if (this.tokens.length === 0) { + return true; + } + this.stale_possible_simple_keys(); + if (this.next_possible_simple_key() === this.tokens_taken) { + return true; + } + return false; + } + fetch_more_tokens() { + var char; + this.scan_to_next_token(); + this.stale_possible_simple_keys(); + this.unwind_indent(this.column); + char = this.peek(); + if (char === "\0") { + return this.fetch_stream_end(); + } + if (char === "%" && this.check_directive()) { + return this.fetch_directive(); + } + if (char === "-" && this.check_document_start()) { + return this.fetch_document_start(); + } + if (char === "." && this.check_document_end()) { + return this.fetch_document_end(); + } + if (char === "[") { + return this.fetch_flow_sequence_start(); + } + if (char === "{") { + return this.fetch_flow_mapping_start(); + } + if (char === "]") { + return this.fetch_flow_sequence_end(); + } + if (char === "}") { + return this.fetch_flow_mapping_end(); + } + if (char === ",") { + return this.fetch_flow_entry(); + } + if (char === "-" && this.check_block_entry()) { + return this.fetch_block_entry(); + } + if (char === "?" && this.check_key()) { + return this.fetch_key(); + } + if (char === ":" && this.check_value()) { + return this.fetch_value(); + } + if (char === "*") { + return this.fetch_alias(); + } + if (char === "&") { + return this.fetch_anchor(); + } + if (char === "!") { + return this.fetch_tag(); + } + if (char === "|" && this.flow_level === 0) { + return this.fetch_literal(); + } + if (char === ">" && this.flow_level === 0) { + return this.fetch_folded(); + } + if (char === "'") { + return this.fetch_single(); + } + if (char === '"') { + return this.fetch_double(); + } + if (this.check_plain()) { + return this.fetch_plain(); + } + throw new exports.ScannerError("while scanning for the next token", null, `found character ${char} that cannot start any token`, this.get_mark()); + } + // Simple keys treatment. + /* + Return the number of the nearest possible simple key. + */ + next_possible_simple_key() { + var key, level, min_token_number, ref; + min_token_number = null; + ref = this.possible_simple_keys; + for (level in ref) { + if (!hasProp.call(ref, level)) continue; + key = ref[level]; + if (min_token_number === null || key.token_number < min_token_number) { + min_token_number = key.token_number; + } + } + return min_token_number; + } + /* + Remove entries that are no longer possible simple keys. According to the + YAML spec, simple keys: + should be limited to a single line + should be no longer than 1024 characters + Disabling this procedure will allow simple keys of any length and height + (may cause problems if indentation is broken though). + */ + stale_possible_simple_keys() { + var key, level, ref, results; + ref = this.possible_simple_keys; + results = []; + for (level in ref) { + if (!hasProp.call(ref, level)) continue; + key = ref[level]; + if (key.line === this.line && this.index - key.index <= 1024) { + continue; + } + if (!key.required) { + results.push(delete this.possible_simple_keys[level]); + } else { + throw new exports.ScannerError("while scanning a simple key", key.mark, "could not find expected ':'", this.get_mark()); + } + } + return results; + } + /* + The next token may start a simple key. We check if it's possible and save + its position. This function is called for ALIAS, ANCHOR, TAG, + SCALAR (flow),'[' and '{'. + */ + save_possible_simple_key() { + var required, token_number; + required = this.flow_level === 0 && this.indent === this.column; + if (required && !this.allow_simple_key) { + throw new Error("logic failure"); + } + if (!this.allow_simple_key) { + return; + } + this.remove_possible_simple_key(); + token_number = this.tokens_taken + this.tokens.length; + return this.possible_simple_keys[this.flow_level] = new SimpleKey(token_number, required, this.index, this.line, this.column, this.get_mark()); + } + /* + Remove the saved possible simple key at the current flow level. + */ + remove_possible_simple_key() { + var key; + if (!(key = this.possible_simple_keys[this.flow_level])) { + return; + } + if (!key.required) { + return delete this.possible_simple_keys[this.flow_level]; + } else { + throw new exports.ScannerError("while scanning a simple key", key.mark, "could not find expected ':'", this.get_mark()); + } + } + // Indentation functions + /* + In flow context, tokens should respect indentation. + Actually the condition should be `self.indent >= column` according to + the spec. But this condition will prohibit intuitively correct + constructions such as + key : { + } + */ + unwind_indent(column) { + var mark, results; + if (this.flow_level !== 0) { + return; + } + results = []; + while (this.indent > column) { + mark = this.get_mark(); + this.indent = this.indents.pop(); + results.push(this.tokens.push(new tokens.BlockEndToken(mark, mark))); + } + return results; + } + /* + Check if we need to increase indentation. + */ + add_indent(column) { + if (!(column > this.indent)) { + return false; + } + this.indents.push(this.indent); + this.indent = column; + return true; + } + // Fetchers. + fetch_stream_start() { + var mark; + mark = this.get_mark(); + return this.tokens.push(new tokens.StreamStartToken(mark, mark, this.encoding)); + } + fetch_stream_end() { + var mark; + this.unwind_indent(-1); + this.remove_possible_simple_key(); + this.allow_possible_simple_key = false; + this.possible_simple_keys = {}; + mark = this.get_mark(); + this.tokens.push(new tokens.StreamEndToken(mark, mark)); + return this.done = true; + } + fetch_directive() { + this.unwind_indent(-1); + this.remove_possible_simple_key(); + this.allow_simple_key = false; + return this.tokens.push(this.scan_directive()); + } + fetch_document_start() { + return this.fetch_document_indicator(tokens.DocumentStartToken); + } + fetch_document_end() { + return this.fetch_document_indicator(tokens.DocumentEndToken); + } + fetch_document_indicator(TokenClass) { + var start_mark; + this.unwind_indent(-1); + this.remove_possible_simple_key(); + this.allow_simple_key = false; + start_mark = this.get_mark(); + this.forward(3); + return this.tokens.push(new TokenClass(start_mark, this.get_mark())); + } + fetch_flow_sequence_start() { + return this.fetch_flow_collection_start(tokens.FlowSequenceStartToken); + } + fetch_flow_mapping_start() { + return this.fetch_flow_collection_start(tokens.FlowMappingStartToken); + } + fetch_flow_collection_start(TokenClass) { + var start_mark; + this.save_possible_simple_key(); + this.flow_level++; + this.allow_simple_key = true; + start_mark = this.get_mark(); + this.forward(); + return this.tokens.push(new TokenClass(start_mark, this.get_mark())); + } + fetch_flow_sequence_end() { + return this.fetch_flow_collection_end(tokens.FlowSequenceEndToken); + } + fetch_flow_mapping_end() { + return this.fetch_flow_collection_end(tokens.FlowMappingEndToken); + } + fetch_flow_collection_end(TokenClass) { + var start_mark; + this.remove_possible_simple_key(); + this.flow_level--; + this.allow_simple_key = false; + start_mark = this.get_mark(); + this.forward(); + return this.tokens.push(new TokenClass(start_mark, this.get_mark())); + } + fetch_flow_entry() { + var start_mark; + this.allow_simple_key = true; + this.remove_possible_simple_key(); + start_mark = this.get_mark(); + this.forward(); + return this.tokens.push(new tokens.FlowEntryToken(start_mark, this.get_mark())); + } + fetch_block_entry() { + var mark, start_mark; + if (this.flow_level === 0) { + if (!this.allow_simple_key) { + throw new exports.ScannerError(null, null, "sequence entries are not allowed here", this.get_mark()); + } + if (this.add_indent(this.column)) { + mark = this.get_mark(); + this.tokens.push(new tokens.BlockSequenceStartToken(mark, mark)); + } + } + this.allow_simple_key = true; + this.remove_possible_simple_key(); + start_mark = this.get_mark(); + this.forward(); + return this.tokens.push(new tokens.BlockEntryToken(start_mark, this.get_mark())); + } + fetch_key() { + var mark, start_mark; + if (this.flow_level === 0) { + if (!this.allow_simple_key) { + throw new exports.ScannerError(null, null, "mapping keys are not allowed here", this.get_mark()); + } + if (this.add_indent(this.column)) { + mark = this.get_mark(); + this.tokens.push(new tokens.BlockMappingStartToken(mark, mark)); + } + } + this.allow_simple_key = !this.flow_level; + this.remove_possible_simple_key(); + start_mark = this.get_mark(); + this.forward(); + return this.tokens.push(new tokens.KeyToken(start_mark, this.get_mark())); + } + fetch_value() { + var key, mark, start_mark; + if (key = this.possible_simple_keys[this.flow_level]) { + delete this.possible_simple_keys[this.flow_level]; + this.tokens.splice(key.token_number - this.tokens_taken, 0, new tokens.KeyToken(key.mark, key.mark)); + if (this.flow_level === 0) { + if (this.add_indent(key.column)) { + this.tokens.splice(key.token_number - this.tokens_taken, 0, new tokens.BlockMappingStartToken(key.mark, key.mark)); + } + } + this.allow_simple_key = false; + } else { + if (this.flow_level === 0) { + if (!this.allow_simple_key) { + throw new exports.ScannerError(null, null, "mapping values are not allowed here", this.get_mark()); + } + if (this.add_indent(this.column)) { + mark = this.get_mark(); + this.tokens.push(new tokens.BlockMappingStartToken(mark, mark)); + } + } + this.allow_simple_key = !this.flow_level; + this.remove_possible_simple_key(); + } + start_mark = this.get_mark(); + this.forward(); + return this.tokens.push(new tokens.ValueToken(start_mark, this.get_mark())); + } + fetch_alias() { + this.save_possible_simple_key(); + this.allow_simple_key = false; + return this.tokens.push(this.scan_anchor(tokens.AliasToken)); + } + fetch_anchor() { + this.save_possible_simple_key(); + this.allow_simple_key = false; + return this.tokens.push(this.scan_anchor(tokens.AnchorToken)); + } + fetch_tag() { + this.save_possible_simple_key(); + this.allow_simple_key = false; + return this.tokens.push(this.scan_tag()); + } + fetch_literal() { + return this.fetch_block_scalar("|"); + } + fetch_folded() { + return this.fetch_block_scalar(">"); + } + fetch_block_scalar(style) { + this.allow_simple_key = true; + this.remove_possible_simple_key(); + return this.tokens.push(this.scan_block_scalar(style)); + } + fetch_single() { + return this.fetch_flow_scalar("'"); + } + fetch_double() { + return this.fetch_flow_scalar('"'); + } + fetch_flow_scalar(style) { + this.save_possible_simple_key(); + this.allow_simple_key = false; + return this.tokens.push(this.scan_flow_scalar(style)); + } + fetch_plain() { + this.save_possible_simple_key(); + this.allow_simple_key = false; + return this.tokens.push(this.scan_plain()); + } + // Checkers. + /* + DIRECTIVE: ^ '%' + */ + check_directive() { + if (this.column === 0) { + return true; + } + return false; + } + /* + DOCUMENT-START: ^ '---' (' '|'\n') + */ + check_document_start() { + var ref; + if (this.column === 0 && this.prefix(3) === "---" && (ref = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref) >= 0)) { + return true; + } + return false; + } + /* + DOCUMENT-END: ^ '...' (' '|'\n') + */ + check_document_end() { + var ref; + if (this.column === 0 && this.prefix(3) === "..." && (ref = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref) >= 0)) { + return true; + } + return false; + } + /* + BLOCK-ENTRY: '-' (' '|'\n') + */ + check_block_entry() { + var ref; + return ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0; + } + /* + KEY (flow context): '?' + KEY (block context): '?' (' '|'\n') + */ + check_key() { + var ref; + if (this.flow_level !== 0) { + return true; + } + return ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0; + } + /* + VALUE (flow context): ':' + VALUE (block context): ':' (' '|'\n') + */ + check_value() { + var ref; + if (this.flow_level !== 0) { + return true; + } + return ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0; + } + /* + A plain scalar may start with any non-space character except: + '-', '?', ':', ',', '[', ']', '{', '}', + '#', '&', '*', '!', '|', '>', '\'', '"', + '%', '@', '`'. + + It may also start with + '-', '?', ':' + if it is followed by a non-space character. + + Note that we limit the last rule to the block context (except the '-' + character) because we want the flow context to be space independent. + */ + check_plain() { + var char, ref; + char = this.peek(); + return indexOf.call(C_LB + C_WS + "\0-?:,[]{}#&*!|>'\"%@`", char) < 0 || (ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) < 0) && (char === "-" || this.flow_level === 0 && indexOf.call("?:", char) >= 0); + } + // Scanners. + /* + We ignore spaces, line breaks and comments. + If we find a line break in the block context, we set the flag + `allow_simple_key` on. + The byte order mark is stripped if it's the first character in the stream. + We do not yet support BOM inside the stream as the specification requires. + Any such mark will be considered as a part of the document. + + TODO: We need to make tab handling rules more sane. A good rule is + Tabs cannot precede tokens BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, + BLOCK-END, KEY (block context), VALUE (block context), BLOCK-ENTRY + So the tab checking code is + @allow_simple_key = off if + We also need to add the check for `allow_simple_key is on` to + `unwind_indent` before issuing BLOCK-END. Scanners for block, flow and + plain scalars need to be modified. + */ + scan_to_next_token() { + var found, ref, results; + if (this.index === 0 && this.peek() === "\uFEFF") { + this.forward(); + } + found = false; + results = []; + while (!found) { + while (this.peek() === " ") { + this.forward(); + } + if (this.peek() === "#") { + while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { + this.forward(); + } + } + if (this.scan_line_break()) { + if (this.flow_level === 0) { + results.push(this.allow_simple_key = true); + } else { + results.push(void 0); + } + } else { + results.push(found = true); + } + } + return results; + } + /* + See the specification for details. + */ + scan_directive() { + var end_mark, name, ref, start_mark, value; + start_mark = this.get_mark(); + this.forward(); + name = this.scan_directive_name(start_mark); + value = null; + if (name === "YAML") { + value = this.scan_yaml_directive_value(start_mark); + end_mark = this.get_mark(); + } else if (name === "TAG") { + value = this.scan_tag_directive_value(start_mark); + end_mark = this.get_mark(); + } else { + end_mark = this.get_mark(); + while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { + this.forward(); + } + } + this.scan_directive_ignored_line(start_mark); + return new tokens.DirectiveToken(name, value, start_mark, end_mark); + } + /* + See the specification for details. + */ + scan_directive_name(start_mark) { + var char, length, value; + length = 0; + char = this.peek(length); + while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0) { + length++; + char = this.peek(length); + } + if (length === 0) { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected alphanumeric or numeric character but found ${char}`, this.get_mark()); + } + value = this.prefix(length); + this.forward(length); + char = this.peek(); + if (indexOf.call(C_LB + "\0 ", char) < 0) { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected alphanumeric or numeric character but found ${char}`, this.get_mark()); + } + return value; + } + /* + See the specification for details. + */ + scan_yaml_directive_value(start_mark) { + var major, minor, ref; + while (this.peek() === " ") { + this.forward(); + } + major = this.scan_yaml_directive_number(start_mark); + if (this.peek() !== ".") { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected a digit or '.' but found ${this.peek()}`, this.get_mark()); + } + this.forward(); + minor = this.scan_yaml_directive_number(start_mark); + if (ref = this.peek(), indexOf.call(C_LB + "\0 ", ref) < 0) { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected a digit or ' ' but found ${this.peek()}`, this.get_mark()); + } + return [major, minor]; + } + /* + See the specification for details. + */ + scan_yaml_directive_number(start_mark) { + var char, length, ref, value; + char = this.peek(); + if (!(char >= "0" && char <= "9")) { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected a digit but found ${char}`, this.get_mark()); + } + length = 0; + while ((ref = this.peek(length)) >= "0" && ref <= "9") { + length++; + } + value = parseInt(this.prefix(length)); + this.forward(length); + return value; + } + /* + See the specification for details. + */ + scan_tag_directive_value(start_mark) { + var handle, prefix; + while (this.peek() === " ") { + this.forward(); + } + handle = this.scan_tag_directive_handle(start_mark); + while (this.peek() === " ") { + this.forward(); + } + prefix = this.scan_tag_directive_prefix(start_mark); + return [handle, prefix]; + } + /* + See the specification for details. + */ + scan_tag_directive_handle(start_mark) { + var char, value; + value = this.scan_tag_handle("directive", start_mark); + char = this.peek(); + if (char !== " ") { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected ' ' but found ${char}`, this.get_mark()); + } + return value; + } + /* + See the specification for details. + */ + scan_tag_directive_prefix(start_mark) { + var char, value; + value = this.scan_tag_uri("directive", start_mark); + char = this.peek(); + if (indexOf.call(C_LB + "\0 ", char) < 0) { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected ' ' but found ${char}`, this.get_mark()); + } + return value; + } + /* + See the specification for details. + */ + scan_directive_ignored_line(start_mark) { + var char, ref; + while (this.peek() === " ") { + this.forward(); + } + if (this.peek() === "#") { + while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { + this.forward(); + } + } + char = this.peek(); + if (indexOf.call(C_LB + "\0", char) < 0) { + throw new exports.ScannerError("while scanning a directive", start_mark, `expected a comment or a line break but found ${char}`, this.get_mark()); + } + return this.scan_line_break(); + } + /* + The specification does not restrict characters for anchors and aliases. + This may lead to problems, for instance, the document: + [ *alias, value ] + can be interpteted in two ways, as + [ "value" ] + and + [ *alias , "value" ] + Therefore we restrict aliases to numbers and ASCII letters. + */ + scan_anchor(TokenClass) { + var char, indicator, length, name, start_mark, value; + start_mark = this.get_mark(); + indicator = this.peek(); + if (indicator === "*") { + name = "alias"; + } else { + name = "anchor"; + } + this.forward(); + length = 0; + char = this.peek(length); + while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0) { + length++; + char = this.peek(length); + } + if (length === 0) { + throw new exports.ScannerError(`while scanning an ${name}`, start_mark, `expected alphabetic or numeric character but found '${char}'`, this.get_mark()); + } + value = this.prefix(length); + this.forward(length); + char = this.peek(); + if (indexOf.call(C_LB + C_WS + "\0?:,]}%@`", char) < 0) { + throw new exports.ScannerError(`while scanning an ${name}`, start_mark, `expected alphabetic or numeric character but found '${char}'`, this.get_mark()); + } + return new TokenClass(value, start_mark, this.get_mark()); + } + /* + See the specification for details. + */ + scan_tag() { + var char, handle, length, start_mark, suffix, use_handle; + start_mark = this.get_mark(); + char = this.peek(1); + if (char === "<") { + handle = null; + this.forward(2); + suffix = this.scan_tag_uri("tag", start_mark); + if (this.peek() !== ">") { + throw new exports.ScannerError("while parsing a tag", start_mark, `expected '>' but found ${this.peek()}`, this.get_mark()); + } + this.forward(); + } else if (indexOf.call(C_LB + C_WS + "\0", char) >= 0) { + handle = null; + suffix = "!"; + this.forward(); + } else { + length = 1; + use_handle = false; + while (indexOf.call(C_LB + "\0 ", char) < 0) { + if (char === "!") { + use_handle = true; + break; + } + length++; + char = this.peek(length); + } + if (use_handle) { + handle = this.scan_tag_handle("tag", start_mark); + } else { + handle = "!"; + this.forward(); + } + suffix = this.scan_tag_uri("tag", start_mark); + } + char = this.peek(); + if (indexOf.call(C_LB + "\0 ", char) < 0) { + throw new exports.ScannerError("while scanning a tag", start_mark, `expected ' ' but found ${char}`, this.get_mark()); + } + return new tokens.TagToken([handle, suffix], start_mark, this.get_mark()); + } + /* + See the specification for details. + */ + scan_block_scalar(style) { + var breaks, chomping, chunks, end_mark, folded, increment, indent, leading_non_space, length, line_break, max_indent, min_indent, ref, ref1, ref2, start_mark; + folded = style === ">"; + chunks = []; + start_mark = this.get_mark(); + this.forward(); + [chomping, increment] = this.scan_block_scalar_indicators(start_mark); + this.scan_block_scalar_ignored_line(start_mark); + min_indent = this.indent + 1; + if (min_indent < 1) { + min_indent = 1; + } + if (increment == null) { + [breaks, max_indent, end_mark] = this.scan_block_scalar_indentation(); + indent = Math.max(min_indent, max_indent); + } else { + indent = min_indent + increment - 1; + [breaks, end_mark] = this.scan_block_scalar_breaks(indent); + } + line_break = ""; + while (this.column === indent && this.peek() !== "\0") { + chunks = chunks.concat(breaks); + leading_non_space = (ref = this.peek(), indexOf.call(" ", ref) < 0); + length = 0; + while (ref1 = this.peek(length), indexOf.call(C_LB + "\0", ref1) < 0) { + length++; + } + chunks.push(this.prefix(length)); + this.forward(length); + line_break = this.scan_line_break(); + [breaks, end_mark] = this.scan_block_scalar_breaks(indent); + if (this.column === indent && this.peek() !== "\0") { + if (folded && line_break === "\n" && leading_non_space && (ref2 = this.peek(), indexOf.call(" ", ref2) < 0)) { + if (util.is_empty(breaks)) { + chunks.push(" "); + } + } else { + chunks.push(line_break); + } + } else { + break; + } + } + if (chomping !== false) { + chunks.push(line_break); + } + if (chomping === true) { + chunks = chunks.concat(breaks); + } + return new tokens.ScalarToken(chunks.join(""), false, start_mark, end_mark, style); + } + /* + See the specification for details. + */ + scan_block_scalar_indicators(start_mark) { + var char, chomping, increment; + chomping = null; + increment = null; + char = this.peek(); + if (indexOf.call("+-", char) >= 0) { + chomping = char === "+"; + this.forward(); + char = this.peek(); + if (indexOf.call(C_NUMBERS, char) >= 0) { + increment = parseInt(char); + if (increment === 0) { + throw new exports.ScannerError("while scanning a block scalar", start_mark, "expected indentation indicator in the range 1-9 but found 0", this.get_mark()); + } + this.forward(); + } + } else if (indexOf.call(C_NUMBERS, char) >= 0) { + increment = parseInt(char); + if (increment === 0) { + throw new exports.ScannerError("while scanning a block scalar", start_mark, "expected indentation indicator in the range 1-9 but found 0", this.get_mark()); + } + this.forward(); + char = this.peek(); + if (indexOf.call("+-", char) >= 0) { + chomping = char === "+"; + this.forward(); + } + } + char = this.peek(); + if (indexOf.call(C_LB + "\0 ", char) < 0) { + throw new exports.ScannerError("while scanning a block scalar", start_mark, `expected chomping or indentation indicators, but found ${char}`, this.get_mark()); + } + return [chomping, increment]; + } + /* + See the specification for details. + */ + scan_block_scalar_ignored_line(start_mark) { + var char, ref; + while (this.peek() === " ") { + this.forward(); + } + if (this.peek() === "#") { + while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { + this.forward(); + } + } + char = this.peek(); + if (indexOf.call(C_LB + "\0", char) < 0) { + throw new exports.ScannerError("while scanning a block scalar", start_mark, `expected a comment or a line break but found ${char}`, this.get_mark()); + } + return this.scan_line_break(); + } + /* + See the specification for details. + */ + scan_block_scalar_indentation() { + var chunks, end_mark, max_indent, ref; + chunks = []; + max_indent = 0; + end_mark = this.get_mark(); + while (ref = this.peek(), indexOf.call(C_LB + " ", ref) >= 0) { + if (this.peek() !== " ") { + chunks.push(this.scan_line_break()); + end_mark = this.get_mark(); + } else { + this.forward(); + if (this.column > max_indent) { + max_indent = this.column; + } + } + } + return [chunks, max_indent, end_mark]; + } + /* + See the specification for details. + */ + scan_block_scalar_breaks(indent) { + var chunks, end_mark, ref; + chunks = []; + end_mark = this.get_mark(); + while (this.column < indent && this.peek() === " ") { + this.forward(); + } + while (ref = this.peek(), indexOf.call(C_LB, ref) >= 0) { + chunks.push(this.scan_line_break()); + end_mark = this.get_mark(); + while (this.column < indent && this.peek() === " ") { + this.forward(); + } + } + return [chunks, end_mark]; + } + /* + See the specification for details. + Note that we loose indentation rules for quoted scalars. Quoted scalars + don't need to adhere indentation because " and ' clearly mark the beginning + and the end of them. Therefore we are less restrictive than the + specification requires. We only need to check that document separators are + not included in scalars. + */ + scan_flow_scalar(style) { + var chunks, double, quote, start_mark; + double = style === '"'; + chunks = []; + start_mark = this.get_mark(); + quote = this.peek(); + this.forward(); + chunks = chunks.concat(this.scan_flow_scalar_non_spaces(double, start_mark)); + while (this.peek() !== quote) { + chunks = chunks.concat(this.scan_flow_scalar_spaces(double, start_mark)); + chunks = chunks.concat(this.scan_flow_scalar_non_spaces(double, start_mark)); + } + this.forward(); + return new tokens.ScalarToken(chunks.join(""), false, start_mark, this.get_mark(), style); + } + /* + See the specification for details. + */ + scan_flow_scalar_non_spaces(double, start_mark) { + var char, chunks, code, i, k, length, ref, ref1, ref2; + chunks = []; + while (true) { + length = 0; + while (ref = this.peek(length), indexOf.call(C_LB + C_WS + "'\"\\\0", ref) < 0) { + length++; + } + if (length !== 0) { + chunks.push(this.prefix(length)); + this.forward(length); + } + char = this.peek(); + if (!double && char === "'" && this.peek(1) === "'") { + chunks.push("'"); + this.forward(2); + } else if (double && char === "'" || !double && indexOf.call('"\\', char) >= 0) { + chunks.push(char); + this.forward(); + } else if (double && char === "\\") { + this.forward(); + char = this.peek(); + if (char in ESCAPE_REPLACEMENTS) { + chunks.push(ESCAPE_REPLACEMENTS[char]); + this.forward(); + } else if (char in ESCAPE_CODES) { + length = ESCAPE_CODES[char]; + this.forward(); + for (k = i = 0, ref1 = length; ref1 >= 0 ? i < ref1 : i > ref1; k = ref1 >= 0 ? ++i : --i) { + if (ref2 = this.peek(k), indexOf.call(`${C_NUMBERS}ABCDEFabcdef`, ref2) < 0) { + throw new exports.ScannerError("while scanning a double-quoted scalar", start_mark, `expected escape sequence of ${length} hexadecimal numbers, but found ${this.peek(k)}`, this.get_mark()); + } + } + code = parseInt(this.prefix(length), 16); + chunks.push(String.fromCharCode(code)); + this.forward(length); + } else if (indexOf.call(C_LB, char) >= 0) { + this.scan_line_break(); + chunks = chunks.concat(this.scan_flow_scalar_breaks(double, start_mark)); + } else { + throw new exports.ScannerError("while scanning a double-quoted scalar", start_mark, `found unknown escape character ${char}`, this.get_mark()); + } + } else { + return chunks; + } + } + } + /* + See the specification for details. + */ + scan_flow_scalar_spaces(double, start_mark) { + var breaks, char, chunks, length, line_break, ref, whitespaces; + chunks = []; + length = 0; + while (ref = this.peek(length), indexOf.call(C_WS, ref) >= 0) { + length++; + } + whitespaces = this.prefix(length); + this.forward(length); + char = this.peek(); + if (char === "\0") { + throw new exports.ScannerError("while scanning a quoted scalar", start_mark, "found unexpected end of stream", this.get_mark()); + } + if (indexOf.call(C_LB, char) >= 0) { + line_break = this.scan_line_break(); + breaks = this.scan_flow_scalar_breaks(double, start_mark); + if (line_break !== "\n") { + chunks.push(line_break); + } else if (breaks.length === 0) { + chunks.push(" "); + } + chunks = chunks.concat(breaks); + } else { + chunks.push(whitespaces); + } + return chunks; + } + /* + See the specification for details. + */ + scan_flow_scalar_breaks(double, start_mark) { + var chunks, prefix, ref, ref1, ref2; + chunks = []; + while (true) { + prefix = this.prefix(3); + if (prefix === "---" || prefix === "..." && (ref = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref) >= 0)) { + throw new exports.ScannerError("while scanning a quoted scalar", start_mark, "found unexpected document separator", this.get_mark()); + } + while (ref1 = this.peek(), indexOf.call(C_WS, ref1) >= 0) { + this.forward(); + } + if (ref2 = this.peek(), indexOf.call(C_LB, ref2) >= 0) { + chunks.push(this.scan_line_break()); + } else { + return chunks; + } + } + } + /* + See the specification for details. + We add an additional restriction for the flow context: + plain scalars in the flow context cannot contain ',', ':' and '?'. + We also keep track of the `allow_simple_key` flag here. + Indentation rules are loosed for the flow context. + */ + scan_plain() { + var char, chunks, end_mark, indent, length, ref, ref1, spaces, start_mark; + chunks = []; + start_mark = end_mark = this.get_mark(); + indent = this.indent + 1; + spaces = []; + while (true) { + length = 0; + if (this.peek() === "#") { + break; + } + while (true) { + char = this.peek(length); + if (indexOf.call(C_LB + C_WS + "\0", char) >= 0 || this.flow_level === 0 && char === ":" && (ref = this.peek(length + 1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0) || this.flow_level !== 0 && indexOf.call(",:?[]{}", char) >= 0) { + break; + } + length++; + } + if (this.flow_level !== 0 && char === ":" && (ref1 = this.peek(length + 1), indexOf.call(C_LB + C_WS + "\0,[]{}", ref1) < 0)) { + this.forward(length); + throw new exports.ScannerError("while scanning a plain scalar", start_mark, "found unexpected ':'", this.get_mark(), "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext"); + } + if (length === 0) { + break; + } + this.allow_simple_key = false; + chunks = chunks.concat(spaces); + chunks.push(this.prefix(length)); + this.forward(length); + end_mark = this.get_mark(); + spaces = this.scan_plain_spaces(indent, start_mark); + if (spaces == null || spaces.length === 0 || this.peek() === "#" || this.flow_level === 0 && this.column < indent) { + break; + } + } + return new tokens.ScalarToken(chunks.join(""), true, start_mark, end_mark); + } + /* + See the specification for details. + The specification is really confusing about tabs in plain scalars. + We just forbid them completely. Do not use tabs in YAML! + */ + scan_plain_spaces(indent, start_mark) { + var breaks, char, chunks, length, line_break, prefix, ref, ref1, ref2, ref3, whitespaces; + chunks = []; + length = 0; + while (ref = this.peek(length), indexOf.call(" ", ref) >= 0) { + length++; + } + whitespaces = this.prefix(length); + this.forward(length); + char = this.peek(); + if (indexOf.call(C_LB, char) >= 0) { + line_break = this.scan_line_break(); + this.allow_simple_key = true; + prefix = this.prefix(3); + if (prefix === "---" || prefix === "..." && (ref1 = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref1) >= 0)) { + return; + } + breaks = []; + while (ref3 = this.peek(), indexOf.call(C_LB + " ", ref3) >= 0) { + if (this.peek() === " ") { + this.forward(); + } else { + breaks.push(this.scan_line_break()); + prefix = this.prefix(3); + if (prefix === "---" || prefix === "..." && (ref2 = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref2) >= 0)) { + return; + } + } + } + if (line_break !== "\n") { + chunks.push(line_break); + } else if (breaks.length === 0) { + chunks.push(" "); + } + chunks = chunks.concat(breaks); + } else if (whitespaces) { + chunks.push(whitespaces); + } + return chunks; + } + /* + See the specification for details. + For some strange reasons, the specification does not allow '_' in tag + handles. I have allowed it anyway. + */ + scan_tag_handle(name, start_mark) { + var char, length, value; + char = this.peek(); + if (char !== "!") { + throw new exports.ScannerError(`while scanning a ${name}`, start_mark, `expected '!' but found ${char}`, this.get_mark()); + } + length = 1; + char = this.peek(length); + if (char !== " ") { + while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0) { + length++; + char = this.peek(length); + } + if (char !== "!") { + this.forward(length); + throw new exports.ScannerError(`while scanning a ${name}`, start_mark, `expected '!' but found ${char}`, this.get_mark()); + } + length++; + } + value = this.prefix(length); + this.forward(length); + return value; + } + /* + See the specification for details. + Note: we do not check if URI is well-formed. + */ + scan_tag_uri(name, start_mark) { + var char, chunks, length; + chunks = []; + length = 0; + char = this.peek(length); + while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-;/?:@&=+$,_.!~*'()[]%", char) >= 0) { + if (char === "%") { + chunks.push(this.prefix(length)); + this.forward(length); + length = 0; + chunks.push(this.scan_uri_escapes(name, start_mark)); + } else { + length++; + } + char = this.peek(length); + } + if (length !== 0) { + chunks.push(this.prefix(length)); + this.forward(length); + length = 0; + } + if (chunks.length === 0) { + throw new exports.ScannerError(`while parsing a ${name}`, start_mark, `expected URI but found ${char}`, this.get_mark()); + } + return chunks.join(""); + } + /* + See the specification for details. + */ + scan_uri_escapes(name, start_mark) { + var bytes, i, k, mark; + bytes = []; + mark = this.get_mark(); + while (this.peek() === "%") { + this.forward(); + for (k = i = 0; i <= 2; k = ++i) { + throw new exports.ScannerError(`while scanning a ${name}`, start_mark, `expected URI escape sequence of 2 hexadecimal numbers but found ${this.peek(k)}`, this.get_mark()); + } + bytes.push(String.fromCharCode(parseInt(this.prefix(2), 16))); + this.forward(2); + } + return bytes.join(""); + } + /* + Transforms: + '\r\n' : '\n' + '\r' : '\n' + '\n' : '\n' + '\x85' : '\n' + '\u2028' : '\u2028' + '\u2029 : '\u2029' + default : '' + */ + scan_line_break() { + var char; + char = this.peek(); + if (indexOf.call("\r\n\x85", char) >= 0) { + if (this.prefix(2) === "\r\n") { + this.forward(2); + } else { + this.forward(); + } + return "\n"; + } else if (indexOf.call("\u2028\u2029", char) >= 0) { + this.forward(); + return char; + } + return ""; + } + } + + C_LB = "\r\n\x85\u2028\u2029"; + C_WS = " "; + C_NUMBERS = "0123456789"; + ESCAPE_REPLACEMENTS = { + "0": "\0", + "a": "\x07", + "b": "\b", + "t": " ", + " ": " ", + "n": "\n", + "v": "\v", + "f": "\f", + "r": "\r", + "e": "\x1B", + " ": " ", + '"': '"', + "\\": "\\", + "N": "\x85", + "_": "\xA0", + "L": "\u2028", + "P": "\u2029" + }; + ESCAPE_CODES = { + "x": 2, + "u": 4, + "U": 8 + }; + ctor = Scanner.prototype.initialise; + return Scanner; + }).call(this); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/parser.js +var require_parser = __commonJS({ + "node_modules/yaml-js/lib/parser.js"(exports) { + (function() { + var MarkedYAMLError, events, tokens, hasProp = {}.hasOwnProperty; + events = require_events(); + ({ MarkedYAMLError } = require_errors()); + tokens = require_tokens(); + this.ParserError = class ParserError extends MarkedYAMLError { + }; + this.Parser = (function() { + var DEFAULT_TAGS, ctor; + class Parser { + constructor() { + return ctor.apply(this, arguments); + } + initialise() { + this.current_event = null; + this.yaml_version = null; + this.tag_handles = {}; + this.states = []; + this.marks = []; + return this.state = "parse_stream_start"; + } + /* + Reset the state attributes. + */ + dispose() { + this.states = []; + return this.state = null; + } + /* + Check the type of the next event. + */ + check_event(...choices) { + var choice, i, len; + if (this.current_event === null) { + if (this.state != null) { + this.current_event = this[this.state](); + } + } + if (this.current_event !== null) { + if (choices.length === 0) { + return true; + } + for (i = 0, len = choices.length; i < len; i++) { + choice = choices[i]; + if (this.current_event instanceof choice) { + return true; + } + } + } + return false; + } + /* + Get the next event. + */ + peek_event() { + if (this.current_event === null && this.state != null) { + this.current_event = this[this.state](); + } + return this.current_event; + } + /* + Get the event and proceed further. + */ + get_event() { + var event; + if (this.current_event === null && this.state != null) { + this.current_event = this[this.state](); + } + event = this.current_event; + this.current_event = null; + return event; + } + // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + // implicit_document ::= block_node DOCUMENT-END* + // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + /* + Parse the stream start. + */ + parse_stream_start() { + var event, token; + token = this.get_token(); + event = new events.StreamStartEvent(token.start_mark, token.end_mark); + this.state = "parse_implicit_document_start"; + return event; + } + /* + Parse an implicit document. + */ + parse_implicit_document_start() { + var end_mark, event, start_mark, token; + if (!this.check_token(tokens.DirectiveToken, tokens.DocumentStartToken, tokens.StreamEndToken)) { + this.tag_handles = DEFAULT_TAGS; + token = this.peek_token(); + start_mark = end_mark = token.start_mark; + event = new events.DocumentStartEvent(start_mark, end_mark, false); + this.states.push("parse_document_end"); + this.state = "parse_block_node"; + return event; + } else { + return this.parse_document_start(); + } + } + /* + Parse an explicit document. + */ + parse_document_start() { + var end_mark, event, start_mark, tags, token, version; + while (this.check_token(tokens.DocumentEndToken)) { + this.get_token(); + } + if (!this.check_token(tokens.StreamEndToken)) { + start_mark = this.peek_token().start_mark; + [version, tags] = this.process_directives(); + if (!this.check_token(tokens.DocumentStartToken)) { + throw new exports.ParserError(`expected '', but found ${this.peek_token().id}`, this.peek_token().start_mark); + } + token = this.get_token(); + end_mark = token.end_mark; + event = new events.DocumentStartEvent(start_mark, end_mark, true, version, tags); + this.states.push("parse_document_end"); + this.state = "parse_document_content"; + } else { + token = this.get_token(); + event = new events.StreamEndEvent(token.start_mark, token.end_mark); + if (this.states.length !== 0) { + throw new Error("assertion error, states should be empty"); + } + if (this.marks.length !== 0) { + throw new Error("assertion error, marks should be empty"); + } + this.state = null; + } + return event; + } + /* + Parse the document end. + */ + parse_document_end() { + var end_mark, event, explicit, start_mark, token; + token = this.peek_token(); + start_mark = end_mark = token.start_mark; + explicit = false; + if (this.check_token(tokens.DocumentEndToken)) { + token = this.get_token(); + end_mark = token.end_mark; + explicit = true; + } + event = new events.DocumentEndEvent(start_mark, end_mark, explicit); + this.state = "parse_document_start"; + return event; + } + parse_document_content() { + var event; + if (this.check_token(tokens.DirectiveToken, tokens.DocumentStartToken, tokens.DocumentEndToken, tokens.StreamEndToken)) { + event = this.process_empty_scalar(this.peek_token().start_mark); + this.state = this.states.pop(); + return event; + } else { + return this.parse_block_node(); + } + } + process_directives() { + var handle, major, minor, prefix, ref, tag_handles_copy, token, value; + this.yaml_version = null; + this.tag_handles = {}; + while (this.check_token(tokens.DirectiveToken)) { + token = this.get_token(); + if (token.name === "YAML") { + if (this.yaml_version !== null) { + throw new exports.ParserError(null, null, "found duplicate YAML directive", token.start_mark); + } + [major, minor] = token.value; + if (major !== 1) { + throw new exports.ParserError(null, null, "found incompatible YAML document (version 1.* is required)", token.start_mark); + } + this.yaml_version = token.value; + } else if (token.name === "TAG") { + [handle, prefix] = token.value; + if (handle in this.tag_handles) { + throw new exports.ParserError(null, null, `duplicate tag handle ${handle}`, token.start_mark); + } + this.tag_handles[handle] = prefix; + } + } + tag_handles_copy = null; + ref = this.tag_handles; + for (handle in ref) { + if (!hasProp.call(ref, handle)) continue; + prefix = ref[handle]; + if (tag_handles_copy == null) { + tag_handles_copy = {}; + } + tag_handles_copy[handle] = prefix; + } + value = [this.yaml_version, tag_handles_copy]; + for (handle in DEFAULT_TAGS) { + if (!hasProp.call(DEFAULT_TAGS, handle)) continue; + prefix = DEFAULT_TAGS[handle]; + if (!(prefix in this.tag_handles)) { + this.tag_handles[handle] = prefix; + } + } + return value; + } + // block_node_or_indentless_sequence ::= ALIAS + // | properties (block_content | indentless_sequence)? + // | block_content + // | indentless_block_sequence + // block_node ::= ALIAS + // | properties block_content? + // | block_content + // flow_node ::= ALIAS + // | properties flow_content? + // | flow_content + // properties ::= TAG ANCHOR? | ANCHOR TAG? + // block_content ::= block_collection | flow_collection | SCALAR + // flow_content ::= flow_collection | SCALAR + // block_collection ::= block_sequence | block_mapping + // flow_collection ::= flow_sequence | flow_mapping + parse_block_node() { + return this.parse_node(true); + } + parse_flow_node() { + return this.parse_node(); + } + parse_block_node_or_indentless_sequence() { + return this.parse_node(true, true); + } + parse_node(block = false, indentless_sequence = false) { + var anchor, end_mark, event, handle, implicit, node, start_mark, suffix, tag, tag_mark, token; + if (this.check_token(tokens.AliasToken)) { + token = this.get_token(); + event = new events.AliasEvent(token.value, token.start_mark, token.end_mark); + this.state = this.states.pop(); + } else { + anchor = null; + tag = null; + start_mark = end_mark = tag_mark = null; + if (this.check_token(tokens.AnchorToken)) { + token = this.get_token(); + start_mark = token.start_mark; + end_mark = token.end_mark; + anchor = token.value; + if (this.check_token(tokens.TagToken)) { + token = this.get_token(); + tag_mark = token.start_mark; + end_mark = token.end_mark; + tag = token.value; + } + } else if (this.check_token(tokens.TagToken)) { + token = this.get_token(); + start_mark = tag_mark = token.start_mark; + end_mark = token.end_mark; + tag = token.value; + if (this.check_token(tokens.AnchorToken)) { + token = this.get_token(); + end_mark = token.end_mark; + anchor = token.value; + } + } + if (tag !== null) { + [handle, suffix] = tag; + if (handle !== null) { + if (!(handle in this.tag_handles)) { + throw new exports.ParserError("while parsing a node", start_mark, `found undefined tag handle ${handle}`, tag_mark); + } + tag = this.tag_handles[handle] + suffix; + } else { + tag = suffix; + } + } + if (start_mark === null) { + start_mark = end_mark = this.peek_token().start_mark; + } + event = null; + implicit = tag === null || tag === "!"; + if (indentless_sequence && this.check_token(tokens.BlockEntryToken)) { + end_mark = this.peek_token().end_mark; + event = new events.SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark); + this.state = "parse_indentless_sequence_entry"; + } else { + if (this.check_token(tokens.ScalarToken)) { + token = this.get_token(); + end_mark = token.end_mark; + if (token.plain && tag === null || tag === "!") { + implicit = [true, false]; + } else if (tag === null) { + implicit = [false, true]; + } else { + implicit = [false, false]; + } + event = new events.ScalarEvent(anchor, tag, implicit, token.value, start_mark, end_mark, token.style); + this.state = this.states.pop(); + } else if (this.check_token(tokens.FlowSequenceStartToken)) { + end_mark = this.peek_token().end_mark; + event = new events.SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark, true); + this.state = "parse_flow_sequence_first_entry"; + } else if (this.check_token(tokens.FlowMappingStartToken)) { + end_mark = this.peek_token().end_mark; + event = new events.MappingStartEvent(anchor, tag, implicit, start_mark, end_mark, true); + this.state = "parse_flow_mapping_first_key"; + } else if (block && this.check_token(tokens.BlockSequenceStartToken)) { + end_mark = this.peek_token().end_mark; + event = new events.SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark, false); + this.state = "parse_block_sequence_first_entry"; + } else if (block && this.check_token(tokens.BlockMappingStartToken)) { + end_mark = this.peek_token().end_mark; + event = new events.MappingStartEvent(anchor, tag, implicit, start_mark, end_mark, false); + this.state = "parse_block_mapping_first_key"; + } else if (anchor !== null || tag !== null) { + event = new events.ScalarEvent(anchor, tag, [implicit, false], "", start_mark, end_mark); + this.state = this.states.pop(); + } else { + if (block) { + node = "block"; + } else { + node = "flow"; + } + token = this.peek_token(); + throw new exports.ParserError(`while parsing a ${node} node`, start_mark, `expected the node content, but found ${token.id}`, token.start_mark); + } + } + } + return event; + } + // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* + // BLOCK-END + parse_block_sequence_first_entry() { + var token; + token = this.get_token(); + this.marks.push(token.start_mark); + return this.parse_block_sequence_entry(); + } + parse_block_sequence_entry() { + var event, token; + if (this.check_token(tokens.BlockEntryToken)) { + token = this.get_token(); + if (!this.check_token(tokens.BlockEntryToken, tokens.BlockEndToken)) { + this.states.push("parse_block_sequence_entry"); + return this.parse_block_node(); + } else { + this.state = "parse_block_sequence_entry"; + return this.process_empty_scalar(token.end_mark); + } + } + if (!this.check_token(tokens.BlockEndToken)) { + token = this.peek_token(); + throw new exports.ParserError("while parsing a block collection", this.marks.slice(-1)[0], `expected , but found ${token.id}`, token.start_mark); + } + token = this.get_token(); + event = new events.SequenceEndEvent(token.start_mark, token.end_mark); + this.state = this.states.pop(); + this.marks.pop(); + return event; + } + // indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + parse_indentless_sequence_entry() { + var event, token; + if (this.check_token(tokens.BlockEntryToken)) { + token = this.get_token(); + if (!this.check_token(tokens.BlockEntryToken, tokens.KeyToken, tokens.ValueToken, tokens.BlockEndToken)) { + this.states.push("parse_indentless_sequence_entry"); + return this.parse_block_node(); + } else { + this.state = "parse_indentless_sequence_entry"; + return this.process_empty_scalar(token.end_mark); + } + } + token = this.peek_token(); + event = new events.SequenceEndEvent(token.start_mark, token.start_mark); + this.state = this.states.pop(); + return event; + } + // block_mapping ::= BLOCK-MAPPING-START + // ((KEY block_node_or_indentless_sequence?)? + // (VALUE block_node_or_indentless_sequence?)?)* BLOCK-END + parse_block_mapping_first_key() { + var token; + token = this.get_token(); + this.marks.push(token.start_mark); + return this.parse_block_mapping_key(); + } + parse_block_mapping_key() { + var event, token; + if (this.check_token(tokens.KeyToken)) { + token = this.get_token(); + if (!this.check_token(tokens.KeyToken, tokens.ValueToken, tokens.BlockEndToken)) { + this.states.push("parse_block_mapping_value"); + return this.parse_block_node_or_indentless_sequence(); + } else { + this.state = "parse_block_mapping_value"; + return this.process_empty_scalar(token.end_mark); + } + } + if (!this.check_token(tokens.BlockEndToken)) { + token = this.peek_token(); + throw new exports.ParserError("while parsing a block mapping", this.marks.slice(-1)[0], `expected , but found ${token.id}`, token.start_mark); + } + token = this.get_token(); + event = new events.MappingEndEvent(token.start_mark, token.end_mark); + this.state = this.states.pop(); + this.marks.pop(); + return event; + } + parse_block_mapping_value() { + var token; + if (this.check_token(tokens.ValueToken)) { + token = this.get_token(); + if (!this.check_token(tokens.KeyToken, tokens.ValueToken, tokens.BlockEndToken)) { + this.states.push("parse_block_mapping_key"); + return this.parse_block_node_or_indentless_sequence(); + } else { + this.state = "parse_block_mapping_key"; + return this.process_empty_scalar(token.end_mark); + } + } else { + this.state = "parse_block_mapping_key"; + token = this.peek_token(); + return this.process_empty_scalar(token.start_mark); + } + } + // flow_sequence ::= FLOW-SEQUENCE-START + // (flow_sequence_entry FLOW-ENTRY)* flow_sequence_entry? FLOW-SEQUENCE-END + // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + // Note that while production rules for both flow_sequence_entry and + // flow_mapping_entry are equal, their interpretations are different. For + // `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` + // generate an inline mapping (set syntax). + parse_flow_sequence_first_entry() { + var token; + token = this.get_token(); + this.marks.push(token.start_mark); + return this.parse_flow_sequence_entry(true); + } + parse_flow_sequence_entry(first = false) { + var event, token; + if (!this.check_token(tokens.FlowSequenceEndToken)) { + if (!first) { + if (this.check_token(tokens.FlowEntryToken)) { + this.get_token(); + } else { + token = this.peek_token(); + throw new exports.ParserError("while parsing a flow sequence", this.marks.slice(-1)[0], `expected ',' or ']', but got ${token.id}`, token.start_mark); + } + } + if (this.check_token(tokens.KeyToken)) { + token = this.peek_token(); + event = new events.MappingStartEvent(null, null, true, token.start_mark, token.end_mark, true); + this.state = "parse_flow_sequence_entry_mapping_key"; + return event; + } else if (!this.check_token(tokens.FlowSequenceEndToken)) { + this.states.push("parse_flow_sequence_entry"); + return this.parse_flow_node(); + } + } + token = this.get_token(); + event = new events.SequenceEndEvent(token.start_mark, token.end_mark); + this.state = this.states.pop(); + this.marks.pop(); + return event; + } + parse_flow_sequence_entry_mapping_key() { + var token; + token = this.get_token(); + if (!this.check_token(tokens.ValueToken, tokens.FlowEntryToken, tokens.FlowSequenceEndToken)) { + this.states.push("parse_flow_sequence_entry_mapping_value"); + return this.parse_flow_node(); + } else { + this.state = "parse_flow_sequence_entry_mapping_value"; + return this.process_empty_scalar(token.end_mark); + } + } + parse_flow_sequence_entry_mapping_value() { + var token; + if (this.check_token(tokens.ValueToken)) { + token = this.get_token(); + if (!this.check_token(tokens.FlowEntryToken, tokens.FlowSequenceEndToken)) { + this.states.push("parse_flow_sequence_entry_mapping_end"); + return this.parse_flow_node(); + } else { + this.state = "parse_flow_sequence_entry_mapping_end"; + return this.process_empty_scalar(token.end_mark); + } + } else { + this.state = "parse_flow_sequence_entry_mapping_end"; + token = this.peek_token(); + return this.process_empty_scalar(token.start_mark); + } + } + parse_flow_sequence_entry_mapping_end() { + var token; + this.state = "parse_flow_sequence_entry"; + token = this.peek_token(); + return new events.MappingEndEvent(token.start_mark, token.start_mark); + } + // flow_mapping ::= FLOW-MAPPING-START (flow_mapping_entry FLOW-ENTRY)* + // flow_mapping_entry? FLOW-MAPPING-END + // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + parse_flow_mapping_first_key() { + var token; + token = this.get_token(); + this.marks.push(token.start_mark); + return this.parse_flow_mapping_key(true); + } + parse_flow_mapping_key(first = false) { + var event, token; + if (!this.check_token(tokens.FlowMappingEndToken)) { + if (!first) { + if (this.check_token(tokens.FlowEntryToken)) { + this.get_token(); + } else { + token = this.peek_token(); + throw new exports.ParserError("while parsing a flow mapping", this.marks.slice(-1)[0], `expected ',' or '}', but got ${token.id}`, token.start_mark); + } + } + if (this.check_token(tokens.KeyToken)) { + token = this.get_token(); + if (!this.check_token(tokens.ValueToken, tokens.FlowEntryToken, tokens.FlowMappingEndToken)) { + this.states.push("parse_flow_mapping_value"); + return this.parse_flow_node(); + } else { + this.state = "parse_flow_mapping_value"; + return this.process_empty_scalar(token.end_mark); + } + } else if (!this.check_token(tokens.FlowMappingEndToken)) { + this.states.push("parse_flow_mapping_empty_value"); + return this.parse_flow_node(); + } + } + token = this.get_token(); + event = new events.MappingEndEvent(token.start_mark, token.end_mark); + this.state = this.states.pop(); + this.marks.pop(); + return event; + } + parse_flow_mapping_value() { + var token; + if (this.check_token(tokens.ValueToken)) { + token = this.get_token(); + if (!this.check_token(tokens.FlowEntryToken, tokens.FlowMappingEndToken)) { + this.states.push("parse_flow_mapping_key"); + return this.parse_flow_node(); + } else { + this.state = "parse_flow_mapping_key"; + return this.process_empty_scalar(token.end_mark); + } + } else { + this.state = "parse_flow_mapping_key"; + token = this.peek_token(); + return this.process_empty_scalar(token.start_mark); + } + } + parse_flow_mapping_empty_value() { + this.state = "parse_flow_mapping_key"; + return this.process_empty_scalar(this.peek_token().start_mark); + } + process_empty_scalar(mark) { + return new events.ScalarEvent(null, null, [true, false], "", mark, mark); + } + } + + DEFAULT_TAGS = { + "!": "!", + "!!": "tag:yaml.org,2002:" + }; + ctor = Parser.prototype.initialise; + return Parser; + }).call(this); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/loader.js +var require_loader = __commonJS({ + "node_modules/yaml-js/lib/loader.js"(exports) { + (function() { + var composer, constructor, parser, reader, resolver, scanner, util; + util = require_util(); + reader = require_reader(); + scanner = require_scanner(); + parser = require_parser(); + composer = require_composer(); + resolver = require_resolver(); + constructor = require_constructor(); + this.make_loader = function(Reader = reader.Reader, Scanner = scanner.Scanner, Parser = parser.Parser, Composer = composer.Composer, Resolver = resolver.Resolver, Constructor = constructor.Constructor) { + var Loader, components; + components = [Reader, Scanner, Parser, Composer, Resolver, Constructor]; + return Loader = (function() { + var component; + class Loader2 { + constructor(stream) { + var i, len, ref; + components[0].prototype.initialise.call(this, stream); + ref = components.slice(1); + for (i = 0, len = ref.length; i < len; i++) { + component = ref[i]; + component.prototype.initialise.call(this); + } + } + } + + util.extend(Loader2.prototype, ...(function() { + var i, len, results; + results = []; + for (i = 0, len = components.length; i < len; i++) { + component = components[i]; + results.push(component.prototype); + } + return results; + })()); + return Loader2; + }).call(this); + }; + this.Loader = this.make_loader(); + }).call(exports); + } +}); + +// node_modules/yaml-js/lib/yaml.js +var require_yaml = __commonJS({ + "node_modules/yaml-js/lib/yaml.js"(exports) { + (function() { + var composer, constructor, dumper, errors, events, loader, nodes, parser, reader, resolver, scanner, tokens, util; + composer = this.composer = require_composer(); + constructor = this.constructor = require_constructor(); + dumper = this.dumper = require_dumper(); + errors = this.errors = require_errors(); + events = this.events = require_events(); + loader = this.loader = require_loader(); + nodes = this.nodes = require_nodes(); + parser = this.parser = require_parser(); + reader = this.reader = require_reader(); + resolver = this.resolver = require_resolver(); + scanner = this.scanner = require_scanner(); + tokens = this.tokens = require_tokens(); + util = require_util(); + this.scan = function(stream, Loader = loader.Loader) { + var _loader, results; + _loader = new Loader(stream); + results = []; + while (_loader.check_token()) { + results.push(_loader.get_token()); + } + return results; + }; + this.parse = function(stream, Loader = loader.Loader) { + var _loader, results; + _loader = new Loader(stream); + results = []; + while (_loader.check_event()) { + results.push(_loader.get_event()); + } + return results; + }; + this.compose = function(stream, Loader = loader.Loader) { + var _loader; + _loader = new Loader(stream); + return _loader.get_single_node(); + }; + this.compose_all = function(stream, Loader = loader.Loader) { + var _loader, results; + _loader = new Loader(stream); + results = []; + while (_loader.check_node()) { + results.push(_loader.get_node()); + } + return results; + }; + this.load = function(stream, Loader = loader.Loader) { + var _loader; + _loader = new Loader(stream); + return _loader.get_single_data(); + }; + this.load_all = function(stream, Loader = loader.Loader) { + var _loader, results; + _loader = new Loader(stream); + results = []; + while (_loader.check_data()) { + results.push(_loader.get_data()); + } + return results; + }; + this.emit = function(events2, stream, Dumper = dumper.Dumper, options = {}) { + var _dumper, dest, event, i, len; + dest = stream || new util.StringStream(); + _dumper = new Dumper(dest, options); + try { + for (i = 0, len = events2.length; i < len; i++) { + event = events2[i]; + _dumper.emit(event); + } + } finally { + _dumper.dispose(); + } + return stream || dest.string; + }; + this.serialize = function(node, stream, Dumper = dumper.Dumper, options = {}) { + return exports.serialize_all([node], stream, Dumper, options); + }; + this.serialize_all = function(nodes2, stream, Dumper = dumper.Dumper, options = {}) { + var _dumper, dest, i, len, node; + dest = stream || new util.StringStream(); + _dumper = new Dumper(dest, options); + try { + _dumper.open(); + for (i = 0, len = nodes2.length; i < len; i++) { + node = nodes2[i]; + _dumper.serialize(node); + } + _dumper.close(); + } finally { + _dumper.dispose(); + } + return stream || dest.string; + }; + this.dump = function(data, stream, Dumper = dumper.Dumper, options = {}) { + return exports.dump_all([data], stream, Dumper, options); + }; + this.dump_all = function(documents, stream, Dumper = dumper.Dumper, options = {}) { + var _dumper, dest, document, i, len; + dest = stream || new util.StringStream(); + _dumper = new Dumper(dest, options); + try { + _dumper.open(); + for (i = 0, len = documents.length; i < len; i++) { + document = documents[i]; + _dumper.represent(document); + } + _dumper.close(); + } finally { + _dumper.dispose(); + } + return stream || dest.string; + }; + }).call(exports); + } +}); + +// entry.js +var import_yaml_js = __toESM(require_yaml()); +var entry_default = import_yaml_js.default; +export { + entry_default as default +}; From 14e4026d1bbb90946f8525afd78d042ef85d1a10 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 11:45:25 -0400 Subject: [PATCH 037/247] Move yaml-js to being dep --- package.json | 3 +- pnpm-lock.yaml | 9 + .../userpluginInstaller.dev/native.ts | 8 +- .../userpluginInstaller.dev/yaml.js | 5175 ----------------- 4 files changed, 15 insertions(+), 5180 deletions(-) delete mode 100644 src/equicordplugins/userpluginInstaller.dev/yaml.js diff --git a/package.json b/package.json index af90b1870..cd9f7f0cc 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,8 @@ "nanoid": "^5.1.6", "native-file-system-adapter": "^3.0.1", "usercss-meta": "^0.12.0", - "virtual-merge": "^1.0.1" + "virtual-merge": "^1.0.1", + "yaml-js": "^0.3.1" }, "devDependencies": { "@electron/asar": "^4.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81bafc045..53ca76f94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,6 +73,9 @@ importers: virtual-merge: specifier: ^1.0.1 version: 1.0.2 + yaml-js: + specifier: ^0.3.1 + version: 0.3.1 devDependencies: '@electron/asar': specifier: ^4.2.0 @@ -2886,6 +2889,10 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yaml-js@0.3.1: + resolution: {integrity: sha512-LjoIFHCtSfkGzPsmYmfDsW+TShtQBcY7lwH1yLQ5brJHXRhjteUnVE2ThCbz1madq8JUZIAjFiavfnIFeTO8CQ==} + engines: {node: '>=8'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -5772,6 +5779,8 @@ snapshots: y18n@5.0.8: {} + yaml-js@0.3.1: {} + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/src/equicordplugins/userpluginInstaller.dev/native.ts b/src/equicordplugins/userpluginInstaller.dev/native.ts index 8ab7a1c6d..1203b4a85 100644 --- a/src/equicordplugins/userpluginInstaller.dev/native.ts +++ b/src/equicordplugins/userpluginInstaller.dev/native.ts @@ -10,6 +10,7 @@ import { BrowserWindow, dialog, shell, WebContentsView } from "electron"; import { existsSync, readdirSync, readFileSync } from "fs"; import { readdir, readFile, rm } from "fs/promises"; import { basename, join } from "path"; +import yaml from "yaml-js"; // @ts-ignore fuck off import pluginValidateContent from "./misc/pluginValidate.txt"; // i would use HTML but esbuild is being whiny @@ -17,7 +18,6 @@ import pluginValidateContent from "./misc/pluginValidate.txt"; // i would use HT import setGitPathContent from "./misc/setGitPath.txt"; // @ts-ignore fuck off import updateValidateContent from "./misc/updateValidate.txt"; // see above -import YAML from "./yaml.js"; const PLUGIN_META_REGEX = /export default definePlugin\((?:\s|\/(?:\/|\*).*)*{\s*(?:\s|\/(?:\/|\*).*)*name:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*,(?:\s|\/(?:\/|\*).*)*(?:\s|\/(?:\/|\*).*)*description:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*/; // if edited, also edit in misc/constants.ts!!! @@ -206,7 +206,7 @@ async function getPluginMeta(path: string, extra: object = {}): Promise<{ try { const meta = readFileSync(join(path, "meta.yml"), "utf8"); console.log(meta); - const parsed = YAML.load(meta); + const parsed = yaml.load(meta); if (parsed.thread && typeof parsed.thread === "string" && /^\d+$/.test(parsed.thread)) { supportChannelID = parsed.thread; } @@ -448,7 +448,7 @@ export async function openGitPathModal(_: any) { }); } }); - } catch(e) { + } catch (e) { dialog.showMessageBox({ title: "Error", message: "Git error", @@ -464,7 +464,7 @@ export async function openGitPathModal(_: any) { win.webContents.executeJavaScript(`document.querySelector("input").value = ${JSON.stringify(gitPathSet)};`); } - console.log(YAML.load(` + console.log(yaml.load(` name: test items: - a diff --git a/src/equicordplugins/userpluginInstaller.dev/yaml.js b/src/equicordplugins/userpluginInstaller.dev/yaml.js deleted file mode 100644 index 6baea2a59..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/yaml.js +++ /dev/null @@ -1,5175 +0,0 @@ -/* eslint-disable */ -// This is from the https://github.com/connec/yaml-js library, licensed under the WTFPL License -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __require = /* @__PURE__ */ (x => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { - get: (a, b) => (typeof require !== "undefined" ? require : a)[b] -}) : x)(function(x) { - if (typeof require !== "undefined") return require.apply(this, arguments); - throw Error('Dynamic require of "' + x + '" is not supported'); -}); -var __commonJS = (cb, mod) => function __require2() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (const key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); - -// node_modules/yaml-js/lib/events.js -var require_events = __commonJS({ - "node_modules/yaml-js/lib/events.js"(exports) { - (function() { - this.Event = class Event { - constructor(start_mark1, end_mark1) { - this.start_mark = start_mark1; - this.end_mark = end_mark1; - } - }; - this.NodeEvent = class NodeEvent extends this.Event { - constructor(anchor1, start_mark, end_mark) { - super(start_mark, end_mark); - this.anchor = anchor1; - } - }; - this.CollectionStartEvent = class CollectionStartEvent extends this.NodeEvent { - constructor(anchor, tag, implicit, start_mark, end_mark, flow_style) { - super(anchor, start_mark, end_mark); - this.tag = tag; - this.implicit = implicit; - this.flow_style = flow_style; - } - }; - this.CollectionEndEvent = class CollectionEndEvent extends this.Event { - }; - this.StreamStartEvent = class StreamStartEvent extends this.Event { - constructor(start_mark, end_mark, encoding) { - super(start_mark, end_mark); - this.encoding = encoding; - } - }; - this.StreamEndEvent = class StreamEndEvent extends this.Event { - }; - this.DocumentStartEvent = class DocumentStartEvent extends this.Event { - constructor(start_mark, end_mark, explicit, version, tags) { - super(start_mark, end_mark); - this.explicit = explicit; - this.version = version; - this.tags = tags; - } - }; - this.DocumentEndEvent = class DocumentEndEvent extends this.Event { - constructor(start_mark, end_mark, explicit) { - super(start_mark, end_mark); - this.explicit = explicit; - } - }; - this.AliasEvent = class AliasEvent extends this.NodeEvent { - }; - this.ScalarEvent = class ScalarEvent extends this.NodeEvent { - constructor(anchor, tag, implicit, value, start_mark, end_mark, style) { - super(anchor, start_mark, end_mark); - this.tag = tag; - this.implicit = implicit; - this.value = value; - this.style = style; - } - }; - this.SequenceStartEvent = class SequenceStartEvent extends this.CollectionStartEvent { - }; - this.SequenceEndEvent = class SequenceEndEvent extends this.CollectionEndEvent { - }; - this.MappingStartEvent = class MappingStartEvent extends this.CollectionStartEvent { - }; - this.MappingEndEvent = class MappingEndEvent extends this.CollectionEndEvent { - }; - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/errors.js -var require_errors = __commonJS({ - "node_modules/yaml-js/lib/errors.js"(exports) { - (function() { - var { indexOf } = []; - this.Mark = class Mark { - constructor(line, column, buffer, pointer) { - this.line = line; - this.column = column; - this.buffer = buffer; - this.pointer = pointer; - } - get_snippet(indent = 4, max_length = 75) { - var break_chars, end, head, ref, ref1, start, tail; - if (this.buffer == null) { - return null; - } - break_chars = "\0\r\n\x85\u2028\u2029"; - head = ""; - start = this.pointer; - while (start > 0 && (ref = this.buffer[start - 1], indexOf.call(break_chars, ref) < 0)) { - start--; - if (this.pointer - start > max_length / 2 - 1) { - head = " ... "; - start += 5; - break; - } - } - tail = ""; - end = this.pointer; - while (end < this.buffer.length && (ref1 = this.buffer[end], indexOf.call(break_chars, ref1) < 0)) { - end++; - if (end - this.pointer > max_length / 2 - 1) { - tail = " ... "; - end -= 5; - break; - } - } - return `${new Array(indent).join(" ")}${head}${this.buffer.slice(start, end)}${tail} -${new Array(indent + this.pointer - start + head.length).join(" ")}^`; - } - toString() { - var snippet, where; - snippet = this.get_snippet(); - where = ` on line ${this.line + 1}, column ${this.column + 1}`; - if (snippet) { - return where; - } else { - return `${where}: -${snippet}`; - } - } - }; - this.YAMLError = class YAMLError extends Error { - constructor(message) { - super(message); - Object.defineProperty(this, "stack", { - get: function() { - return this.toString() + "\n" + new Error().stack.split("\n").slice(1).join("\n"); - } - }); - } - toString() { - return this.message; - } - }; - this.MarkedYAMLError = class MarkedYAMLError extends this.YAMLError { - constructor(context, context_mark, problem, problem_mark, note) { - super(); - this.context = context; - this.context_mark = context_mark; - this.problem = problem; - this.problem_mark = problem_mark; - this.note = note; - } - toString() { - var lines; - lines = []; - if (this.context != null) { - lines.push(this.context); - } - if (this.context_mark != null && (this.problem == null || this.problem_mark == null || this.context_mark.line !== this.problem_mark.line || this.context_mark.column !== this.problem_mark.column)) { - lines.push(this.context_mark.toString()); - } - if (this.problem != null) { - lines.push(this.problem); - } - if (this.problem_mark != null) { - lines.push(this.problem_mark.toString()); - } - if (this.note != null) { - lines.push(this.note); - } - return lines.join("\n"); - } - }; - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/nodes.js -var require_nodes = __commonJS({ - "node_modules/yaml-js/lib/nodes.js"(exports) { - (function() { - var unique_id; - unique_id = 0; - this.Node = class Node { - constructor(tag1, value1, start_mark1, end_mark1) { - this.tag = tag1; - this.value = value1; - this.start_mark = start_mark1; - this.end_mark = end_mark1; - this.unique_id = `node_${unique_id++}`; - } - }; - this.ScalarNode = (function() { - class ScalarNode extends this.Node { - constructor(tag, value, start_mark, end_mark, style) { - super(tag, value, start_mark, end_mark); - this.style = style; - } - } - - ScalarNode.prototype.id = "scalar"; - return ScalarNode; - }).call(this); - this.CollectionNode = class CollectionNode extends this.Node { - constructor(tag, value, start_mark, end_mark, flow_style) { - super(tag, value, start_mark, end_mark); - this.flow_style = flow_style; - } - }; - this.SequenceNode = (function() { - class SequenceNode extends this.CollectionNode { - } - - SequenceNode.prototype.id = "sequence"; - return SequenceNode; - }).call(this); - this.MappingNode = (function() { - class MappingNode extends this.CollectionNode { - } - - MappingNode.prototype.id = "mapping"; - return MappingNode; - }).call(this); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/composer.js -var require_composer = __commonJS({ - "node_modules/yaml-js/lib/composer.js"(exports) { - (function() { - var MarkedYAMLError, events, nodes; - events = require_events(); - ({ MarkedYAMLError } = require_errors()); - nodes = require_nodes(); - this.ComposerError = class ComposerError extends MarkedYAMLError { - }; - this.Composer = (function() { - var ctor; - class Composer { - constructor() { - return ctor.apply(this, arguments); - } - /* - Initialise a `Composer` instance. - */ - initialise() { - return this.anchors = {}; - } - /* - Checks if a document can be composed from the event stream. - - So long as the event stream hasn't ended (no [StreamEndEvent]), another document can be composed. - - @return {Boolean} True if a document can be composed, false otherwise. - */ - check_node() { - if (this.check_event(events.StreamStartEvent)) { - this.get_event(); - } - return !this.check_event(events.StreamEndEvent); - } - /* - Compose a document from the remaining event stream. - - {Composer#check_node} must be called before calling this method. - - @return {Node} The next document in the stream. Returns `undefined` if the event stream has ended. - */ - get_node() { - if (!this.check_event(events.StreamEndEvent)) { - return this.compose_document(); - } - } - /* - Compose a single document from the entire event stream. - - @throw {ComposerError} if there's more than one document is in the stream. - - @return {Node} The single document in the stream. - */ - get_single_node() { - var document, event; - this.get_event(); - document = null; - if (!this.check_event(events.StreamEndEvent)) { - document = this.compose_document(); - } - if (!this.check_event(events.StreamEndEvent)) { - event = this.get_event(); - throw new exports.ComposerError("expected a single document in the stream", document.start_mark, "but found another document", event.start_mark); - } - this.get_event(); - return document; - } - /* - Compose a document node from the event stream. - - A 'document' node is any single {Node} subclass. {DocumentStart} and {DocumentEnd} events delimit - the events used for composition. - - @private - - @return {Node} The document node. - */ - compose_document() { - var node; - this.get_event(); - node = this.compose_node(); - this.get_event(); - this.anchors = {}; - return node; - } - /* - Compose a node from the event stream. - - Composes a {ScalarNode}, {SequenceNode}, or {MappingNode} from the event stream, depending on the - first event encountered ({ScalarEvent}, {SequenceStartEvent}, or {MappingStartEvent} - respectively). - - @private - - @param parent {Node} The parent of the new node. - @param index {Number} The index of the new node within the parent's children. - @throw {ComposerError} if an alias is encountered for an undefined anchor. - @throw {ComposerError} if a duplicate anchor is envountered. - @return {Node} The composed node. - */ - compose_node(parent, index) { - var anchor, event, node; - if (this.check_event(events.AliasEvent)) { - event = this.get_event(); - anchor = event.anchor; - if (!(anchor in this.anchors)) { - throw new exports.ComposerError(null, null, `found undefined alias ${anchor}`, event.start_mark); - } - return this.anchors[anchor]; - } - event = this.peek_event(); - anchor = event.anchor; - if (anchor !== null && anchor in this.anchors) { - throw new exports.ComposerError(`found duplicate anchor ${anchor}; first occurence`, this.anchors[anchor].start_mark, "second occurrence", event.start_mark); - } - this.descend_resolver(parent, index); - if (this.check_event(events.ScalarEvent)) { - node = this.compose_scalar_node(anchor); - } else if (this.check_event(events.SequenceStartEvent)) { - node = this.compose_sequence_node(anchor); - } else if (this.check_event(events.MappingStartEvent)) { - node = this.compose_mapping_node(anchor); - } - this.ascend_resolver(); - return node; - } - /* - Compose a {ScalarNode} from the event stream. - - @private - - @param anchor {String} The anchor name for the node (if any). - @return {ScalarNode} The node composed from a {ScalarEvent}. - */ - compose_scalar_node(anchor) { - var event, node, tag; - event = this.get_event(); - tag = event.tag; - if (tag === null || tag === "!") { - tag = this.resolve(nodes.ScalarNode, event.value, event.implicit); - } - node = new nodes.ScalarNode(tag, event.value, event.start_mark, event.end_mark, event.style); - if (anchor !== null) { - this.anchors[anchor] = node; - } - return node; - } - /* - Compose a {SequenceNode} from the event stream. - - The contents of the node are composed from events between a {SequenceStartEvent} and a - {SequenceEndEvent}. - - @private - - @param anchor {String} The anchor name for the node (if any). - @return {SequenceNode} The composed node. - */ - compose_sequence_node(anchor) { - var end_event, index, node, start_event, tag; - start_event = this.get_event(); - tag = start_event.tag; - if (tag === null || tag === "!") { - tag = this.resolve(nodes.SequenceNode, null, start_event.implicit); - } - node = new nodes.SequenceNode(tag, [], start_event.start_mark, null, start_event.flow_style); - if (anchor !== null) { - this.anchors[anchor] = node; - } - index = 0; - while (!this.check_event(events.SequenceEndEvent)) { - node.value.push(this.compose_node(node, index)); - index++; - } - end_event = this.get_event(); - node.end_mark = end_event.end_mark; - return node; - } - /* - Compose a {MappingNode} from the event stream. - - The contents of the node are composed from events between a {MappingStartEvent} and a - {MappingEndEvent}. - - @private - - @param anchor {String} The anchor name for the node (if any). - @return {MappingNode} The composed node. - */ - compose_mapping_node(anchor) { - var end_event, item_key, item_value, node, start_event, tag; - start_event = this.get_event(); - tag = start_event.tag; - if (tag === null || tag === "!") { - tag = this.resolve(nodes.MappingNode, null, start_event.implicit); - } - node = new nodes.MappingNode(tag, [], start_event.start_mark, null, start_event.flow_style); - if (anchor !== null) { - this.anchors[anchor] = node; - } - while (!this.check_event(events.MappingEndEvent)) { - item_key = this.compose_node(node); - item_value = this.compose_node(node, item_key); - node.value.push([item_key, item_value]); - } - end_event = this.get_event(); - node.end_mark = end_event.end_mark; - return node; - } - } - - ctor = Composer.prototype.initialise; - return Composer; - }).call(this); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/util.js -var require_util = __commonJS({ - "node_modules/yaml-js/lib/util.js"(exports) { - (function() { - var ref, ref1, ref2, hasProp = {}.hasOwnProperty; - this.StringStream = class StringStream { - constructor() { - this.string = ""; - } - write(chunk) { - return this.string += chunk; - } - }; - this.clone = obj => { - return Object.assign({}, obj); - }; - this.extend = function(destination, ...sources) { - var i, j, len, len1, name, ref3, source; - for (i = 0, len = sources.length; i < len; i++) { - source = sources[i]; - while (source !== Object.prototype) { - ref3 = Object.getOwnPropertyNames(source); - for (j = 0, len1 = ref3.length; j < len1; j++) { - name = ref3[j]; - if (destination[name] == null) { - destination[name] = source[name]; - } - } - source = Object.getPrototypeOf(source); - } - } - return destination; - }; - this.is_empty = function(obj) { - var key; - if (Array.isArray(obj) || typeof obj === "string") { - return obj.length === 0; - } - for (key in obj) { - if (!hasProp.call(obj, key)) continue; - return false; - } - return true; - }; - this.inspect = (ref = (ref1 = (ref2 = __require("util")) != null ? ref2.inspect : void 0) != null ? ref1 : global.inspect) != null ? ref : function(a) { - return `${a}`; - }; - this.pad_left = function(str, char, length) { - str = String(str); - if (str.length >= length) { - return str; - } else if (str.length + 1 === length) { - return `${char}${str}`; - } else { - return `${new Array(length - str.length + 1).join(char)}${str}`; - } - }; - this.to_hex = function(num) { - if (typeof num === "string") { - num = num.charCodeAt(0); - } - return num.toString(16); - }; - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/constructor.js -var require_constructor = __commonJS({ - "node_modules/yaml-js/lib/constructor.js"(exports) { - (function() { - var MarkedYAMLError, nodes, util, { indexOf } = []; - ({ MarkedYAMLError } = require_errors()); - nodes = require_nodes(); - util = require_util(); - this.ConstructorError = class ConstructorError extends MarkedYAMLError { - }; - this.BaseConstructor = (function() { - var ctor; - class BaseConstructor { - constructor() { - return ctor.apply(this, arguments); - } - /* - Add a constructor function for a specific tag. - - The constructor will be used to turn {Node Nodes} with the given tag into a Javascript object. - - @param tag {String} The tag for which the constructor should apply. - @param constructor {Function} A function that turns a {Node} with the given tag into a - Javascript object. - @return {Function} Returns the supplied `constructor`. - */ - static add_constructor(tag, constructor) { - if (!this.prototype.hasOwnProperty("yaml_constructors")) { - this.prototype.yaml_constructors = util.extend({}, this.prototype.yaml_constructors); - } - return this.prototype.yaml_constructors[tag] = constructor; - } - /* - Add a constructor function for a tag prefix. - - The constructor will be used to turn {Node Nodes} with the given tag prefix into a Javascript - object. - - @param tag_prefix {String} The tag prefix for which the constructor should apply. - @param multi_constructor {Function} A function that turns a {Node} with the given tag - prefix into a Javascript object. - @return {Function} Returns the supplied `multi_constructor`. - */ - static add_multi_constructor(tag_prefix, multi_constructor) { - if (!this.prototype.hasOwnProperty("yaml_multi_constructors")) { - this.prototype.yaml_multi_constructors = util.extend({}, this.prototype.yaml_multi_constructors); - } - return this.prototype.yaml_multi_constructors[tag_prefix] = multi_constructor; - } - /* - Initialise a new instance. - */ - initialise() { - this.constructed_objects = {}; - this.constructing_nodes = []; - return this.deferred_constructors = []; - } - /* - Checks if a document can be constructed from the representation stream. - - So long as the representation stream hasn't ended, another document can be constructed. - - @return {Boolean} True if a document can be constructed, false otherwise. - */ - check_data() { - return this.check_node(); - } - /* - Construct a document from the remaining representation stream. - - {Constructor#check_data} must be called before calling this method. - - @return {any} The next document in the stream. Returns `undefined` if the stream has ended. - */ - get_data() { - if (this.check_node()) { - return this.construct_document(this.get_node()); - } - } - /* - Construct a single document from the entire representation stream. - - @throw {ComposerError} if there's more than one document is in the stream. - - @return {Node} The single document in the stream. - */ - get_single_data() { - var node; - node = this.get_single_node(); - if (node != null) { - return this.construct_document(node); - } - return null; - } - /* - Construct a document node - - @private - */ - construct_document(node) { - var data; - data = this.construct_object(node); - while (!util.is_empty(this.deferred_constructors)) { - this.deferred_constructors.pop()(); - } - return data; - } - defer(f) { - return this.deferred_constructors.push(f); - } - construct_object(node) { - var constructor, object, ref, tag_prefix, tag_suffix; - if (node.unique_id in this.constructed_objects) { - return this.constructed_objects[node.unique_id]; - } - if (ref = node.unique_id, indexOf.call(this.constructing_nodes, ref) >= 0) { - throw new exports.ConstructorError(null, null, "found unconstructable recursive node", node.start_mark); - } - this.constructing_nodes.push(node.unique_id); - constructor = null; - tag_suffix = null; - if (node.tag in this.yaml_constructors) { - constructor = this.yaml_constructors[node.tag]; - } else { - for (tag_prefix in this.yaml_multi_constructors) { - if (node.tag.indexOf(tag_prefix === 0)) { - tag_suffix = node.tag.slice(tag_prefix.length); - constructor = this.yaml_multi_constructors[tag_prefix]; - break; - } - } - if (constructor == null) { - if (null in this.yaml_multi_constructors) { - tag_suffix = node.tag; - constructor = this.yaml_multi_constructors.null; - } else if (null in this.yaml_constructors) { - constructor = this.yaml_constructors.null; - } else if (node instanceof nodes.ScalarNode) { - constructor = this.construct_scalar; - } else if (node instanceof nodes.SequenceNode) { - constructor = this.construct_sequence; - } else if (node instanceof nodes.MappingNode) { - constructor = this.construct_mapping; - } - } - } - object = constructor.call(this, tag_suffix != null ? tag_suffix : node, node); - this.constructed_objects[node.unique_id] = object; - this.constructing_nodes.pop(); - return object; - } - construct_scalar(node) { - if (!(node instanceof nodes.ScalarNode)) { - throw new exports.ConstructorError(null, null, `expected a scalar node but found ${node.id}`, node.start_mark); - } - return node.value; - } - construct_sequence(node) { - var child, i, len, ref, results; - if (!(node instanceof nodes.SequenceNode)) { - throw new exports.ConstructorError(null, null, `expected a sequence node but found ${node.id}`, node.start_mark); - } - ref = node.value; - results = []; - for (i = 0, len = ref.length; i < len; i++) { - child = ref[i]; - results.push(this.construct_object(child)); - } - return results; - } - construct_mapping(node) { - var i, key, key_node, len, mapping, ref, value, value_node; - if (!(node instanceof nodes.MappingNode)) { - throw new ConstructorError(null, null, `expected a mapping node but found ${node.id}`, node.start_mark); - } - mapping = {}; - ref = node.value; - for (i = 0, len = ref.length; i < len; i++) { - [key_node, value_node] = ref[i]; - key = this.construct_object(key_node); - if (typeof key === "object") { - throw new exports.ConstructorError("while constructing a mapping", node.start_mark, "found unhashable key", key_node.start_mark); - } - value = this.construct_object(value_node); - mapping[key] = value; - } - return mapping; - } - construct_pairs(node) { - var i, key, key_node, len, pairs, ref, value, value_node; - if (!(node instanceof nodes.MappingNode)) { - throw new exports.ConstructorError(null, null, `expected a mapping node but found ${node.id}`, node.start_mark); - } - pairs = []; - ref = node.value; - for (i = 0, len = ref.length; i < len; i++) { - [key_node, value_node] = ref[i]; - key = this.construct_object(key_node); - value = this.construct_object(value_node); - pairs.push([key, value]); - } - return pairs; - } - } - - BaseConstructor.prototype.yaml_constructors = {}; - BaseConstructor.prototype.yaml_multi_constructors = {}; - ctor = BaseConstructor.prototype.initialise; - return BaseConstructor; - }).call(this); - this.Constructor = (function() { - var BOOL_VALUES, TIMESTAMP_PARTS, TIMESTAMP_REGEX; - class Constructor extends this.BaseConstructor { - construct_scalar(node) { - var i, key_node, len, ref, value_node; - if (node instanceof nodes.MappingNode) { - ref = node.value; - for (i = 0, len = ref.length; i < len; i++) { - [key_node, value_node] = ref[i]; - if (key_node.tag === "tag:yaml.org,2002:value") { - return this.construct_scalar(value_node); - } - } - } - return super.construct_scalar(node); - } - flatten_mapping(node) { - var i, index, j, key_node, len, len1, merge, ref, submerge, subnode, value, value_node; - merge = []; - index = 0; - while (index < node.value.length) { - [key_node, value_node] = node.value[index]; - if (key_node.tag === "tag:yaml.org,2002:merge") { - node.value.splice(index, 1); - if (value_node instanceof nodes.MappingNode) { - this.flatten_mapping(value_node); - merge = merge.concat(value_node.value); - } else if (value_node instanceof nodes.SequenceNode) { - submerge = []; - ref = value_node.value; - for (i = 0, len = ref.length; i < len; i++) { - subnode = ref[i]; - if (!(subnode instanceof nodes.MappingNode)) { - throw new exports.ConstructorError("while constructing a mapping", node.start_mark, `expected a mapping for merging, but found ${subnode.id}`, subnode.start_mark); - } - this.flatten_mapping(subnode); - submerge.push(subnode.value); - } - submerge.reverse(); - for (j = 0, len1 = submerge.length; j < len1; j++) { - value = submerge[j]; - merge = merge.concat(value); - } - } else { - throw new exports.ConstructorError("while constructing a mapping", node.start_mark, `expected a mapping or list of mappings for merging but found ${value_node.id}`, value_node.start_mark); - } - } else if (key_node.tag === "tag:yaml.org,2002:value") { - key_node.tag = "tag:yaml.org,2002:str"; - index++; - } else { - index++; - } - } - if (merge.length) { - return node.value = merge.concat(node.value); - } - } - construct_mapping(node) { - if (node instanceof nodes.MappingNode) { - this.flatten_mapping(node); - } - return super.construct_mapping(node); - } - construct_yaml_null(node) { - this.construct_scalar(node); - return null; - } - construct_yaml_bool(node) { - var value; - value = this.construct_scalar(node); - return BOOL_VALUES[value.toLowerCase()]; - } - construct_yaml_int(node) { - var base, digit, digits, i, len, part, ref, sign, value; - value = this.construct_scalar(node); - value = value.replace(/_/g, ""); - sign = value[0] === "-" ? -1 : 1; - if (ref = value[0], indexOf.call("+-", ref) >= 0) { - value = value.slice(1); - } - if (value === "0") { - return 0; - } else if (value.indexOf("0b") === 0) { - return sign * parseInt(value.slice(2), 2); - } else if (value.indexOf("0x") === 0) { - return sign * parseInt(value.slice(2), 16); - } else if (value.indexOf("0o") === 0) { - return sign * parseInt(value.slice(2), 8); - } else if (value[0] === "0") { - return sign * parseInt(value, 8); - } else if (indexOf.call(value, ":") >= 0) { - digits = (function() { - var i2, len2, ref1, results; - ref1 = value.split(/:/g); - results = []; - for (i2 = 0, len2 = ref1.length; i2 < len2; i2++) { - part = ref1[i2]; - results.push(parseInt(part)); - } - return results; - })(); - digits.reverse(); - base = 1; - value = 0; - for (i = 0, len = digits.length; i < len; i++) { - digit = digits[i]; - value += digit * base; - base *= 60; - } - return sign * value; - } else { - return sign * parseInt(value); - } - } - construct_yaml_float(node) { - var base, digit, digits, i, len, part, ref, sign, value; - value = this.construct_scalar(node); - value = value.replace(/_/g, "").toLowerCase(); - sign = value[0] === "-" ? -1 : 1; - if (ref = value[0], indexOf.call("+-", ref) >= 0) { - value = value.slice(1); - } - if (value === ".inf") { - return sign * Infinity; - } else if (value === ".nan") { - return 0 / 0; - } else if (indexOf.call(value, ":") >= 0) { - digits = (function() { - var i2, len2, ref1, results; - ref1 = value.split(/:/g); - results = []; - for (i2 = 0, len2 = ref1.length; i2 < len2; i2++) { - part = ref1[i2]; - results.push(parseFloat(part)); - } - return results; - })(); - digits.reverse(); - base = 1; - value = 0; - for (i = 0, len = digits.length; i < len; i++) { - digit = digits[i]; - value += digit * base; - base *= 60; - } - return sign * value; - } else { - return sign * parseFloat(value); - } - } - construct_yaml_binary(node) { - var error, value; - value = this.construct_scalar(node); - try { - if (typeof window !== "undefined" && window !== null) { - return atob(value); - } - return new Buffer(value, "base64").toString("ascii"); - } catch (error1) { - error = error1; - throw new exports.ConstructorError(null, null, `failed to decode base64 data: ${error}`, node.start_mark); - } - } - construct_yaml_timestamp(node) { - var date, day, fraction, hour, index, key, match, millisecond, minute, month, second, tz_hour, tz_minute, tz_sign, value, values, year; - value = this.construct_scalar(node); - match = node.value.match(TIMESTAMP_REGEX); - values = {}; - for (key in TIMESTAMP_PARTS) { - index = TIMESTAMP_PARTS[key]; - values[key] = match[index]; - } - year = parseInt(values.year); - month = parseInt(values.month) - 1; - day = parseInt(values.day); - if (!values.hour) { - return new Date(Date.UTC(year, month, day)); - } - hour = parseInt(values.hour); - minute = parseInt(values.minute); - second = parseInt(values.second); - millisecond = 0; - if (values.fraction) { - fraction = values.fraction.slice(0, 6); - while (fraction.length < 6) { - fraction += "0"; - } - fraction = parseInt(fraction); - millisecond = Math.round(fraction / 1e3); - } - if (values.tz_sign) { - tz_sign = values.tz_sign === "-" ? 1 : -1; - if (tz_hour = parseInt(values.tz_hour)) { - hour += tz_sign * tz_hour; - } - if (tz_minute = parseInt(values.tz_minute)) { - minute += tz_sign * tz_minute; - } - } - date = new Date(Date.UTC(year, month, day, hour, minute, second, millisecond)); - return date; - } - construct_yaml_pair_list(type, node) { - var list; - list = []; - if (!(node instanceof nodes.SequenceNode)) { - throw new exports.ConstructorError(`while constructing ${type}`, node.start_mark, `expected a sequence but found ${node.id}`, node.start_mark); - } - this.defer(() => { - var i, key, key_node, len, ref, results, subnode, value, value_node; - ref = node.value; - results = []; - for (i = 0, len = ref.length; i < len; i++) { - subnode = ref[i]; - if (!(subnode instanceof nodes.MappingNode)) { - throw new exports.ConstructorError(`while constructing ${type}`, node.start_mark, `expected a mapping of length 1 but found ${subnode.id}`, subnode.start_mark); - } - if (subnode.value.length !== 1) { - throw new exports.ConstructorError(`while constructing ${type}`, node.start_mark, `expected a mapping of length 1 but found ${subnode.id}`, subnode.start_mark); - } - [key_node, value_node] = subnode.value[0]; - key = this.construct_object(key_node); - value = this.construct_object(value_node); - results.push(list.push([key, value])); - } - return results; - }); - return list; - } - construct_yaml_omap(node) { - return this.construct_yaml_pair_list("an ordered map", node); - } - construct_yaml_pairs(node) { - return this.construct_yaml_pair_list("pairs", node); - } - construct_yaml_set(node) { - var data; - data = []; - this.defer(() => { - var item, results; - results = []; - for (item in this.construct_mapping(node)) { - results.push(data.push(item)); - } - return results; - }); - return data; - } - construct_yaml_str(node) { - return this.construct_scalar(node); - } - construct_yaml_seq(node) { - var data; - data = []; - this.defer(() => { - var i, item, len, ref, results; - ref = this.construct_sequence(node); - results = []; - for (i = 0, len = ref.length; i < len; i++) { - item = ref[i]; - results.push(data.push(item)); - } - return results; - }); - return data; - } - construct_yaml_map(node) { - var data; - data = {}; - this.defer(() => { - var key, ref, results, value; - ref = this.construct_mapping(node); - results = []; - for (key in ref) { - value = ref[key]; - results.push(data[key] = value); - } - return results; - }); - return data; - } - construct_yaml_object(node, klass) { - var data; - data = new klass(); - this.defer(() => { - var key, ref, results, value; - ref = this.construct_mapping(node, true); - results = []; - for (key in ref) { - value = ref[key]; - results.push(data[key] = value); - } - return results; - }); - return data; - } - construct_undefined(node) { - throw new exports.ConstructorError(null, null, `could not determine a constructor for the tag ${node.tag}`, node.start_mark); - } - } - - BOOL_VALUES = { - on: true, - off: false, - true: true, - false: false, - yes: true, - no: false - }; - TIMESTAMP_REGEX = /^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[\x20\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\.([0-9]*))?(?:[\x20\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$/; - TIMESTAMP_PARTS = { - year: 1, - month: 2, - day: 3, - hour: 4, - minute: 5, - second: 6, - fraction: 7, - tz: 8, - tz_sign: 9, - tz_hour: 10, - tz_minute: 11 - }; - return Constructor; - }).call(this); - this.Constructor.add_constructor("tag:yaml.org,2002:null", this.Constructor.prototype.construct_yaml_null); - this.Constructor.add_constructor("tag:yaml.org,2002:bool", this.Constructor.prototype.construct_yaml_bool); - this.Constructor.add_constructor("tag:yaml.org,2002:int", this.Constructor.prototype.construct_yaml_int); - this.Constructor.add_constructor("tag:yaml.org,2002:float", this.Constructor.prototype.construct_yaml_float); - this.Constructor.add_constructor("tag:yaml.org,2002:binary", this.Constructor.prototype.construct_yaml_binary); - this.Constructor.add_constructor("tag:yaml.org,2002:timestamp", this.Constructor.prototype.construct_yaml_timestamp); - this.Constructor.add_constructor("tag:yaml.org,2002:omap", this.Constructor.prototype.construct_yaml_omap); - this.Constructor.add_constructor("tag:yaml.org,2002:pairs", this.Constructor.prototype.construct_yaml_pairs); - this.Constructor.add_constructor("tag:yaml.org,2002:set", this.Constructor.prototype.construct_yaml_set); - this.Constructor.add_constructor("tag:yaml.org,2002:str", this.Constructor.prototype.construct_yaml_str); - this.Constructor.add_constructor("tag:yaml.org,2002:seq", this.Constructor.prototype.construct_yaml_seq); - this.Constructor.add_constructor("tag:yaml.org,2002:map", this.Constructor.prototype.construct_yaml_map); - this.Constructor.add_constructor(null, this.Constructor.prototype.construct_undefined); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/emitter.js -var require_emitter = __commonJS({ - "node_modules/yaml-js/lib/emitter.js"(exports) { - (function() { - var ScalarAnalysis, YAMLError, events, util, hasProp = {}.hasOwnProperty, { indexOf } = []; - events = require_events(); - util = require_util(); - ({ YAMLError } = require_errors()); - this.EmitterError = class EmitterError extends YAMLError { - }; - this.Emitter = (function() { - var C_WHITESPACE, DEFAULT_TAG_PREFIXES, ESCAPE_REPLACEMENTS, ctor; - class Emitter { - constructor() { - return ctor.apply(this, arguments); - } - initialise(stream, options) { - var ref; - this.stream = stream; - this.encoding = null; - this.states = []; - this.state = this.expect_stream_start; - this.events = []; - this.event = null; - this.indents = []; - this.indent = null; - this.flow_level = 0; - this.root_context = false; - this.sequence_context = false; - this.mapping_context = false; - this.simple_key_context = false; - this.line = 0; - this.column = 0; - this.whitespace = true; - this.indentation = true; - this.open_ended = false; - ({ canonical: this.canonical, allow_unicode: this.allow_unicode } = options); - if (this.canonical == null) { - this.canonical = false; - } - if (this.allow_unicode == null) { - this.allow_unicode = true; - } - this.best_indent = options.indent > 1 && options.indent < 10 ? options.indent : 2; - this.best_width = options.width > this.indent * 2 ? options.width : 80; - this.best_line_break = (ref = options.line_break) === "\r" || ref === "\n" || ref === "\r\n" ? options.line_break : "\n"; - this.tag_prefixes = null; - this.prepared_anchor = null; - this.prepared_tag = null; - this.analysis = null; - return this.style = null; - } - /* - Reset the state attributes (to clear self-references) - */ - dispose() { - this.states = []; - return this.state = null; - } - emit(event) { - var results; - this.events.push(event); - results = []; - while (!this.need_more_events()) { - this.event = this.events.shift(); - this.state(); - results.push(this.event = null); - } - return results; - } - /* - In some cases, we wait for a few next events before emitting. - */ - need_more_events() { - var event; - if (this.events.length === 0) { - return true; - } - event = this.events[0]; - if (event instanceof events.DocumentStartEvent) { - return this.need_events(1); - } else if (event instanceof events.SequenceStartEvent) { - return this.need_events(2); - } else if (event instanceof events.MappingStartEvent) { - return this.need_events(3); - } else { - return false; - } - } - need_events(count) { - var event, i, len, level, ref; - level = 0; - ref = this.events.slice(1); - for (i = 0, len = ref.length; i < len; i++) { - event = ref[i]; - if (event instanceof events.DocumentStartEvent || event instanceof events.CollectionStartEvent) { - level++; - } else if (event instanceof events.DocumentEndEvent || event instanceof events.CollectionEndEvent) { - level--; - } else if (event instanceof events.StreamEndEvent) { - level = -1; - } - if (level < 0) { - return false; - } - } - return this.events.length < count + 1; - } - increase_indent(options = {}) { - this.indents.push(this.indent); - if (this.indent == null) { - return this.indent = options.flow ? this.best_indent : 0; - } else if (!options.indentless) { - return this.indent += this.best_indent; - } - } - // Stream states - expect_stream_start() { - if (this.event instanceof events.StreamStartEvent) { - if (this.event.encoding && !("encoding" in this.stream)) { - this.encoding = this.event.encoding; - } - this.write_stream_start(); - return this.state = this.expect_first_document_start; - } else { - return this.error("expected StreamStartEvent, but got", this.event); - } - } - expect_nothing() { - return this.error("expected nothing, but got", this.event); - } - // Document states - expect_first_document_start() { - return this.expect_document_start(true); - } - expect_document_start(first = false) { - var explicit, handle, i, k, len, prefix, ref; - if (this.event instanceof events.DocumentStartEvent) { - if ((this.event.version || this.event.tags) && this.open_ended) { - this.write_indicator("...", true); - this.write_indent(); - } - if (this.event.version) { - this.write_version_directive(this.prepare_version(this.event.version)); - } - this.tag_prefixes = util.clone(DEFAULT_TAG_PREFIXES); - if (this.event.tags) { - ref = (function() { - var ref2, results; - ref2 = this.event.tags; - results = []; - for (k in ref2) { - if (!hasProp.call(ref2, k)) continue; - results.push(k); - } - return results; - }).call(this).sort(); - for (i = 0, len = ref.length; i < len; i++) { - handle = ref[i]; - prefix = this.event.tags[handle]; - this.tag_prefixes[prefix] = handle; - this.write_tag_directive(this.prepare_tag_handle(handle), this.prepare_tag_prefix(prefix)); - } - } - explicit = !first || this.event.explicit || this.canonical || this.event.version || this.event.tags || this.check_empty_document(); - if (explicit) { - this.write_indent(); - this.write_indicator("---", true); - if (this.canonical) { - this.write_indent(); - } - } - return this.state = this.expect_document_root; - } else if (this.event instanceof events.StreamEndEvent) { - if (this.open_ended) { - this.write_indicator("...", true); - this.write_indent(); - } - this.write_stream_end(); - return this.state = this.expect_nothing; - } else { - return this.error("expected DocumentStartEvent, but got", this.event); - } - } - expect_document_end() { - if (this.event instanceof events.DocumentEndEvent) { - this.write_indent(); - if (this.event.explicit) { - this.write_indicator("...", true); - this.write_indent(); - } - this.flush_stream(); - return this.state = this.expect_document_start; - } else { - return this.error("expected DocumentEndEvent, but got", this.event); - } - } - expect_document_root() { - this.states.push(this.expect_document_end); - return this.expect_node({ - root: true - }); - } - // Node states - expect_node(expect = {}) { - this.root_context = !!expect.root; - this.sequence_context = !!expect.sequence; - this.mapping_context = !!expect.mapping; - this.simple_key_context = !!expect.simple_key; - if (this.event instanceof events.AliasEvent) { - return this.expect_alias(); - } else if (this.event instanceof events.ScalarEvent || this.event instanceof events.CollectionStartEvent) { - this.process_anchor("&"); - this.process_tag(); - if (this.event instanceof events.ScalarEvent) { - return this.expect_scalar(); - } else if (this.event instanceof events.SequenceStartEvent) { - if (this.flow_level || this.canonical || this.event.flow_style || this.check_empty_sequence()) { - return this.expect_flow_sequence(); - } else { - return this.expect_block_sequence(); - } - } else if (this.event instanceof events.MappingStartEvent) { - if (this.flow_level || this.canonical || this.event.flow_style || this.check_empty_mapping()) { - return this.expect_flow_mapping(); - } else { - return this.expect_block_mapping(); - } - } - } else { - return this.error("expected NodeEvent, but got", this.event); - } - } - expect_alias() { - if (!this.event.anchor) { - this.error("anchor is not specified for alias"); - } - this.process_anchor("*"); - return this.state = this.states.pop(); - } - expect_scalar() { - this.increase_indent({ - flow: true - }); - this.process_scalar(); - this.indent = this.indents.pop(); - return this.state = this.states.pop(); - } - // Flow sequence states - expect_flow_sequence() { - this.write_indicator("[", true, { - whitespace: true - }); - this.flow_level++; - this.increase_indent({ - flow: true - }); - return this.state = this.expect_first_flow_sequence_item; - } - expect_first_flow_sequence_item() { - if (this.event instanceof events.SequenceEndEvent) { - this.indent = this.indents.pop(); - this.flow_level--; - this.write_indicator("]", false); - return this.state = this.states.pop(); - } else { - if (this.canonical || this.column > this.best_width) { - this.write_indent(); - } - this.states.push(this.expect_flow_sequence_item); - return this.expect_node({ - sequence: true - }); - } - } - expect_flow_sequence_item() { - if (this.event instanceof events.SequenceEndEvent) { - this.indent = this.indents.pop(); - this.flow_level--; - if (this.canonical) { - this.write_indicator(",", false); - this.write_indent(); - } - this.write_indicator("]", false); - return this.state = this.states.pop(); - } else { - this.write_indicator(",", false); - if (this.canonical || this.column > this.best_width) { - this.write_indent(); - } - this.states.push(this.expect_flow_sequence_item); - return this.expect_node({ - sequence: true - }); - } - } - // Flow mapping states - expect_flow_mapping() { - this.write_indicator("{", true, { - whitespace: true - }); - this.flow_level++; - this.increase_indent({ - flow: true - }); - return this.state = this.expect_first_flow_mapping_key; - } - expect_first_flow_mapping_key() { - if (this.event instanceof events.MappingEndEvent) { - this.indent = this.indents.pop(); - this.flow_level--; - this.write_indicator("}", false); - return this.state = this.states.pop(); - } else { - if (this.canonical || this.column > this.best_width) { - this.write_indent(); - } - if (!this.canonical && this.check_simple_key()) { - this.states.push(this.expect_flow_mapping_simple_value); - return this.expect_node({ - mapping: true, - simple_key: true - }); - } else { - this.write_indicator("?", true); - this.states.push(this.expect_flow_mapping_value); - return this.expect_node({ - mapping: true - }); - } - } - } - expect_flow_mapping_key() { - if (this.event instanceof events.MappingEndEvent) { - this.indent = this.indents.pop(); - this.flow_level--; - if (this.canonical) { - this.write_indicator(",", false); - this.write_indent(); - } - this.write_indicator("}", false); - return this.state = this.states.pop(); - } else { - this.write_indicator(",", false); - if (this.canonical || this.column > this.best_width) { - this.write_indent(); - } - if (!this.canonical && this.check_simple_key()) { - this.states.push(this.expect_flow_mapping_simple_value); - return this.expect_node({ - mapping: true, - simple_key: true - }); - } else { - this.write_indicator("?", true); - this.states.push(this.expect_flow_mapping_value); - return this.expect_node({ - mapping: true - }); - } - } - } - expect_flow_mapping_simple_value() { - this.write_indicator(":", false); - this.states.push(this.expect_flow_mapping_key); - return this.expect_node({ - mapping: true - }); - } - expect_flow_mapping_value() { - if (this.canonical || this.column > this.best_width) { - this.write_indent(); - } - this.write_indicator(":", true); - this.states.push(this.expect_flow_mapping_key); - return this.expect_node({ - mapping: true - }); - } - // Block sequence states - expect_block_sequence() { - var indentless; - indentless = this.mapping_context && !this.indentation; - this.increase_indent({ indentless }); - return this.state = this.expect_first_block_sequence_item; - } - expect_first_block_sequence_item() { - return this.expect_block_sequence_item(true); - } - expect_block_sequence_item(first = false) { - if (!first && this.event instanceof events.SequenceEndEvent) { - this.indent = this.indents.pop(); - return this.state = this.states.pop(); - } else { - this.write_indent(); - this.write_indicator("-", true, { - indentation: true - }); - this.states.push(this.expect_block_sequence_item); - return this.expect_node({ - sequence: true - }); - } - } - // Block mapping states - expect_block_mapping() { - this.increase_indent(); - return this.state = this.expect_first_block_mapping_key; - } - expect_first_block_mapping_key() { - return this.expect_block_mapping_key(true); - } - expect_block_mapping_key(first = false) { - if (!first && this.event instanceof events.MappingEndEvent) { - this.indent = this.indents.pop(); - return this.state = this.states.pop(); - } else { - this.write_indent(); - if (this.check_simple_key()) { - this.states.push(this.expect_block_mapping_simple_value); - return this.expect_node({ - mapping: true, - simple_key: true - }); - } else { - this.write_indicator("?", true, { - indentation: true - }); - this.states.push(this.expect_block_mapping_value); - return this.expect_node({ - mapping: true - }); - } - } - } - expect_block_mapping_simple_value() { - this.write_indicator(":", false); - this.states.push(this.expect_block_mapping_key); - return this.expect_node({ - mapping: true - }); - } - expect_block_mapping_value() { - this.write_indent(); - this.write_indicator(":", true, { - indentation: true - }); - this.states.push(this.expect_block_mapping_key); - return this.expect_node({ - mapping: true - }); - } - // Checkers - check_empty_document() { - var event; - if (!(this.event instanceof events.DocumentStartEvent) || this.events.length === 0) { - return false; - } - event = this.events[0]; - return event instanceof events.ScalarEvent && event.anchor == null && event.tag == null && event.implicit && event.value === ""; - } - check_empty_sequence() { - return this.event instanceof events.SequenceStartEvent && this.events[0] instanceof events.SequenceEndEvent; - } - check_empty_mapping() { - return this.event instanceof events.MappingStartEvent && this.events[0] instanceof events.MappingEndEvent; - } - check_simple_key() { - var length; - length = 0; - if (this.event instanceof events.NodeEvent && this.event.anchor != null) { - if (this.prepared_anchor == null) { - this.prepared_anchor = this.prepare_anchor(this.event.anchor); - } - length += this.prepared_anchor.length; - } - if (this.event.tag != null && (this.event instanceof events.ScalarEvent || this.event instanceof events.CollectionStartEvent)) { - if (this.prepared_tag == null) { - this.prepared_tag = this.prepare_tag(this.event.tag); - } - length += this.prepared_tag.length; - } - if (this.event instanceof events.ScalarEvent) { - if (this.analysis == null) { - this.analysis = this.analyze_scalar(this.event.value); - } - length += this.analysis.scalar.length; - } - return length < 128 && (this.event instanceof events.AliasEvent || this.event instanceof events.ScalarEvent && !this.analysis.empty && !this.analysis.multiline || this.check_empty_sequence() || this.check_empty_mapping()); - } - // Anchor, Tag and Scalar processors - process_anchor(indicator) { - if (this.event.anchor == null) { - this.prepared_anchor = null; - return; - } - if (this.prepared_anchor == null) { - this.prepared_anchor = this.prepare_anchor(this.event.anchor); - } - if (this.prepared_anchor) { - this.write_indicator(`${indicator}${this.prepared_anchor}`, true); - } - return this.prepared_anchor = null; - } - process_tag() { - var tag; - tag = this.event.tag; - if (this.event instanceof events.ScalarEvent) { - if (this.style == null) { - this.style = this.choose_scalar_style(); - } - if ((!this.canonical || tag == null) && (this.style === "" && this.event.implicit[0] || this.style !== "" && this.event.implicit[1])) { - this.prepared_tag = null; - return; - } - if (this.event.implicit[0] && tag == null) { - tag = "!"; - this.prepared_tag = null; - } - } else if ((!this.canonical || tag == null) && this.event.implicit) { - this.prepared_tag = null; - return; - } - if (tag == null) { - this.error("tag is not specified"); - } - if (this.prepared_tag == null) { - this.prepared_tag = this.prepare_tag(tag); - } - this.write_indicator(this.prepared_tag, true); - return this.prepared_tag = null; - } - process_scalar() { - var split; - if (this.analysis == null) { - this.analysis = this.analyze_scalar(this.event.value); - } - if (this.style == null) { - this.style = this.choose_scalar_style(); - } - split = !this.simple_key_context; - switch (this.style) { - case '"': - this.write_double_quoted(this.analysis.scalar, split); - break; - case "'": - this.write_single_quoted(this.analysis.scalar, split); - break; - case ">": - this.write_folded(this.analysis.scalar); - break; - case "|": - this.write_literal(this.analysis.scalar); - break; - default: - this.write_plain(this.analysis.scalar, split); - } - this.analysis = null; - return this.style = null; - } - choose_scalar_style() { - var ref; - if (this.analysis == null) { - this.analysis = this.analyze_scalar(this.event.value); - } - if (this.event.style === '"' || this.canonical) { - return '"'; - } - if (!this.event.style && this.event.implicit[0] && !(this.simple_key_context && (this.analysis.empty || this.analysis.multiline)) && (this.flow_level && this.analysis.allow_flow_plain || !this.flow_level && this.analysis.allow_block_plain)) { - return ""; - } - if (this.event.style && (ref = this.event.style, indexOf.call("|>", ref) >= 0) && !this.flow_level && !this.simple_key_context && this.analysis.allow_block) { - return this.event.style; - } - if ((!this.event.style || this.event.style === "'") && this.analysis.allow_single_quoted && !(this.simple_key_context && this.analysis.multiline)) { - return "'"; - } - return '"'; - } - // Analyzers - prepare_version([major, minor]) { - var version; - version = `${major}.${minor}`; - if (major === 1) { - return version; - } else { - return this.error("unsupported YAML version", version); - } - } - prepare_tag_handle(handle) { - var char, i, len, ref; - if (!handle) { - this.error("tag handle must not be empty"); - } - if (handle[0] !== "!" || handle.slice(-1) !== "!") { - this.error("tag handle must start and end with '!':", handle); - } - ref = handle.slice(1, -1); - for (i = 0, len = ref.length; i < len; i++) { - char = ref[i]; - if (!(char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0)) { - this.error(`invalid character '${char}' in the tag handle:`, handle); - } - } - return handle; - } - prepare_tag_prefix(prefix) { - var char, chunks, end, start; - if (!prefix) { - this.error("tag prefix must not be empty"); - } - chunks = []; - start = 0; - end = +(prefix[0] === "!"); - while (end < prefix.length) { - char = prefix[end]; - if (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-;/?!:@&=+$,_.~*'()[]", char) >= 0) { - end++; - } else { - if (start < end) { - chunks.push(prefix.slice(start, end)); - } - start = end += 1; - chunks.push(char); - } - } - if (start < end) { - chunks.push(prefix.slice(start, end)); - } - return chunks.join(""); - } - prepare_tag(tag) { - var char, chunks, end, handle, i, k, len, prefix, ref, start, suffix, suffix_text; - if (!tag) { - this.error("tag must not be empty"); - } - if (tag === "!") { - return tag; - } - handle = null; - suffix = tag; - ref = (function() { - var ref2, results; - ref2 = this.tag_prefixes; - results = []; - for (k in ref2) { - if (!hasProp.call(ref2, k)) continue; - results.push(k); - } - return results; - }).call(this).sort(); - for (i = 0, len = ref.length; i < len; i++) { - prefix = ref[i]; - if (tag.indexOf(prefix) === 0 && (prefix === "!" || prefix.length < tag.length)) { - handle = this.tag_prefixes[prefix]; - suffix = tag.slice(prefix.length); - } - } - chunks = []; - start = end = 0; - while (end < suffix.length) { - char = suffix[end]; - if (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-;/?!:@&=+$,_.~*'()[]", char) >= 0 || char === "!" && handle !== "!") { - end++; - } else { - if (start < end) { - chunks.push(suffix.slice(start, end)); - } - start = end += 1; - chunks.push(char); - } - } - if (start < end) { - chunks.push(suffix.slice(start, end)); - } - suffix_text = chunks.join(""); - if (handle) { - return `${handle}${suffix_text}`; - } else { - return `!<${suffix_text}>`; - } - } - prepare_anchor(anchor) { - var char, i, len; - if (!anchor) { - this.error("anchor must not be empty"); - } - for (i = 0, len = anchor.length; i < len; i++) { - char = anchor[i]; - if (!(char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0)) { - this.error(`invalid character '${char}' in the anchor:`, anchor); - } - } - return anchor; - } - analyze_scalar(scalar) { - var allow_block, allow_block_plain, allow_double_quoted, allow_flow_plain, allow_single_quoted, block_indicators, break_space, char, flow_indicators, followed_by_whitespace, i, index, leading_break, leading_space, len, line_breaks, preceded_by_whitespace, previous_break, previous_space, ref, ref1, space_break, special_characters, trailing_break, trailing_space, unicode_characters; - if (!scalar) { - new ScalarAnalysis(scalar, true, false, false, true, true, true, false); - } - block_indicators = false; - flow_indicators = false; - line_breaks = false; - special_characters = false; - unicode_characters = false; - leading_space = false; - leading_break = false; - trailing_space = false; - trailing_break = false; - break_space = false; - space_break = false; - if (scalar.indexOf("---") === 0 || scalar.indexOf("...") === 0) { - block_indicators = true; - flow_indicators = true; - } - preceded_by_whitespace = true; - followed_by_whitespace = scalar.length === 1 || (ref = scalar[1], indexOf.call("\0 \r\n\x85\u2028\u2029", ref) >= 0); - previous_space = false; - previous_break = false; - index = 0; - for (index = i = 0, len = scalar.length; i < len; index = ++i) { - char = scalar[index]; - if (index === 0) { - if (indexOf.call("#,[]{}&*!|>'\"%@`", char) >= 0 || char === "-" && followed_by_whitespace) { - flow_indicators = true; - block_indicators = true; - } else if (indexOf.call("?:", char) >= 0) { - flow_indicators = true; - if (followed_by_whitespace) { - block_indicators = true; - } - } - } else { - if (indexOf.call(",?[]{}", char) >= 0) { - flow_indicators = true; - } else if (char === ":") { - flow_indicators = true; - if (followed_by_whitespace) { - block_indicators = true; - } - } else if (char === "#" && preceded_by_whitespace) { - flow_indicators = true; - block_indicators = true; - } - } - if (indexOf.call("\n\x85\u2028\u2029", char) >= 0) { - line_breaks = true; - } - if (!(char === "\n" || char >= " " && char <= "~")) { - if (char !== "\uFEFF" && (char === "\x85" || char >= "\xA0" && char <= "\uD7FF" || char >= "\uE000" && char <= "\uFFFD")) { - unicode_characters = true; - if (!this.allow_unicode) { - special_characters = true; - } - } else { - special_characters = true; - } - } - if (char === " ") { - if (index === 0) { - leading_space = true; - } - if (index === scalar.length - 1) { - trailing_space = true; - } - if (previous_break) { - break_space = true; - } - previous_break = false; - previous_space = true; - } else if (indexOf.call("\n\x85\u2028\u2029", char) >= 0) { - if (index === 0) { - leading_break = true; - } - if (index === scalar.length - 1) { - trailing_break = true; - } - if (previous_space) { - space_break = true; - } - previous_break = true; - previous_space = false; - } else { - previous_break = false; - previous_space = false; - } - preceded_by_whitespace = indexOf.call(C_WHITESPACE, char) >= 0; - followed_by_whitespace = index + 2 >= scalar.length || (ref1 = scalar[index + 2], indexOf.call(C_WHITESPACE, ref1) >= 0); - } - allow_flow_plain = true; - allow_block_plain = true; - allow_single_quoted = true; - allow_double_quoted = true; - allow_block = true; - if (leading_space || leading_break || trailing_space || trailing_break) { - allow_flow_plain = allow_block_plain = false; - } - if (trailing_space) { - allow_block = false; - } - if (break_space) { - allow_flow_plain = allow_block_plain = allow_single_quoted = false; - } - if (space_break || special_characters) { - allow_flow_plain = allow_block_plain = allow_single_quoted = allow_block = false; - } - if (line_breaks) { - allow_flow_plain = allow_block_plain = false; - } - if (flow_indicators) { - allow_flow_plain = false; - } - if (block_indicators) { - allow_block_plain = false; - } - return new ScalarAnalysis(scalar, false, line_breaks, allow_flow_plain, allow_block_plain, allow_single_quoted, allow_double_quoted, allow_block); - } - // Writers - /* - Write BOM if needed. - */ - write_stream_start() { - if (this.encoding && this.encoding.indexOf("utf-16") === 0) { - return this.stream.write("\uFEFF", this.encoding); - } - } - write_stream_end() { - return this.flush_stream(); - } - write_indicator(indicator, need_whitespace, options = {}) { - var data; - data = this.whitespace || !need_whitespace ? indicator : " " + indicator; - this.whitespace = !!options.whitespace; - this.indentation && (this.indentation = !!options.indentation); - this.column += data.length; - this.open_ended = false; - return this.stream.write(data, this.encoding); - } - write_indent() { - var data, indent, ref; - indent = (ref = this.indent) != null ? ref : 0; - if (!this.indentation || this.column > indent || this.column === indent && !this.whitespace) { - this.write_line_break(); - } - if (this.column < indent) { - this.whitespace = true; - data = new Array(indent - this.column + 1).join(" "); - this.column = indent; - return this.stream.write(data, this.encoding); - } - } - write_line_break(data) { - this.whitespace = true; - this.indentation = true; - this.line += 1; - this.column = 0; - return this.stream.write(data != null ? data : this.best_line_break, this.encoding); - } - write_version_directive(version_text) { - this.stream.write(`%YAML ${version_text}`, this.encoding); - return this.write_line_break(); - } - write_tag_directive(handle_text, prefix_text) { - this.stream.write(`%TAG ${handle_text} ${prefix_text}`, this.encoding); - return this.write_line_break(); - } - write_single_quoted(text, split = true) { - var br, breaks, char, data, end, i, len, ref, spaces, start; - this.write_indicator("'", true); - spaces = false; - breaks = false; - start = end = 0; - while (end <= text.length) { - char = text[end]; - if (spaces) { - if (char == null || char !== " ") { - if (start + 1 === end && this.column > this.best_width && split && start !== 0 && end !== text.length) { - this.write_indent(); - } else { - data = text.slice(start, end); - this.column += data.length; - this.stream.write(data, this.encoding); - } - start = end; - } - } else if (breaks) { - if (char == null || indexOf.call("\n\x85\u2028\u2029", char) < 0) { - if (text[start] === "\n") { - this.write_line_break(); - } - ref = text.slice(start, end); - for (i = 0, len = ref.length; i < len; i++) { - br = ref[i]; - if (br === "\n") { - this.write_line_break(); - } else { - this.write_line_break(br); - } - } - this.write_indent(); - start = end; - } - } else if ((char == null || indexOf.call(" \n\x85\u2028\u2029", char) >= 0 || char === "'") && start < end) { - data = text.slice(start, end); - this.column += data.length; - this.stream.write(data, this.encoding); - start = end; - } - if (char === "'") { - this.column += 2; - this.stream.write("''", this.encoding); - start = end + 1; - } - if (char != null) { - spaces = char === " "; - breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; - } - end++; - } - return this.write_indicator("'", false); - } - write_double_quoted(text, split = true) { - var char, data, end, start; - this.write_indicator('"', true); - start = end = 0; - while (end <= text.length) { - char = text[end]; - if (char == null || indexOf.call('"\\\x85\u2028\u2029\uFEFF', char) >= 0 || !(char >= " " && char <= "~" || this.allow_unicode && (char >= "\xA0" && char <= "\uD7FF" || char >= "\uE000" && char <= "\uFFFD"))) { - if (start < end) { - data = text.slice(start, end); - this.column += data.length; - this.stream.write(data, this.encoding); - start = end; - } - if (char != null) { - data = char in ESCAPE_REPLACEMENTS ? "\\" + ESCAPE_REPLACEMENTS[char] : char <= "\xFF" ? `\\x${util.pad_left(util.to_hex(char), "0", 2)}` : char <= "\uFFFF" ? `\\u${util.pad_left(util.to_hex(char), "0", 4)}` : `\\U${util.pad_left(util.to_hex(char), "0", 16)}`; - this.column += data.length; - this.stream.write(data, this.encoding); - start = end + 1; - } - } - if (split && (end > 0 && end < text.length - 1) && (char === " " || start >= end) && this.column + (end - start) > this.best_width) { - data = `${text.slice(start, end)}\\`; - if (start < end) { - start = end; - } - this.column += data.length; - this.stream.write(data, this.encoding); - this.write_indent(); - this.whitespace = false; - this.indentation = false; - if (text[start] === " ") { - data = "\\"; - this.column += data.length; - this.stream.write(data, this.encoding); - } - } - end++; - } - return this.write_indicator('"', false); - } - write_folded(text) { - var br, breaks, char, data, end, hints, i, leading_space, len, ref, results, spaces, start; - hints = this.determine_block_hints(text); - this.write_indicator(`>${hints}`, true); - if (hints.slice(-1) === "+") { - this.open_ended = true; - } - this.write_line_break(); - leading_space = true; - breaks = true; - spaces = false; - start = end = 0; - results = []; - while (end <= text.length) { - char = text[end]; - if (breaks) { - if (char == null || indexOf.call("\n\x85\u2028\u2029", char) < 0) { - if (!leading_space && char != null && char !== " " && text[start] === "\n") { - this.write_line_break(); - } - leading_space = char === " "; - ref = text.slice(start, end); - for (i = 0, len = ref.length; i < len; i++) { - br = ref[i]; - if (br === "\n") { - this.write_line_break(); - } else { - this.write_line_break(br); - } - } - if (char != null) { - this.write_indent(); - } - start = end; - } - } else if (spaces) { - if (char !== " ") { - if (start + 1 === end && this.column > this.best_width) { - this.write_indent(); - } else { - data = text.slice(start, end); - this.column += data.length; - this.stream.write(data, this.encoding); - } - start = end; - } - } else if (char == null || indexOf.call(" \n\x85\u2028\u2029", char) >= 0) { - data = text.slice(start, end); - this.column += data.length; - this.stream.write(data, this.encoding); - if (char == null) { - this.write_line_break(); - } - start = end; - } - if (char != null) { - breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; - spaces = char === " "; - } - results.push(end++); - } - return results; - } - write_literal(text) { - var br, breaks, char, data, end, hints, i, len, ref, results, start; - hints = this.determine_block_hints(text); - this.write_indicator(`|${hints}`, true); - if (hints.slice(-1) === "+") { - this.open_ended = true; - } - this.write_line_break(); - breaks = true; - start = end = 0; - results = []; - while (end <= text.length) { - char = text[end]; - if (breaks) { - if (char == null || indexOf.call("\n\x85\u2028\u2029", char) < 0) { - ref = text.slice(start, end); - for (i = 0, len = ref.length; i < len; i++) { - br = ref[i]; - if (br === "\n") { - this.write_line_break(); - } else { - this.write_line_break(br); - } - } - if (char != null) { - this.write_indent(); - } - start = end; - } - } else { - if (char == null || indexOf.call("\n\x85\u2028\u2029", char) >= 0) { - data = text.slice(start, end); - this.stream.write(data, this.encoding); - if (char == null) { - this.write_line_break(); - } - start = end; - } - } - if (char != null) { - breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; - } - results.push(end++); - } - return results; - } - write_plain(text, split = true) { - var br, breaks, char, data, end, i, len, ref, results, spaces, start; - if (!text) { - return; - } - if (this.root_context) { - this.open_ended = true; - } - if (!this.whitespace) { - data = " "; - this.column += data.length; - this.stream.write(data, this.encoding); - } - this.whitespace = false; - this.indentation = false; - spaces = false; - breaks = false; - start = end = 0; - results = []; - while (end <= text.length) { - char = text[end]; - if (spaces) { - if (char !== " ") { - if (start + 1 === end && this.column > this.best_width && split) { - this.write_indent(); - this.whitespace = false; - this.indentation = false; - } else { - data = text.slice(start, end); - this.column += data.length; - this.stream.write(data, this.encoding); - } - start = end; - } - } else if (breaks) { - if (indexOf.call("\n\x85\u2028\u2029", char) < 0) { - if (text[start] === "\n") { - this.write_line_break(); - } - ref = text.slice(start, end); - for (i = 0, len = ref.length; i < len; i++) { - br = ref[i]; - if (br === "\n") { - this.write_line_break(); - } else { - this.write_line_break(br); - } - } - this.write_indent(); - this.whitespace = false; - this.indentation = false; - start = end; - } - } else { - if (char == null || indexOf.call(" \n\x85\u2028\u2029", char) >= 0) { - data = text.slice(start, end); - this.column += data.length; - this.stream.write(data, this.encoding); - start = end; - } - } - if (char != null) { - spaces = char === " "; - breaks = indexOf.call("\n\x85\u2028\u2029", char) >= 0; - } - results.push(end++); - } - return results; - } - determine_block_hints(text) { - var first, hints, i, last, penultimate; - hints = ""; - first = text[0], i = text.length - 2, penultimate = text[i++], last = text[i++]; - if (indexOf.call(" \n\x85\u2028\u2029", first) >= 0) { - hints += this.best_indent; - } - if (indexOf.call("\n\x85\u2028\u2029", last) < 0) { - hints += "-"; - } else if (text.length === 1 || indexOf.call("\n\x85\u2028\u2029", penultimate) >= 0) { - hints += "+"; - } - return hints; - } - flush_stream() { - var base; - return typeof (base = this.stream).flush === "function" ? base.flush() : void 0; - } - /* - Helper for common error pattern. - */ - error(message, context) { - var ref, ref1; - if (context) { - context = (ref = context != null ? (ref1 = context.constructor) != null ? ref1.name : void 0 : void 0) != null ? ref : util.inspect(context); - } - throw new exports.EmitterError(`${message}${context ? ` ${context}` : ""}`); - } - } - - C_WHITESPACE = "\0 \r\n\x85\u2028\u2029"; - DEFAULT_TAG_PREFIXES = { - "!": "!", - "tag:yaml.org,2002:": "!!" - }; - ESCAPE_REPLACEMENTS = { - "\0": "0", - "\x07": "a", - "\b": "b", - " ": "t", - "\n": "n", - "\v": "v", - "\f": "f", - "\r": "r", - "\x1B": "e", - '"': '"', - "\\": "\\", - "\x85": "N", - "\xA0": "_", - "\u2028": "L", - "\u2029": "P" - }; - ctor = Emitter.prototype.initialise; - return Emitter; - }).call(this); - ScalarAnalysis = class ScalarAnalysis { - constructor(scalar1, empty, multiline, allow_flow_plain1, allow_block_plain1, allow_single_quoted1, allow_double_quoted1, allow_block1) { - this.scalar = scalar1; - this.empty = empty; - this.multiline = multiline; - this.allow_flow_plain = allow_flow_plain1; - this.allow_block_plain = allow_block_plain1; - this.allow_single_quoted = allow_single_quoted1; - this.allow_double_quoted = allow_double_quoted1; - this.allow_block = allow_block1; - } - }; - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/serializer.js -var require_serializer = __commonJS({ - "node_modules/yaml-js/lib/serializer.js"(exports) { - (function() { - var YAMLError, events, nodes, util; - events = require_events(); - nodes = require_nodes(); - util = require_util(); - ({ YAMLError } = require_errors()); - this.SerializerError = class SerializerError extends YAMLError { - }; - this.Serializer = (function() { - var ctor; - class Serializer { - constructor() { - return ctor.apply(this, arguments); - } - initialise({ - encoding, - explicit_start, - explicit_end, - version, - tags - } = {}) { - this.encoding = encoding; - this.explicit_start = explicit_start; - this.explicit_end = explicit_end; - this.version = version; - this.tags = tags; - this.serialized_nodes = {}; - this.anchors = {}; - this.last_anchor_id = 0; - return this.closed = null; - } - open() { - if (this.closed === null) { - this.emit(new events.StreamStartEvent(this.encoding)); - return this.closed = false; - } else if (this.closed) { - throw new SerializerError("serializer is closed"); - } else { - throw new SerializerError("serializer is already open"); - } - } - close() { - if (this.closed === null) { - throw new SerializerError("serializer is not opened"); - } else if (!this.closed) { - this.emit(new events.StreamEndEvent()); - return this.closed = true; - } - } - serialize(node) { - if (this.closed === null) { - throw new SerializerError("serializer is not opened"); - } else if (this.closed) { - throw new SerializerError("serializer is closed"); - } - if (node != null) { - this.emit(new events.DocumentStartEvent(void 0, void 0, this.explicit_start, this.version, this.tags)); - this.anchor_node(node); - this.serialize_node(node); - this.emit(new events.DocumentEndEvent(void 0, void 0, this.explicit_end)); - } - this.serialized_nodes = {}; - this.anchors = {}; - return this.last_anchor_id = 0; - } - anchor_node(node) { - var base, i, item, j, key, len, len1, name, ref, ref1, results, results1, value; - if (node.unique_id in this.anchors) { - return (base = this.anchors)[name = node.unique_id] != null ? base[name] : base[name] = this.generate_anchor(node); - } else { - this.anchors[node.unique_id] = null; - if (node instanceof nodes.SequenceNode) { - ref = node.value; - results = []; - for (i = 0, len = ref.length; i < len; i++) { - item = ref[i]; - results.push(this.anchor_node(item)); - } - return results; - } else if (node instanceof nodes.MappingNode) { - ref1 = node.value; - results1 = []; - for (j = 0, len1 = ref1.length; j < len1; j++) { - [key, value] = ref1[j]; - this.anchor_node(key); - results1.push(this.anchor_node(value)); - } - return results1; - } - } - } - generate_anchor(node) { - return `id${util.pad_left(++this.last_anchor_id, "0", 4)}`; - } - serialize_node(node, parent, index) { - var alias, default_tag, detected_tag, i, implicit, item, j, key, len, len1, ref, ref1, value; - alias = this.anchors[node.unique_id]; - if (node.unique_id in this.serialized_nodes) { - return this.emit(new events.AliasEvent(alias)); - } else { - this.serialized_nodes[node.unique_id] = true; - this.descend_resolver(parent, index); - if (node instanceof nodes.ScalarNode) { - detected_tag = this.resolve(nodes.ScalarNode, node.value, [true, false]); - default_tag = this.resolve(nodes.ScalarNode, node.value, [false, true]); - implicit = [node.tag === detected_tag, node.tag === default_tag]; - this.emit(new events.ScalarEvent(alias, node.tag, implicit, node.value, void 0, void 0, node.style)); - } else if (node instanceof nodes.SequenceNode) { - implicit = node.tag === this.resolve(nodes.SequenceNode, node.value, true); - this.emit(new events.SequenceStartEvent(alias, node.tag, implicit, void 0, void 0, node.flow_style)); - ref = node.value; - for (index = i = 0, len = ref.length; i < len; index = ++i) { - item = ref[index]; - this.serialize_node(item, node, index); - } - this.emit(new events.SequenceEndEvent()); - } else if (node instanceof nodes.MappingNode) { - implicit = node.tag === this.resolve(nodes.MappingNode, node.value, true); - this.emit(new events.MappingStartEvent(alias, node.tag, implicit, void 0, void 0, node.flow_style)); - ref1 = node.value; - for (j = 0, len1 = ref1.length; j < len1; j++) { - [key, value] = ref1[j]; - this.serialize_node(key, node, null); - this.serialize_node(value, node, key); - } - this.emit(new events.MappingEndEvent()); - } - return this.ascend_resolver(); - } - } - } - - ctor = Serializer.prototype.initialise; - return Serializer; - }).call(this); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/representer.js -var require_representer = __commonJS({ - "node_modules/yaml-js/lib/representer.js"(exports) { - (function() { - var YAMLError, nodes, hasProp = {}.hasOwnProperty; - nodes = require_nodes(); - ({ YAMLError } = require_errors()); - this.RepresenterError = class RepresenterError extends YAMLError { - }; - this.BaseRepresenter = (function() { - var ctor; - class BaseRepresenter { - constructor() { - return ctor.apply(this, arguments); - } - static add_representer(data_type, handler) { - if (!this.prototype.hasOwnProperty("yaml_representers_types")) { - this.prototype.yaml_representers_types = [].concat(this.prototype.yaml_representers_types); - } - if (!this.prototype.hasOwnProperty("yaml_representers_handlers")) { - this.prototype.yaml_representers_handlers = [].concat(this.prototype.yaml_representers_handlers); - } - this.prototype.yaml_representers_types.push(data_type); - return this.prototype.yaml_representers_handlers.push(handler); - } - static add_multi_representer(data_type, handler) { - if (!this.prototype.hasOwnProperty("yaml_multi_representers_types")) { - this.prototype.yaml_multi_representers_types = [].concat(this.prototype.yaml_multi_representers_types); - } - if (!this.prototype.hasOwnProperty("yaml_multi_representers_handlers")) { - this.prototype.yaml_multi_representers_handlers = [].concat(this.prototype.yaml_multi_representers_handlers); - } - this.prototype.yaml_multi_representers_types.push(data_type); - return this.prototype.yaml_multi_representers_handlers.push(handler); - } - initialise({ - default_style, - default_flow_style - } = {}) { - this.default_style = default_style; - this.default_flow_style = default_flow_style; - this.represented_objects = {}; - this.object_keeper = []; - return this.alias_key = null; - } - represent(data) { - var node; - node = this.represent_data(data); - this.serialize(node); - this.represented_objects = {}; - this.object_keeper = []; - return this.alias_key = null; - } - represent_data(data) { - var data_type, i, j, len, ref, representer, type; - if (this.ignore_aliases(data)) { - this.alias_key = null; - } else if ((i = this.object_keeper.indexOf(data)) !== -1) { - this.alias_key = i; - if (this.alias_key in this.represented_objects) { - return this.represented_objects[this.alias_key]; - } - } else { - this.alias_key = this.object_keeper.length; - this.object_keeper.push(data); - } - representer = null; - data_type = data === null ? "null" : typeof data; - if (data_type === "object") { - data_type = data.constructor; - } - if ((i = this.yaml_representers_types.lastIndexOf(data_type)) !== -1) { - representer = this.yaml_representers_handlers[i]; - } - if (representer == null) { - ref = this.yaml_multi_representers_types; - for (i = j = 0, len = ref.length; j < len; i = ++j) { - type = ref[i]; - if (!(data instanceof type)) { - continue; - } - representer = this.yaml_multi_representers_handlers[i]; - break; - } - } - if (representer == null) { - if ((i = this.yaml_multi_representers_types.lastIndexOf(void 0)) !== -1) { - representer = this.yaml_multi_representers_handlers[i]; - } else if ((i = this.yaml_representers_types.lastIndexOf(void 0)) !== -1) { - representer = this.yaml_representers_handlers[i]; - } - } - if (representer != null) { - return representer.call(this, data); - } else { - return new nodes.ScalarNode(null, `${data}`); - } - } - represent_scalar(tag, value, style = this.default_style) { - var node; - node = new nodes.ScalarNode(tag, value, null, null, style); - if (this.alias_key != null) { - this.represented_objects[this.alias_key] = node; - } - return node; - } - represent_sequence(tag, sequence, flow_style) { - var best_style, item, j, len, node, node_item, ref, value; - value = []; - node = new nodes.SequenceNode(tag, value, null, null, flow_style); - if (this.alias_key != null) { - this.represented_objects[this.alias_key] = node; - } - best_style = true; - for (j = 0, len = sequence.length; j < len; j++) { - item = sequence[j]; - node_item = this.represent_data(item); - if (!(node_item instanceof nodes.ScalarNode || node_item.style)) { - best_style = false; - } - value.push(node_item); - } - if (flow_style == null) { - node.flow_style = (ref = this.default_flow_style) != null ? ref : best_style; - } - return node; - } - represent_mapping(tag, mapping, flow_style) { - var best_style, item_key, item_value, node, node_key, node_value, ref, value; - value = []; - node = new nodes.MappingNode(tag, value, flow_style); - if (this.alias_key) { - this.represented_objects[this.alias_key] = node; - } - best_style = true; - for (item_key in mapping) { - if (!hasProp.call(mapping, item_key)) continue; - item_value = mapping[item_key]; - node_key = this.represent_data(item_key); - node_value = this.represent_data(item_value); - if (!(node_key instanceof nodes.ScalarNode || node_key.style)) { - best_style = false; - } - if (!(node_value instanceof nodes.ScalarNode || node_value.style)) { - best_style = false; - } - value.push([node_key, node_value]); - } - if (!flow_style) { - node.flow_style = (ref = this.default_flow_style) != null ? ref : best_style; - } - return node; - } - ignore_aliases(data) { - return false; - } - } - - BaseRepresenter.prototype.yaml_representers_types = []; - BaseRepresenter.prototype.yaml_representers_handlers = []; - BaseRepresenter.prototype.yaml_multi_representers_types = []; - BaseRepresenter.prototype.yaml_multi_representers_handlers = []; - ctor = BaseRepresenter.prototype.initialise; - return BaseRepresenter; - }).call(this); - this.Representer = class Representer extends this.BaseRepresenter { - represent_boolean(data) { - return this.represent_scalar("tag:yaml.org,2002:bool", data ? "true" : "false"); - } - represent_null(data) { - return this.represent_scalar("tag:yaml.org,2002:null", "null"); - } - represent_number(data) { - var tag, value; - tag = `tag:yaml.org,2002:${data % 1 === 0 ? "int" : "float"}`; - value = data !== data ? ".nan" : data === Infinity ? ".inf" : data === -Infinity ? "-.inf" : data.toString(); - return this.represent_scalar(tag, value); - } - represent_string(data) { - return this.represent_scalar("tag:yaml.org,2002:str", data); - } - represent_array(data) { - return this.represent_sequence("tag:yaml.org,2002:seq", data); - } - represent_date(data) { - return this.represent_scalar("tag:yaml.org,2002:timestamp", data.toISOString()); - } - represent_object(data) { - return this.represent_mapping("tag:yaml.org,2002:map", data); - } - represent_undefined(data) { - throw new exports.RepresenterError(`cannot represent an onbject: ${data}`); - } - ignore_aliases(data) { - var ref; - if (data == null) { - return true; - } - if ((ref = typeof data) === "boolean" || ref === "number" || ref === "string") { - return true; - } - return false; - } - }; - this.Representer.add_representer("boolean", this.Representer.prototype.represent_boolean); - this.Representer.add_representer("null", this.Representer.prototype.represent_null); - this.Representer.add_representer("number", this.Representer.prototype.represent_number); - this.Representer.add_representer("string", this.Representer.prototype.represent_string); - this.Representer.add_representer(Array, this.Representer.prototype.represent_array); - this.Representer.add_representer(Date, this.Representer.prototype.represent_date); - this.Representer.add_representer(Object, this.Representer.prototype.represent_object); - this.Representer.add_representer(null, this.Representer.prototype.represent_undefined); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/resolver.js -var require_resolver = __commonJS({ - "node_modules/yaml-js/lib/resolver.js"(exports) { - (function() { - var YAMLError, nodes, util, { indexOf } = []; - nodes = require_nodes(); - util = require_util(); - ({ YAMLError } = require_errors()); - this.ResolverError = class ResolverError extends YAMLError { - }; - this.BaseResolver = (function() { - var DEFAULT_MAPPING_TAG, DEFAULT_SCALAR_TAG, DEFAULT_SEQUENCE_TAG, ctor; - class BaseResolver { - constructor() { - return ctor.apply(this, arguments); - } - static add_implicit_resolver(tag, regexp, first = [null]) { - var base, char, i, len, results; - if (!this.prototype.hasOwnProperty("yaml_implicit_resolvers")) { - this.prototype.yaml_implicit_resolvers = util.extend({}, this.prototype.yaml_implicit_resolvers); - } - results = []; - for (i = 0, len = first.length; i < len; i++) { - char = first[i]; - results.push(((base = this.prototype.yaml_implicit_resolvers)[char] != null ? base[char] : base[char] = []).push([tag, regexp])); - } - return results; - } - initialise() { - this.resolver_exact_paths = []; - return this.resolver_prefix_paths = []; - } - descend_resolver(current_node, current_index) { - var depth, exact_paths, i, j, kind, len, len1, path, prefix_paths, ref, ref1; - if (util.is_empty(this.yaml_path_resolvers)) { - return; - } - exact_paths = {}; - prefix_paths = []; - if (current_node) { - depth = this.resolver_prefix_paths.length; - ref = this.resolver_prefix_paths.slice(-1)[0]; - for (i = 0, len = ref.length; i < len; i++) { - [path, kind] = ref[i]; - if (this.check_resolver_prefix(depth, path, kind, current_node, current_index)) { - if (path.length > depth) { - prefix_paths.push([path, kind]); - } else { - exact_paths[kind] = this.yaml_path_resolvers[path][kind]; - } - } - } - } else { - ref1 = this.yaml_path_resolvers; - for (j = 0, len1 = ref1.length; j < len1; j++) { - [path, kind] = ref1[j]; - if (!path) { - exact_paths[kind] = this.yaml_path_resolvers[path][kind]; - } else { - prefix_paths.push([path, kind]); - } - } - } - this.resolver_exact_paths.push(exact_paths); - return this.resolver_prefix_paths.push(prefix_paths); - } - ascend_resolver() { - if (util.is_empty(this.yaml_path_resolvers)) { - return; - } - this.resolver_exact_paths.pop(); - return this.resolver_prefix_paths.pop(); - } - check_resolver_prefix(depth, path, kind, current_node, current_index) { - var index_check, node_check; - [node_check, index_check] = path[depth - 1]; - if (typeof node_check === "string") { - if (current_node.tag !== node_check) { - return; - } - } else if (node_check !== null) { - if (!(current_node instanceof node_check)) { - return; - } - } - if (index_check === true && current_index !== null) { - return; - } - if ((index_check === false || index_check === null) && current_index === null) { - return; - } - if (typeof index_check === "string") { - if (!(current_index instanceof nodes.ScalarNode) && index_check === current_index.value) { - return; - } - } else if (typeof index_check === "number") { - if (index_check !== current_index) { - return; - } - } - return true; - } - resolve(kind, value, implicit) { - var empty, exact_paths, i, k, len, ref, ref1, ref2, regexp, resolvers, tag; - if (kind === nodes.ScalarNode && implicit[0]) { - if (value === "") { - resolvers = (ref = this.yaml_implicit_resolvers[""]) != null ? ref : []; - } else { - resolvers = (ref1 = this.yaml_implicit_resolvers[value[0]]) != null ? ref1 : []; - } - resolvers = resolvers.concat((ref2 = this.yaml_implicit_resolvers.null) != null ? ref2 : []); - for (i = 0, len = resolvers.length; i < len; i++) { - [tag, regexp] = resolvers[i]; - if (value.match(regexp)) { - return tag; - } - } - implicit = implicit[1]; - } - empty = true; - for (k in this.yaml_path_resolvers) { - if ({}[k] == null) { - empty = false; - } - } - if (!empty) { - exact_paths = this.resolver_exact_paths.slice(-1)[0]; - if (indexOf.call(exact_paths, kind) >= 0) { - return exact_paths[kind]; - } - if (indexOf.call(exact_paths, null) >= 0) { - return exact_paths.null; - } - } - if (kind === nodes.ScalarNode) { - return DEFAULT_SCALAR_TAG; - } - if (kind === nodes.SequenceNode) { - return DEFAULT_SEQUENCE_TAG; - } - if (kind === nodes.MappingNode) { - return DEFAULT_MAPPING_TAG; - } - } - } - - DEFAULT_SCALAR_TAG = "tag:yaml.org,2002:str"; - DEFAULT_SEQUENCE_TAG = "tag:yaml.org,2002:seq"; - DEFAULT_MAPPING_TAG = "tag:yaml.org,2002:map"; - BaseResolver.prototype.yaml_implicit_resolvers = {}; - BaseResolver.prototype.yaml_path_resolvers = {}; - ctor = BaseResolver.prototype.initialise; - return BaseResolver; - }).call(this); - this.Resolver = class Resolver extends this.BaseResolver { - }; - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:bool", /^(?:yes|Yes|YES|true|True|TRUE|on|On|ON|no|No|NO|false|False|FALSE|off|Off|OFF)$/, "yYnNtTfFoO"); - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:float", /^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)?|\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*|[-+]?\.(?:inf|Inf|INF)|\.(?:nan|NaN|NAN))$/, "-+0123456789."); - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:int", /^(?:[-+]?0b[01_]+|[-+]?0[0-7_]+|[-+]?(?:0|[1-9][0-9_]*)|[-+]?0x[0-9a-fA-F_]+|[-+]?0o[0-7_]+|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$/, "-+0123456789"); - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:merge", /^(?:<<)$/, "<"); - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:null", /^(?:~|null|Null|NULL|)$/, ["~", "n", "N", ""]); - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:timestamp", /^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?(?:[Tt]|[\x20\t]+)[0-9][0-9]?:[0-9][0-9]:[0-9][0-9](?:\.[0-9]*)?(?:[\x20\t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$/, "0123456789"); - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:value", /^(?:=)$/, "="); - this.Resolver.add_implicit_resolver("tag:yaml.org,2002:yaml", /^(?:!|&|\*)$/, "!&*"); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/dumper.js -var require_dumper = __commonJS({ - "node_modules/yaml-js/lib/dumper.js"(exports) { - (function() { - var emitter, representer, resolver, serializer, util; - util = require_util(); - emitter = require_emitter(); - serializer = require_serializer(); - representer = require_representer(); - resolver = require_resolver(); - this.make_dumper = function(Emitter = emitter.Emitter, Serializer = serializer.Serializer, Representer = representer.Representer, Resolver = resolver.Resolver) { - var Dumper, components; - components = [Emitter, Serializer, Representer, Resolver]; - return Dumper = (function() { - var component; - class Dumper2 { - constructor(stream, options = {}) { - var i, len, ref; - components[0].prototype.initialise.call(this, stream, options); - ref = components.slice(1); - for (i = 0, len = ref.length; i < len; i++) { - component = ref[i]; - component.prototype.initialise.call(this, options); - } - } - } - - util.extend(Dumper2.prototype, ...(function() { - var i, len, results; - results = []; - for (i = 0, len = components.length; i < len; i++) { - component = components[i]; - results.push(component.prototype); - } - return results; - })()); - return Dumper2; - }).call(this); - }; - this.Dumper = this.make_dumper(); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/reader.js -var require_reader = __commonJS({ - "node_modules/yaml-js/lib/reader.js"(exports) { - (function() { - var Mark, YAMLError, { indexOf } = []; - ({ Mark, YAMLError } = require_errors()); - this.ReaderError = class ReaderError extends YAMLError { - constructor(position1, character1, reason) { - super(); - this.position = position1; - this.character = character1; - this.reason = reason; - } - toString() { - return `unacceptable character #${this.character.charCodeAt(0).toString(16)}: ${this.reason} - position ${this.position}`; - } - }; - this.Reader = (function() { - var NON_PRINTABLE, ctor; - class Reader { - constructor() { - return ctor.apply(this, arguments); - } - initialise(string) { - this.string = string; - this.line = 0; - this.column = 0; - this.index = 0; - this.check_printable(); - return this.string += "\0"; - } - peek(index = 0) { - return this.string[this.index + index]; - } - prefix(length = 1) { - return this.string.slice(this.index, this.index + length); - } - forward(length = 1) { - var char, results; - results = []; - while (length) { - char = this.string[this.index]; - this.index++; - if (indexOf.call("\n\x85\u2082\u2029", char) >= 0 || char === "\r" && this.string[this.index] !== "\n") { - this.line++; - this.column = 0; - } else { - this.column++; - } - results.push(length--); - } - return results; - } - get_mark() { - return new Mark(this.line, this.column, this.string, this.index); - } - check_printable() { - var character, match, position; - match = NON_PRINTABLE.exec(this.string); - if (match) { - character = match[0]; - position = this.string.length - this.index + match.index; - throw new exports.ReaderError(position, character, "special characters are not allowed"); - } - } - } - - NON_PRINTABLE = /[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uFFFD]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; - ctor = Reader.prototype.initialise; - return Reader; - }).call(this); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/tokens.js -var require_tokens = __commonJS({ - "node_modules/yaml-js/lib/tokens.js"(exports) { - (function() { - this.Token = class Token { - constructor(start_mark1, end_mark1) { - this.start_mark = start_mark1; - this.end_mark = end_mark1; - } - }; - this.DirectiveToken = (function() { - class DirectiveToken extends this.Token { - constructor(name, value, start_mark, end_mark) { - super(start_mark, end_mark); - this.name = name; - this.value = value; - } - } - - DirectiveToken.prototype.id = ""; - return DirectiveToken; - }).call(this); - this.DocumentStartToken = (function() { - class DocumentStartToken extends this.Token { - } - - DocumentStartToken.prototype.id = ""; - return DocumentStartToken; - }).call(this); - this.DocumentEndToken = (function() { - class DocumentEndToken extends this.Token { - } - - DocumentEndToken.prototype.id = ""; - return DocumentEndToken; - }).call(this); - this.StreamStartToken = (function() { - class StreamStartToken extends this.Token { - constructor(start_mark, end_mark, encoding) { - super(start_mark, end_mark); - this.encoding = encoding; - } - } - - StreamStartToken.prototype.id = ""; - return StreamStartToken; - }).call(this); - this.StreamEndToken = (function() { - class StreamEndToken extends this.Token { - } - - StreamEndToken.prototype.id = ""; - return StreamEndToken; - }).call(this); - this.BlockSequenceStartToken = (function() { - class BlockSequenceStartToken extends this.Token { - } - - BlockSequenceStartToken.prototype.id = ""; - return BlockSequenceStartToken; - }).call(this); - this.BlockMappingStartToken = (function() { - class BlockMappingStartToken extends this.Token { - } - - BlockMappingStartToken.prototype.id = ""; - return BlockMappingStartToken; - }).call(this); - this.BlockEndToken = (function() { - class BlockEndToken extends this.Token { - } - - BlockEndToken.prototype.id = ""; - return BlockEndToken; - }).call(this); - this.FlowSequenceStartToken = (function() { - class FlowSequenceStartToken extends this.Token { - } - - FlowSequenceStartToken.prototype.id = "["; - return FlowSequenceStartToken; - }).call(this); - this.FlowMappingStartToken = (function() { - class FlowMappingStartToken extends this.Token { - } - - FlowMappingStartToken.prototype.id = "{"; - return FlowMappingStartToken; - }).call(this); - this.FlowSequenceEndToken = (function() { - class FlowSequenceEndToken extends this.Token { - } - - FlowSequenceEndToken.prototype.id = "]"; - return FlowSequenceEndToken; - }).call(this); - this.FlowMappingEndToken = (function() { - class FlowMappingEndToken extends this.Token { - } - - FlowMappingEndToken.prototype.id = "}"; - return FlowMappingEndToken; - }).call(this); - this.KeyToken = (function() { - class KeyToken extends this.Token { - } - - KeyToken.prototype.id = "?"; - return KeyToken; - }).call(this); - this.ValueToken = (function() { - class ValueToken extends this.Token { - } - - ValueToken.prototype.id = ":"; - return ValueToken; - }).call(this); - this.BlockEntryToken = (function() { - class BlockEntryToken extends this.Token { - } - - BlockEntryToken.prototype.id = "-"; - return BlockEntryToken; - }).call(this); - this.FlowEntryToken = (function() { - class FlowEntryToken extends this.Token { - } - - FlowEntryToken.prototype.id = ","; - return FlowEntryToken; - }).call(this); - this.AliasToken = (function() { - class AliasToken extends this.Token { - constructor(value, start_mark, end_mark) { - super(start_mark, end_mark); - this.value = value; - } - } - - AliasToken.prototype.id = ""; - return AliasToken; - }).call(this); - this.AnchorToken = (function() { - class AnchorToken extends this.Token { - constructor(value, start_mark, end_mark) { - super(start_mark, end_mark); - this.value = value; - } - } - - AnchorToken.prototype.id = ""; - return AnchorToken; - }).call(this); - this.TagToken = (function() { - class TagToken extends this.Token { - constructor(value, start_mark, end_mark) { - super(start_mark, end_mark); - this.value = value; - } - } - - TagToken.prototype.id = ""; - return TagToken; - }).call(this); - this.ScalarToken = (function() { - class ScalarToken extends this.Token { - constructor(value, plain, start_mark, end_mark, style) { - super(start_mark, end_mark); - this.value = value; - this.plain = plain; - this.style = style; - } - } - - ScalarToken.prototype.id = ""; - return ScalarToken; - }).call(this); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/scanner.js -var require_scanner = __commonJS({ - "node_modules/yaml-js/lib/scanner.js"(exports) { - (function() { - var MarkedYAMLError, SimpleKey, tokens, util, hasProp = {}.hasOwnProperty, { indexOf } = []; - ({ MarkedYAMLError } = require_errors()); - tokens = require_tokens(); - util = require_util(); - this.ScannerError = class ScannerError extends MarkedYAMLError { - }; - SimpleKey = class SimpleKey { - constructor(token_number1, required1, index, line, column1, mark1) { - this.token_number = token_number1; - this.required = required1; - this.index = index; - this.line = line; - this.column = column1; - this.mark = mark1; - } - }; - this.Scanner = (function() { - var C_LB, C_NUMBERS, C_WS, ESCAPE_CODES, ESCAPE_REPLACEMENTS, ctor; - class Scanner { - constructor() { - return ctor.apply(this, arguments); - } - /* - Initialise the Scanner - */ - initialise() { - this.done = false; - this.flow_level = 0; - this.tokens = []; - this.fetch_stream_start(); - this.tokens_taken = 0; - this.indent = -1; - this.indents = []; - this.allow_simple_key = true; - return this.possible_simple_keys = {}; - } - // API methods. - /* - Check if the next token is one of the given types. - */ - check_token(...choices) { - var choice, i, len; - while (this.need_more_tokens()) { - this.fetch_more_tokens(); - } - if (this.tokens.length !== 0) { - if (choices.length === 0) { - return true; - } - for (i = 0, len = choices.length; i < len; i++) { - choice = choices[i]; - if (this.tokens[0] instanceof choice) { - return true; - } - } - } - return false; - } - /* - Return the next token, but do not delete it from the queue. - */ - peek_token() { - while (this.need_more_tokens()) { - this.fetch_more_tokens(); - } - if (this.tokens.length !== 0) { - return this.tokens[0]; - } - } - /* - Return the next token, and remove it from the queue. - */ - get_token() { - while (this.need_more_tokens()) { - this.fetch_more_tokens(); - } - if (this.tokens.length !== 0) { - this.tokens_taken++; - return this.tokens.shift(); - } - } - // Non-API methods. - need_more_tokens() { - if (this.done) { - return false; - } - if (this.tokens.length === 0) { - return true; - } - this.stale_possible_simple_keys(); - if (this.next_possible_simple_key() === this.tokens_taken) { - return true; - } - return false; - } - fetch_more_tokens() { - var char; - this.scan_to_next_token(); - this.stale_possible_simple_keys(); - this.unwind_indent(this.column); - char = this.peek(); - if (char === "\0") { - return this.fetch_stream_end(); - } - if (char === "%" && this.check_directive()) { - return this.fetch_directive(); - } - if (char === "-" && this.check_document_start()) { - return this.fetch_document_start(); - } - if (char === "." && this.check_document_end()) { - return this.fetch_document_end(); - } - if (char === "[") { - return this.fetch_flow_sequence_start(); - } - if (char === "{") { - return this.fetch_flow_mapping_start(); - } - if (char === "]") { - return this.fetch_flow_sequence_end(); - } - if (char === "}") { - return this.fetch_flow_mapping_end(); - } - if (char === ",") { - return this.fetch_flow_entry(); - } - if (char === "-" && this.check_block_entry()) { - return this.fetch_block_entry(); - } - if (char === "?" && this.check_key()) { - return this.fetch_key(); - } - if (char === ":" && this.check_value()) { - return this.fetch_value(); - } - if (char === "*") { - return this.fetch_alias(); - } - if (char === "&") { - return this.fetch_anchor(); - } - if (char === "!") { - return this.fetch_tag(); - } - if (char === "|" && this.flow_level === 0) { - return this.fetch_literal(); - } - if (char === ">" && this.flow_level === 0) { - return this.fetch_folded(); - } - if (char === "'") { - return this.fetch_single(); - } - if (char === '"') { - return this.fetch_double(); - } - if (this.check_plain()) { - return this.fetch_plain(); - } - throw new exports.ScannerError("while scanning for the next token", null, `found character ${char} that cannot start any token`, this.get_mark()); - } - // Simple keys treatment. - /* - Return the number of the nearest possible simple key. - */ - next_possible_simple_key() { - var key, level, min_token_number, ref; - min_token_number = null; - ref = this.possible_simple_keys; - for (level in ref) { - if (!hasProp.call(ref, level)) continue; - key = ref[level]; - if (min_token_number === null || key.token_number < min_token_number) { - min_token_number = key.token_number; - } - } - return min_token_number; - } - /* - Remove entries that are no longer possible simple keys. According to the - YAML spec, simple keys: - should be limited to a single line - should be no longer than 1024 characters - Disabling this procedure will allow simple keys of any length and height - (may cause problems if indentation is broken though). - */ - stale_possible_simple_keys() { - var key, level, ref, results; - ref = this.possible_simple_keys; - results = []; - for (level in ref) { - if (!hasProp.call(ref, level)) continue; - key = ref[level]; - if (key.line === this.line && this.index - key.index <= 1024) { - continue; - } - if (!key.required) { - results.push(delete this.possible_simple_keys[level]); - } else { - throw new exports.ScannerError("while scanning a simple key", key.mark, "could not find expected ':'", this.get_mark()); - } - } - return results; - } - /* - The next token may start a simple key. We check if it's possible and save - its position. This function is called for ALIAS, ANCHOR, TAG, - SCALAR (flow),'[' and '{'. - */ - save_possible_simple_key() { - var required, token_number; - required = this.flow_level === 0 && this.indent === this.column; - if (required && !this.allow_simple_key) { - throw new Error("logic failure"); - } - if (!this.allow_simple_key) { - return; - } - this.remove_possible_simple_key(); - token_number = this.tokens_taken + this.tokens.length; - return this.possible_simple_keys[this.flow_level] = new SimpleKey(token_number, required, this.index, this.line, this.column, this.get_mark()); - } - /* - Remove the saved possible simple key at the current flow level. - */ - remove_possible_simple_key() { - var key; - if (!(key = this.possible_simple_keys[this.flow_level])) { - return; - } - if (!key.required) { - return delete this.possible_simple_keys[this.flow_level]; - } else { - throw new exports.ScannerError("while scanning a simple key", key.mark, "could not find expected ':'", this.get_mark()); - } - } - // Indentation functions - /* - In flow context, tokens should respect indentation. - Actually the condition should be `self.indent >= column` according to - the spec. But this condition will prohibit intuitively correct - constructions such as - key : { - } - */ - unwind_indent(column) { - var mark, results; - if (this.flow_level !== 0) { - return; - } - results = []; - while (this.indent > column) { - mark = this.get_mark(); - this.indent = this.indents.pop(); - results.push(this.tokens.push(new tokens.BlockEndToken(mark, mark))); - } - return results; - } - /* - Check if we need to increase indentation. - */ - add_indent(column) { - if (!(column > this.indent)) { - return false; - } - this.indents.push(this.indent); - this.indent = column; - return true; - } - // Fetchers. - fetch_stream_start() { - var mark; - mark = this.get_mark(); - return this.tokens.push(new tokens.StreamStartToken(mark, mark, this.encoding)); - } - fetch_stream_end() { - var mark; - this.unwind_indent(-1); - this.remove_possible_simple_key(); - this.allow_possible_simple_key = false; - this.possible_simple_keys = {}; - mark = this.get_mark(); - this.tokens.push(new tokens.StreamEndToken(mark, mark)); - return this.done = true; - } - fetch_directive() { - this.unwind_indent(-1); - this.remove_possible_simple_key(); - this.allow_simple_key = false; - return this.tokens.push(this.scan_directive()); - } - fetch_document_start() { - return this.fetch_document_indicator(tokens.DocumentStartToken); - } - fetch_document_end() { - return this.fetch_document_indicator(tokens.DocumentEndToken); - } - fetch_document_indicator(TokenClass) { - var start_mark; - this.unwind_indent(-1); - this.remove_possible_simple_key(); - this.allow_simple_key = false; - start_mark = this.get_mark(); - this.forward(3); - return this.tokens.push(new TokenClass(start_mark, this.get_mark())); - } - fetch_flow_sequence_start() { - return this.fetch_flow_collection_start(tokens.FlowSequenceStartToken); - } - fetch_flow_mapping_start() { - return this.fetch_flow_collection_start(tokens.FlowMappingStartToken); - } - fetch_flow_collection_start(TokenClass) { - var start_mark; - this.save_possible_simple_key(); - this.flow_level++; - this.allow_simple_key = true; - start_mark = this.get_mark(); - this.forward(); - return this.tokens.push(new TokenClass(start_mark, this.get_mark())); - } - fetch_flow_sequence_end() { - return this.fetch_flow_collection_end(tokens.FlowSequenceEndToken); - } - fetch_flow_mapping_end() { - return this.fetch_flow_collection_end(tokens.FlowMappingEndToken); - } - fetch_flow_collection_end(TokenClass) { - var start_mark; - this.remove_possible_simple_key(); - this.flow_level--; - this.allow_simple_key = false; - start_mark = this.get_mark(); - this.forward(); - return this.tokens.push(new TokenClass(start_mark, this.get_mark())); - } - fetch_flow_entry() { - var start_mark; - this.allow_simple_key = true; - this.remove_possible_simple_key(); - start_mark = this.get_mark(); - this.forward(); - return this.tokens.push(new tokens.FlowEntryToken(start_mark, this.get_mark())); - } - fetch_block_entry() { - var mark, start_mark; - if (this.flow_level === 0) { - if (!this.allow_simple_key) { - throw new exports.ScannerError(null, null, "sequence entries are not allowed here", this.get_mark()); - } - if (this.add_indent(this.column)) { - mark = this.get_mark(); - this.tokens.push(new tokens.BlockSequenceStartToken(mark, mark)); - } - } - this.allow_simple_key = true; - this.remove_possible_simple_key(); - start_mark = this.get_mark(); - this.forward(); - return this.tokens.push(new tokens.BlockEntryToken(start_mark, this.get_mark())); - } - fetch_key() { - var mark, start_mark; - if (this.flow_level === 0) { - if (!this.allow_simple_key) { - throw new exports.ScannerError(null, null, "mapping keys are not allowed here", this.get_mark()); - } - if (this.add_indent(this.column)) { - mark = this.get_mark(); - this.tokens.push(new tokens.BlockMappingStartToken(mark, mark)); - } - } - this.allow_simple_key = !this.flow_level; - this.remove_possible_simple_key(); - start_mark = this.get_mark(); - this.forward(); - return this.tokens.push(new tokens.KeyToken(start_mark, this.get_mark())); - } - fetch_value() { - var key, mark, start_mark; - if (key = this.possible_simple_keys[this.flow_level]) { - delete this.possible_simple_keys[this.flow_level]; - this.tokens.splice(key.token_number - this.tokens_taken, 0, new tokens.KeyToken(key.mark, key.mark)); - if (this.flow_level === 0) { - if (this.add_indent(key.column)) { - this.tokens.splice(key.token_number - this.tokens_taken, 0, new tokens.BlockMappingStartToken(key.mark, key.mark)); - } - } - this.allow_simple_key = false; - } else { - if (this.flow_level === 0) { - if (!this.allow_simple_key) { - throw new exports.ScannerError(null, null, "mapping values are not allowed here", this.get_mark()); - } - if (this.add_indent(this.column)) { - mark = this.get_mark(); - this.tokens.push(new tokens.BlockMappingStartToken(mark, mark)); - } - } - this.allow_simple_key = !this.flow_level; - this.remove_possible_simple_key(); - } - start_mark = this.get_mark(); - this.forward(); - return this.tokens.push(new tokens.ValueToken(start_mark, this.get_mark())); - } - fetch_alias() { - this.save_possible_simple_key(); - this.allow_simple_key = false; - return this.tokens.push(this.scan_anchor(tokens.AliasToken)); - } - fetch_anchor() { - this.save_possible_simple_key(); - this.allow_simple_key = false; - return this.tokens.push(this.scan_anchor(tokens.AnchorToken)); - } - fetch_tag() { - this.save_possible_simple_key(); - this.allow_simple_key = false; - return this.tokens.push(this.scan_tag()); - } - fetch_literal() { - return this.fetch_block_scalar("|"); - } - fetch_folded() { - return this.fetch_block_scalar(">"); - } - fetch_block_scalar(style) { - this.allow_simple_key = true; - this.remove_possible_simple_key(); - return this.tokens.push(this.scan_block_scalar(style)); - } - fetch_single() { - return this.fetch_flow_scalar("'"); - } - fetch_double() { - return this.fetch_flow_scalar('"'); - } - fetch_flow_scalar(style) { - this.save_possible_simple_key(); - this.allow_simple_key = false; - return this.tokens.push(this.scan_flow_scalar(style)); - } - fetch_plain() { - this.save_possible_simple_key(); - this.allow_simple_key = false; - return this.tokens.push(this.scan_plain()); - } - // Checkers. - /* - DIRECTIVE: ^ '%' - */ - check_directive() { - if (this.column === 0) { - return true; - } - return false; - } - /* - DOCUMENT-START: ^ '---' (' '|'\n') - */ - check_document_start() { - var ref; - if (this.column === 0 && this.prefix(3) === "---" && (ref = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref) >= 0)) { - return true; - } - return false; - } - /* - DOCUMENT-END: ^ '...' (' '|'\n') - */ - check_document_end() { - var ref; - if (this.column === 0 && this.prefix(3) === "..." && (ref = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref) >= 0)) { - return true; - } - return false; - } - /* - BLOCK-ENTRY: '-' (' '|'\n') - */ - check_block_entry() { - var ref; - return ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0; - } - /* - KEY (flow context): '?' - KEY (block context): '?' (' '|'\n') - */ - check_key() { - var ref; - if (this.flow_level !== 0) { - return true; - } - return ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0; - } - /* - VALUE (flow context): ':' - VALUE (block context): ':' (' '|'\n') - */ - check_value() { - var ref; - if (this.flow_level !== 0) { - return true; - } - return ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0; - } - /* - A plain scalar may start with any non-space character except: - '-', '?', ':', ',', '[', ']', '{', '}', - '#', '&', '*', '!', '|', '>', '\'', '"', - '%', '@', '`'. - - It may also start with - '-', '?', ':' - if it is followed by a non-space character. - - Note that we limit the last rule to the block context (except the '-' - character) because we want the flow context to be space independent. - */ - check_plain() { - var char, ref; - char = this.peek(); - return indexOf.call(C_LB + C_WS + "\0-?:,[]{}#&*!|>'\"%@`", char) < 0 || (ref = this.peek(1), indexOf.call(C_LB + C_WS + "\0", ref) < 0) && (char === "-" || this.flow_level === 0 && indexOf.call("?:", char) >= 0); - } - // Scanners. - /* - We ignore spaces, line breaks and comments. - If we find a line break in the block context, we set the flag - `allow_simple_key` on. - The byte order mark is stripped if it's the first character in the stream. - We do not yet support BOM inside the stream as the specification requires. - Any such mark will be considered as a part of the document. - - TODO: We need to make tab handling rules more sane. A good rule is - Tabs cannot precede tokens BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, - BLOCK-END, KEY (block context), VALUE (block context), BLOCK-ENTRY - So the tab checking code is - @allow_simple_key = off if - We also need to add the check for `allow_simple_key is on` to - `unwind_indent` before issuing BLOCK-END. Scanners for block, flow and - plain scalars need to be modified. - */ - scan_to_next_token() { - var found, ref, results; - if (this.index === 0 && this.peek() === "\uFEFF") { - this.forward(); - } - found = false; - results = []; - while (!found) { - while (this.peek() === " ") { - this.forward(); - } - if (this.peek() === "#") { - while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { - this.forward(); - } - } - if (this.scan_line_break()) { - if (this.flow_level === 0) { - results.push(this.allow_simple_key = true); - } else { - results.push(void 0); - } - } else { - results.push(found = true); - } - } - return results; - } - /* - See the specification for details. - */ - scan_directive() { - var end_mark, name, ref, start_mark, value; - start_mark = this.get_mark(); - this.forward(); - name = this.scan_directive_name(start_mark); - value = null; - if (name === "YAML") { - value = this.scan_yaml_directive_value(start_mark); - end_mark = this.get_mark(); - } else if (name === "TAG") { - value = this.scan_tag_directive_value(start_mark); - end_mark = this.get_mark(); - } else { - end_mark = this.get_mark(); - while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { - this.forward(); - } - } - this.scan_directive_ignored_line(start_mark); - return new tokens.DirectiveToken(name, value, start_mark, end_mark); - } - /* - See the specification for details. - */ - scan_directive_name(start_mark) { - var char, length, value; - length = 0; - char = this.peek(length); - while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0) { - length++; - char = this.peek(length); - } - if (length === 0) { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected alphanumeric or numeric character but found ${char}`, this.get_mark()); - } - value = this.prefix(length); - this.forward(length); - char = this.peek(); - if (indexOf.call(C_LB + "\0 ", char) < 0) { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected alphanumeric or numeric character but found ${char}`, this.get_mark()); - } - return value; - } - /* - See the specification for details. - */ - scan_yaml_directive_value(start_mark) { - var major, minor, ref; - while (this.peek() === " ") { - this.forward(); - } - major = this.scan_yaml_directive_number(start_mark); - if (this.peek() !== ".") { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected a digit or '.' but found ${this.peek()}`, this.get_mark()); - } - this.forward(); - minor = this.scan_yaml_directive_number(start_mark); - if (ref = this.peek(), indexOf.call(C_LB + "\0 ", ref) < 0) { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected a digit or ' ' but found ${this.peek()}`, this.get_mark()); - } - return [major, minor]; - } - /* - See the specification for details. - */ - scan_yaml_directive_number(start_mark) { - var char, length, ref, value; - char = this.peek(); - if (!(char >= "0" && char <= "9")) { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected a digit but found ${char}`, this.get_mark()); - } - length = 0; - while ((ref = this.peek(length)) >= "0" && ref <= "9") { - length++; - } - value = parseInt(this.prefix(length)); - this.forward(length); - return value; - } - /* - See the specification for details. - */ - scan_tag_directive_value(start_mark) { - var handle, prefix; - while (this.peek() === " ") { - this.forward(); - } - handle = this.scan_tag_directive_handle(start_mark); - while (this.peek() === " ") { - this.forward(); - } - prefix = this.scan_tag_directive_prefix(start_mark); - return [handle, prefix]; - } - /* - See the specification for details. - */ - scan_tag_directive_handle(start_mark) { - var char, value; - value = this.scan_tag_handle("directive", start_mark); - char = this.peek(); - if (char !== " ") { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected ' ' but found ${char}`, this.get_mark()); - } - return value; - } - /* - See the specification for details. - */ - scan_tag_directive_prefix(start_mark) { - var char, value; - value = this.scan_tag_uri("directive", start_mark); - char = this.peek(); - if (indexOf.call(C_LB + "\0 ", char) < 0) { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected ' ' but found ${char}`, this.get_mark()); - } - return value; - } - /* - See the specification for details. - */ - scan_directive_ignored_line(start_mark) { - var char, ref; - while (this.peek() === " ") { - this.forward(); - } - if (this.peek() === "#") { - while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { - this.forward(); - } - } - char = this.peek(); - if (indexOf.call(C_LB + "\0", char) < 0) { - throw new exports.ScannerError("while scanning a directive", start_mark, `expected a comment or a line break but found ${char}`, this.get_mark()); - } - return this.scan_line_break(); - } - /* - The specification does not restrict characters for anchors and aliases. - This may lead to problems, for instance, the document: - [ *alias, value ] - can be interpteted in two ways, as - [ "value" ] - and - [ *alias , "value" ] - Therefore we restrict aliases to numbers and ASCII letters. - */ - scan_anchor(TokenClass) { - var char, indicator, length, name, start_mark, value; - start_mark = this.get_mark(); - indicator = this.peek(); - if (indicator === "*") { - name = "alias"; - } else { - name = "anchor"; - } - this.forward(); - length = 0; - char = this.peek(length); - while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0) { - length++; - char = this.peek(length); - } - if (length === 0) { - throw new exports.ScannerError(`while scanning an ${name}`, start_mark, `expected alphabetic or numeric character but found '${char}'`, this.get_mark()); - } - value = this.prefix(length); - this.forward(length); - char = this.peek(); - if (indexOf.call(C_LB + C_WS + "\0?:,]}%@`", char) < 0) { - throw new exports.ScannerError(`while scanning an ${name}`, start_mark, `expected alphabetic or numeric character but found '${char}'`, this.get_mark()); - } - return new TokenClass(value, start_mark, this.get_mark()); - } - /* - See the specification for details. - */ - scan_tag() { - var char, handle, length, start_mark, suffix, use_handle; - start_mark = this.get_mark(); - char = this.peek(1); - if (char === "<") { - handle = null; - this.forward(2); - suffix = this.scan_tag_uri("tag", start_mark); - if (this.peek() !== ">") { - throw new exports.ScannerError("while parsing a tag", start_mark, `expected '>' but found ${this.peek()}`, this.get_mark()); - } - this.forward(); - } else if (indexOf.call(C_LB + C_WS + "\0", char) >= 0) { - handle = null; - suffix = "!"; - this.forward(); - } else { - length = 1; - use_handle = false; - while (indexOf.call(C_LB + "\0 ", char) < 0) { - if (char === "!") { - use_handle = true; - break; - } - length++; - char = this.peek(length); - } - if (use_handle) { - handle = this.scan_tag_handle("tag", start_mark); - } else { - handle = "!"; - this.forward(); - } - suffix = this.scan_tag_uri("tag", start_mark); - } - char = this.peek(); - if (indexOf.call(C_LB + "\0 ", char) < 0) { - throw new exports.ScannerError("while scanning a tag", start_mark, `expected ' ' but found ${char}`, this.get_mark()); - } - return new tokens.TagToken([handle, suffix], start_mark, this.get_mark()); - } - /* - See the specification for details. - */ - scan_block_scalar(style) { - var breaks, chomping, chunks, end_mark, folded, increment, indent, leading_non_space, length, line_break, max_indent, min_indent, ref, ref1, ref2, start_mark; - folded = style === ">"; - chunks = []; - start_mark = this.get_mark(); - this.forward(); - [chomping, increment] = this.scan_block_scalar_indicators(start_mark); - this.scan_block_scalar_ignored_line(start_mark); - min_indent = this.indent + 1; - if (min_indent < 1) { - min_indent = 1; - } - if (increment == null) { - [breaks, max_indent, end_mark] = this.scan_block_scalar_indentation(); - indent = Math.max(min_indent, max_indent); - } else { - indent = min_indent + increment - 1; - [breaks, end_mark] = this.scan_block_scalar_breaks(indent); - } - line_break = ""; - while (this.column === indent && this.peek() !== "\0") { - chunks = chunks.concat(breaks); - leading_non_space = (ref = this.peek(), indexOf.call(" ", ref) < 0); - length = 0; - while (ref1 = this.peek(length), indexOf.call(C_LB + "\0", ref1) < 0) { - length++; - } - chunks.push(this.prefix(length)); - this.forward(length); - line_break = this.scan_line_break(); - [breaks, end_mark] = this.scan_block_scalar_breaks(indent); - if (this.column === indent && this.peek() !== "\0") { - if (folded && line_break === "\n" && leading_non_space && (ref2 = this.peek(), indexOf.call(" ", ref2) < 0)) { - if (util.is_empty(breaks)) { - chunks.push(" "); - } - } else { - chunks.push(line_break); - } - } else { - break; - } - } - if (chomping !== false) { - chunks.push(line_break); - } - if (chomping === true) { - chunks = chunks.concat(breaks); - } - return new tokens.ScalarToken(chunks.join(""), false, start_mark, end_mark, style); - } - /* - See the specification for details. - */ - scan_block_scalar_indicators(start_mark) { - var char, chomping, increment; - chomping = null; - increment = null; - char = this.peek(); - if (indexOf.call("+-", char) >= 0) { - chomping = char === "+"; - this.forward(); - char = this.peek(); - if (indexOf.call(C_NUMBERS, char) >= 0) { - increment = parseInt(char); - if (increment === 0) { - throw new exports.ScannerError("while scanning a block scalar", start_mark, "expected indentation indicator in the range 1-9 but found 0", this.get_mark()); - } - this.forward(); - } - } else if (indexOf.call(C_NUMBERS, char) >= 0) { - increment = parseInt(char); - if (increment === 0) { - throw new exports.ScannerError("while scanning a block scalar", start_mark, "expected indentation indicator in the range 1-9 but found 0", this.get_mark()); - } - this.forward(); - char = this.peek(); - if (indexOf.call("+-", char) >= 0) { - chomping = char === "+"; - this.forward(); - } - } - char = this.peek(); - if (indexOf.call(C_LB + "\0 ", char) < 0) { - throw new exports.ScannerError("while scanning a block scalar", start_mark, `expected chomping or indentation indicators, but found ${char}`, this.get_mark()); - } - return [chomping, increment]; - } - /* - See the specification for details. - */ - scan_block_scalar_ignored_line(start_mark) { - var char, ref; - while (this.peek() === " ") { - this.forward(); - } - if (this.peek() === "#") { - while (ref = this.peek(), indexOf.call(C_LB + "\0", ref) < 0) { - this.forward(); - } - } - char = this.peek(); - if (indexOf.call(C_LB + "\0", char) < 0) { - throw new exports.ScannerError("while scanning a block scalar", start_mark, `expected a comment or a line break but found ${char}`, this.get_mark()); - } - return this.scan_line_break(); - } - /* - See the specification for details. - */ - scan_block_scalar_indentation() { - var chunks, end_mark, max_indent, ref; - chunks = []; - max_indent = 0; - end_mark = this.get_mark(); - while (ref = this.peek(), indexOf.call(C_LB + " ", ref) >= 0) { - if (this.peek() !== " ") { - chunks.push(this.scan_line_break()); - end_mark = this.get_mark(); - } else { - this.forward(); - if (this.column > max_indent) { - max_indent = this.column; - } - } - } - return [chunks, max_indent, end_mark]; - } - /* - See the specification for details. - */ - scan_block_scalar_breaks(indent) { - var chunks, end_mark, ref; - chunks = []; - end_mark = this.get_mark(); - while (this.column < indent && this.peek() === " ") { - this.forward(); - } - while (ref = this.peek(), indexOf.call(C_LB, ref) >= 0) { - chunks.push(this.scan_line_break()); - end_mark = this.get_mark(); - while (this.column < indent && this.peek() === " ") { - this.forward(); - } - } - return [chunks, end_mark]; - } - /* - See the specification for details. - Note that we loose indentation rules for quoted scalars. Quoted scalars - don't need to adhere indentation because " and ' clearly mark the beginning - and the end of them. Therefore we are less restrictive than the - specification requires. We only need to check that document separators are - not included in scalars. - */ - scan_flow_scalar(style) { - var chunks, double, quote, start_mark; - double = style === '"'; - chunks = []; - start_mark = this.get_mark(); - quote = this.peek(); - this.forward(); - chunks = chunks.concat(this.scan_flow_scalar_non_spaces(double, start_mark)); - while (this.peek() !== quote) { - chunks = chunks.concat(this.scan_flow_scalar_spaces(double, start_mark)); - chunks = chunks.concat(this.scan_flow_scalar_non_spaces(double, start_mark)); - } - this.forward(); - return new tokens.ScalarToken(chunks.join(""), false, start_mark, this.get_mark(), style); - } - /* - See the specification for details. - */ - scan_flow_scalar_non_spaces(double, start_mark) { - var char, chunks, code, i, k, length, ref, ref1, ref2; - chunks = []; - while (true) { - length = 0; - while (ref = this.peek(length), indexOf.call(C_LB + C_WS + "'\"\\\0", ref) < 0) { - length++; - } - if (length !== 0) { - chunks.push(this.prefix(length)); - this.forward(length); - } - char = this.peek(); - if (!double && char === "'" && this.peek(1) === "'") { - chunks.push("'"); - this.forward(2); - } else if (double && char === "'" || !double && indexOf.call('"\\', char) >= 0) { - chunks.push(char); - this.forward(); - } else if (double && char === "\\") { - this.forward(); - char = this.peek(); - if (char in ESCAPE_REPLACEMENTS) { - chunks.push(ESCAPE_REPLACEMENTS[char]); - this.forward(); - } else if (char in ESCAPE_CODES) { - length = ESCAPE_CODES[char]; - this.forward(); - for (k = i = 0, ref1 = length; ref1 >= 0 ? i < ref1 : i > ref1; k = ref1 >= 0 ? ++i : --i) { - if (ref2 = this.peek(k), indexOf.call(`${C_NUMBERS}ABCDEFabcdef`, ref2) < 0) { - throw new exports.ScannerError("while scanning a double-quoted scalar", start_mark, `expected escape sequence of ${length} hexadecimal numbers, but found ${this.peek(k)}`, this.get_mark()); - } - } - code = parseInt(this.prefix(length), 16); - chunks.push(String.fromCharCode(code)); - this.forward(length); - } else if (indexOf.call(C_LB, char) >= 0) { - this.scan_line_break(); - chunks = chunks.concat(this.scan_flow_scalar_breaks(double, start_mark)); - } else { - throw new exports.ScannerError("while scanning a double-quoted scalar", start_mark, `found unknown escape character ${char}`, this.get_mark()); - } - } else { - return chunks; - } - } - } - /* - See the specification for details. - */ - scan_flow_scalar_spaces(double, start_mark) { - var breaks, char, chunks, length, line_break, ref, whitespaces; - chunks = []; - length = 0; - while (ref = this.peek(length), indexOf.call(C_WS, ref) >= 0) { - length++; - } - whitespaces = this.prefix(length); - this.forward(length); - char = this.peek(); - if (char === "\0") { - throw new exports.ScannerError("while scanning a quoted scalar", start_mark, "found unexpected end of stream", this.get_mark()); - } - if (indexOf.call(C_LB, char) >= 0) { - line_break = this.scan_line_break(); - breaks = this.scan_flow_scalar_breaks(double, start_mark); - if (line_break !== "\n") { - chunks.push(line_break); - } else if (breaks.length === 0) { - chunks.push(" "); - } - chunks = chunks.concat(breaks); - } else { - chunks.push(whitespaces); - } - return chunks; - } - /* - See the specification for details. - */ - scan_flow_scalar_breaks(double, start_mark) { - var chunks, prefix, ref, ref1, ref2; - chunks = []; - while (true) { - prefix = this.prefix(3); - if (prefix === "---" || prefix === "..." && (ref = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref) >= 0)) { - throw new exports.ScannerError("while scanning a quoted scalar", start_mark, "found unexpected document separator", this.get_mark()); - } - while (ref1 = this.peek(), indexOf.call(C_WS, ref1) >= 0) { - this.forward(); - } - if (ref2 = this.peek(), indexOf.call(C_LB, ref2) >= 0) { - chunks.push(this.scan_line_break()); - } else { - return chunks; - } - } - } - /* - See the specification for details. - We add an additional restriction for the flow context: - plain scalars in the flow context cannot contain ',', ':' and '?'. - We also keep track of the `allow_simple_key` flag here. - Indentation rules are loosed for the flow context. - */ - scan_plain() { - var char, chunks, end_mark, indent, length, ref, ref1, spaces, start_mark; - chunks = []; - start_mark = end_mark = this.get_mark(); - indent = this.indent + 1; - spaces = []; - while (true) { - length = 0; - if (this.peek() === "#") { - break; - } - while (true) { - char = this.peek(length); - if (indexOf.call(C_LB + C_WS + "\0", char) >= 0 || this.flow_level === 0 && char === ":" && (ref = this.peek(length + 1), indexOf.call(C_LB + C_WS + "\0", ref) >= 0) || this.flow_level !== 0 && indexOf.call(",:?[]{}", char) >= 0) { - break; - } - length++; - } - if (this.flow_level !== 0 && char === ":" && (ref1 = this.peek(length + 1), indexOf.call(C_LB + C_WS + "\0,[]{}", ref1) < 0)) { - this.forward(length); - throw new exports.ScannerError("while scanning a plain scalar", start_mark, "found unexpected ':'", this.get_mark(), "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext"); - } - if (length === 0) { - break; - } - this.allow_simple_key = false; - chunks = chunks.concat(spaces); - chunks.push(this.prefix(length)); - this.forward(length); - end_mark = this.get_mark(); - spaces = this.scan_plain_spaces(indent, start_mark); - if (spaces == null || spaces.length === 0 || this.peek() === "#" || this.flow_level === 0 && this.column < indent) { - break; - } - } - return new tokens.ScalarToken(chunks.join(""), true, start_mark, end_mark); - } - /* - See the specification for details. - The specification is really confusing about tabs in plain scalars. - We just forbid them completely. Do not use tabs in YAML! - */ - scan_plain_spaces(indent, start_mark) { - var breaks, char, chunks, length, line_break, prefix, ref, ref1, ref2, ref3, whitespaces; - chunks = []; - length = 0; - while (ref = this.peek(length), indexOf.call(" ", ref) >= 0) { - length++; - } - whitespaces = this.prefix(length); - this.forward(length); - char = this.peek(); - if (indexOf.call(C_LB, char) >= 0) { - line_break = this.scan_line_break(); - this.allow_simple_key = true; - prefix = this.prefix(3); - if (prefix === "---" || prefix === "..." && (ref1 = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref1) >= 0)) { - return; - } - breaks = []; - while (ref3 = this.peek(), indexOf.call(C_LB + " ", ref3) >= 0) { - if (this.peek() === " ") { - this.forward(); - } else { - breaks.push(this.scan_line_break()); - prefix = this.prefix(3); - if (prefix === "---" || prefix === "..." && (ref2 = this.peek(3), indexOf.call(C_LB + C_WS + "\0", ref2) >= 0)) { - return; - } - } - } - if (line_break !== "\n") { - chunks.push(line_break); - } else if (breaks.length === 0) { - chunks.push(" "); - } - chunks = chunks.concat(breaks); - } else if (whitespaces) { - chunks.push(whitespaces); - } - return chunks; - } - /* - See the specification for details. - For some strange reasons, the specification does not allow '_' in tag - handles. I have allowed it anyway. - */ - scan_tag_handle(name, start_mark) { - var char, length, value; - char = this.peek(); - if (char !== "!") { - throw new exports.ScannerError(`while scanning a ${name}`, start_mark, `expected '!' but found ${char}`, this.get_mark()); - } - length = 1; - char = this.peek(length); - if (char !== " ") { - while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-_", char) >= 0) { - length++; - char = this.peek(length); - } - if (char !== "!") { - this.forward(length); - throw new exports.ScannerError(`while scanning a ${name}`, start_mark, `expected '!' but found ${char}`, this.get_mark()); - } - length++; - } - value = this.prefix(length); - this.forward(length); - return value; - } - /* - See the specification for details. - Note: we do not check if URI is well-formed. - */ - scan_tag_uri(name, start_mark) { - var char, chunks, length; - chunks = []; - length = 0; - char = this.peek(length); - while (char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || indexOf.call("-;/?:@&=+$,_.!~*'()[]%", char) >= 0) { - if (char === "%") { - chunks.push(this.prefix(length)); - this.forward(length); - length = 0; - chunks.push(this.scan_uri_escapes(name, start_mark)); - } else { - length++; - } - char = this.peek(length); - } - if (length !== 0) { - chunks.push(this.prefix(length)); - this.forward(length); - length = 0; - } - if (chunks.length === 0) { - throw new exports.ScannerError(`while parsing a ${name}`, start_mark, `expected URI but found ${char}`, this.get_mark()); - } - return chunks.join(""); - } - /* - See the specification for details. - */ - scan_uri_escapes(name, start_mark) { - var bytes, i, k, mark; - bytes = []; - mark = this.get_mark(); - while (this.peek() === "%") { - this.forward(); - for (k = i = 0; i <= 2; k = ++i) { - throw new exports.ScannerError(`while scanning a ${name}`, start_mark, `expected URI escape sequence of 2 hexadecimal numbers but found ${this.peek(k)}`, this.get_mark()); - } - bytes.push(String.fromCharCode(parseInt(this.prefix(2), 16))); - this.forward(2); - } - return bytes.join(""); - } - /* - Transforms: - '\r\n' : '\n' - '\r' : '\n' - '\n' : '\n' - '\x85' : '\n' - '\u2028' : '\u2028' - '\u2029 : '\u2029' - default : '' - */ - scan_line_break() { - var char; - char = this.peek(); - if (indexOf.call("\r\n\x85", char) >= 0) { - if (this.prefix(2) === "\r\n") { - this.forward(2); - } else { - this.forward(); - } - return "\n"; - } else if (indexOf.call("\u2028\u2029", char) >= 0) { - this.forward(); - return char; - } - return ""; - } - } - - C_LB = "\r\n\x85\u2028\u2029"; - C_WS = " "; - C_NUMBERS = "0123456789"; - ESCAPE_REPLACEMENTS = { - "0": "\0", - "a": "\x07", - "b": "\b", - "t": " ", - " ": " ", - "n": "\n", - "v": "\v", - "f": "\f", - "r": "\r", - "e": "\x1B", - " ": " ", - '"': '"', - "\\": "\\", - "N": "\x85", - "_": "\xA0", - "L": "\u2028", - "P": "\u2029" - }; - ESCAPE_CODES = { - "x": 2, - "u": 4, - "U": 8 - }; - ctor = Scanner.prototype.initialise; - return Scanner; - }).call(this); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/parser.js -var require_parser = __commonJS({ - "node_modules/yaml-js/lib/parser.js"(exports) { - (function() { - var MarkedYAMLError, events, tokens, hasProp = {}.hasOwnProperty; - events = require_events(); - ({ MarkedYAMLError } = require_errors()); - tokens = require_tokens(); - this.ParserError = class ParserError extends MarkedYAMLError { - }; - this.Parser = (function() { - var DEFAULT_TAGS, ctor; - class Parser { - constructor() { - return ctor.apply(this, arguments); - } - initialise() { - this.current_event = null; - this.yaml_version = null; - this.tag_handles = {}; - this.states = []; - this.marks = []; - return this.state = "parse_stream_start"; - } - /* - Reset the state attributes. - */ - dispose() { - this.states = []; - return this.state = null; - } - /* - Check the type of the next event. - */ - check_event(...choices) { - var choice, i, len; - if (this.current_event === null) { - if (this.state != null) { - this.current_event = this[this.state](); - } - } - if (this.current_event !== null) { - if (choices.length === 0) { - return true; - } - for (i = 0, len = choices.length; i < len; i++) { - choice = choices[i]; - if (this.current_event instanceof choice) { - return true; - } - } - } - return false; - } - /* - Get the next event. - */ - peek_event() { - if (this.current_event === null && this.state != null) { - this.current_event = this[this.state](); - } - return this.current_event; - } - /* - Get the event and proceed further. - */ - get_event() { - var event; - if (this.current_event === null && this.state != null) { - this.current_event = this[this.state](); - } - event = this.current_event; - this.current_event = null; - return event; - } - // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END - // implicit_document ::= block_node DOCUMENT-END* - // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* - /* - Parse the stream start. - */ - parse_stream_start() { - var event, token; - token = this.get_token(); - event = new events.StreamStartEvent(token.start_mark, token.end_mark); - this.state = "parse_implicit_document_start"; - return event; - } - /* - Parse an implicit document. - */ - parse_implicit_document_start() { - var end_mark, event, start_mark, token; - if (!this.check_token(tokens.DirectiveToken, tokens.DocumentStartToken, tokens.StreamEndToken)) { - this.tag_handles = DEFAULT_TAGS; - token = this.peek_token(); - start_mark = end_mark = token.start_mark; - event = new events.DocumentStartEvent(start_mark, end_mark, false); - this.states.push("parse_document_end"); - this.state = "parse_block_node"; - return event; - } else { - return this.parse_document_start(); - } - } - /* - Parse an explicit document. - */ - parse_document_start() { - var end_mark, event, start_mark, tags, token, version; - while (this.check_token(tokens.DocumentEndToken)) { - this.get_token(); - } - if (!this.check_token(tokens.StreamEndToken)) { - start_mark = this.peek_token().start_mark; - [version, tags] = this.process_directives(); - if (!this.check_token(tokens.DocumentStartToken)) { - throw new exports.ParserError(`expected '', but found ${this.peek_token().id}`, this.peek_token().start_mark); - } - token = this.get_token(); - end_mark = token.end_mark; - event = new events.DocumentStartEvent(start_mark, end_mark, true, version, tags); - this.states.push("parse_document_end"); - this.state = "parse_document_content"; - } else { - token = this.get_token(); - event = new events.StreamEndEvent(token.start_mark, token.end_mark); - if (this.states.length !== 0) { - throw new Error("assertion error, states should be empty"); - } - if (this.marks.length !== 0) { - throw new Error("assertion error, marks should be empty"); - } - this.state = null; - } - return event; - } - /* - Parse the document end. - */ - parse_document_end() { - var end_mark, event, explicit, start_mark, token; - token = this.peek_token(); - start_mark = end_mark = token.start_mark; - explicit = false; - if (this.check_token(tokens.DocumentEndToken)) { - token = this.get_token(); - end_mark = token.end_mark; - explicit = true; - } - event = new events.DocumentEndEvent(start_mark, end_mark, explicit); - this.state = "parse_document_start"; - return event; - } - parse_document_content() { - var event; - if (this.check_token(tokens.DirectiveToken, tokens.DocumentStartToken, tokens.DocumentEndToken, tokens.StreamEndToken)) { - event = this.process_empty_scalar(this.peek_token().start_mark); - this.state = this.states.pop(); - return event; - } else { - return this.parse_block_node(); - } - } - process_directives() { - var handle, major, minor, prefix, ref, tag_handles_copy, token, value; - this.yaml_version = null; - this.tag_handles = {}; - while (this.check_token(tokens.DirectiveToken)) { - token = this.get_token(); - if (token.name === "YAML") { - if (this.yaml_version !== null) { - throw new exports.ParserError(null, null, "found duplicate YAML directive", token.start_mark); - } - [major, minor] = token.value; - if (major !== 1) { - throw new exports.ParserError(null, null, "found incompatible YAML document (version 1.* is required)", token.start_mark); - } - this.yaml_version = token.value; - } else if (token.name === "TAG") { - [handle, prefix] = token.value; - if (handle in this.tag_handles) { - throw new exports.ParserError(null, null, `duplicate tag handle ${handle}`, token.start_mark); - } - this.tag_handles[handle] = prefix; - } - } - tag_handles_copy = null; - ref = this.tag_handles; - for (handle in ref) { - if (!hasProp.call(ref, handle)) continue; - prefix = ref[handle]; - if (tag_handles_copy == null) { - tag_handles_copy = {}; - } - tag_handles_copy[handle] = prefix; - } - value = [this.yaml_version, tag_handles_copy]; - for (handle in DEFAULT_TAGS) { - if (!hasProp.call(DEFAULT_TAGS, handle)) continue; - prefix = DEFAULT_TAGS[handle]; - if (!(prefix in this.tag_handles)) { - this.tag_handles[handle] = prefix; - } - } - return value; - } - // block_node_or_indentless_sequence ::= ALIAS - // | properties (block_content | indentless_sequence)? - // | block_content - // | indentless_block_sequence - // block_node ::= ALIAS - // | properties block_content? - // | block_content - // flow_node ::= ALIAS - // | properties flow_content? - // | flow_content - // properties ::= TAG ANCHOR? | ANCHOR TAG? - // block_content ::= block_collection | flow_collection | SCALAR - // flow_content ::= flow_collection | SCALAR - // block_collection ::= block_sequence | block_mapping - // flow_collection ::= flow_sequence | flow_mapping - parse_block_node() { - return this.parse_node(true); - } - parse_flow_node() { - return this.parse_node(); - } - parse_block_node_or_indentless_sequence() { - return this.parse_node(true, true); - } - parse_node(block = false, indentless_sequence = false) { - var anchor, end_mark, event, handle, implicit, node, start_mark, suffix, tag, tag_mark, token; - if (this.check_token(tokens.AliasToken)) { - token = this.get_token(); - event = new events.AliasEvent(token.value, token.start_mark, token.end_mark); - this.state = this.states.pop(); - } else { - anchor = null; - tag = null; - start_mark = end_mark = tag_mark = null; - if (this.check_token(tokens.AnchorToken)) { - token = this.get_token(); - start_mark = token.start_mark; - end_mark = token.end_mark; - anchor = token.value; - if (this.check_token(tokens.TagToken)) { - token = this.get_token(); - tag_mark = token.start_mark; - end_mark = token.end_mark; - tag = token.value; - } - } else if (this.check_token(tokens.TagToken)) { - token = this.get_token(); - start_mark = tag_mark = token.start_mark; - end_mark = token.end_mark; - tag = token.value; - if (this.check_token(tokens.AnchorToken)) { - token = this.get_token(); - end_mark = token.end_mark; - anchor = token.value; - } - } - if (tag !== null) { - [handle, suffix] = tag; - if (handle !== null) { - if (!(handle in this.tag_handles)) { - throw new exports.ParserError("while parsing a node", start_mark, `found undefined tag handle ${handle}`, tag_mark); - } - tag = this.tag_handles[handle] + suffix; - } else { - tag = suffix; - } - } - if (start_mark === null) { - start_mark = end_mark = this.peek_token().start_mark; - } - event = null; - implicit = tag === null || tag === "!"; - if (indentless_sequence && this.check_token(tokens.BlockEntryToken)) { - end_mark = this.peek_token().end_mark; - event = new events.SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark); - this.state = "parse_indentless_sequence_entry"; - } else { - if (this.check_token(tokens.ScalarToken)) { - token = this.get_token(); - end_mark = token.end_mark; - if (token.plain && tag === null || tag === "!") { - implicit = [true, false]; - } else if (tag === null) { - implicit = [false, true]; - } else { - implicit = [false, false]; - } - event = new events.ScalarEvent(anchor, tag, implicit, token.value, start_mark, end_mark, token.style); - this.state = this.states.pop(); - } else if (this.check_token(tokens.FlowSequenceStartToken)) { - end_mark = this.peek_token().end_mark; - event = new events.SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark, true); - this.state = "parse_flow_sequence_first_entry"; - } else if (this.check_token(tokens.FlowMappingStartToken)) { - end_mark = this.peek_token().end_mark; - event = new events.MappingStartEvent(anchor, tag, implicit, start_mark, end_mark, true); - this.state = "parse_flow_mapping_first_key"; - } else if (block && this.check_token(tokens.BlockSequenceStartToken)) { - end_mark = this.peek_token().end_mark; - event = new events.SequenceStartEvent(anchor, tag, implicit, start_mark, end_mark, false); - this.state = "parse_block_sequence_first_entry"; - } else if (block && this.check_token(tokens.BlockMappingStartToken)) { - end_mark = this.peek_token().end_mark; - event = new events.MappingStartEvent(anchor, tag, implicit, start_mark, end_mark, false); - this.state = "parse_block_mapping_first_key"; - } else if (anchor !== null || tag !== null) { - event = new events.ScalarEvent(anchor, tag, [implicit, false], "", start_mark, end_mark); - this.state = this.states.pop(); - } else { - if (block) { - node = "block"; - } else { - node = "flow"; - } - token = this.peek_token(); - throw new exports.ParserError(`while parsing a ${node} node`, start_mark, `expected the node content, but found ${token.id}`, token.start_mark); - } - } - } - return event; - } - // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* - // BLOCK-END - parse_block_sequence_first_entry() { - var token; - token = this.get_token(); - this.marks.push(token.start_mark); - return this.parse_block_sequence_entry(); - } - parse_block_sequence_entry() { - var event, token; - if (this.check_token(tokens.BlockEntryToken)) { - token = this.get_token(); - if (!this.check_token(tokens.BlockEntryToken, tokens.BlockEndToken)) { - this.states.push("parse_block_sequence_entry"); - return this.parse_block_node(); - } else { - this.state = "parse_block_sequence_entry"; - return this.process_empty_scalar(token.end_mark); - } - } - if (!this.check_token(tokens.BlockEndToken)) { - token = this.peek_token(); - throw new exports.ParserError("while parsing a block collection", this.marks.slice(-1)[0], `expected , but found ${token.id}`, token.start_mark); - } - token = this.get_token(); - event = new events.SequenceEndEvent(token.start_mark, token.end_mark); - this.state = this.states.pop(); - this.marks.pop(); - return event; - } - // indentless_sequence ::= (BLOCK-ENTRY block_node?)+ - parse_indentless_sequence_entry() { - var event, token; - if (this.check_token(tokens.BlockEntryToken)) { - token = this.get_token(); - if (!this.check_token(tokens.BlockEntryToken, tokens.KeyToken, tokens.ValueToken, tokens.BlockEndToken)) { - this.states.push("parse_indentless_sequence_entry"); - return this.parse_block_node(); - } else { - this.state = "parse_indentless_sequence_entry"; - return this.process_empty_scalar(token.end_mark); - } - } - token = this.peek_token(); - event = new events.SequenceEndEvent(token.start_mark, token.start_mark); - this.state = this.states.pop(); - return event; - } - // block_mapping ::= BLOCK-MAPPING-START - // ((KEY block_node_or_indentless_sequence?)? - // (VALUE block_node_or_indentless_sequence?)?)* BLOCK-END - parse_block_mapping_first_key() { - var token; - token = this.get_token(); - this.marks.push(token.start_mark); - return this.parse_block_mapping_key(); - } - parse_block_mapping_key() { - var event, token; - if (this.check_token(tokens.KeyToken)) { - token = this.get_token(); - if (!this.check_token(tokens.KeyToken, tokens.ValueToken, tokens.BlockEndToken)) { - this.states.push("parse_block_mapping_value"); - return this.parse_block_node_or_indentless_sequence(); - } else { - this.state = "parse_block_mapping_value"; - return this.process_empty_scalar(token.end_mark); - } - } - if (!this.check_token(tokens.BlockEndToken)) { - token = this.peek_token(); - throw new exports.ParserError("while parsing a block mapping", this.marks.slice(-1)[0], `expected , but found ${token.id}`, token.start_mark); - } - token = this.get_token(); - event = new events.MappingEndEvent(token.start_mark, token.end_mark); - this.state = this.states.pop(); - this.marks.pop(); - return event; - } - parse_block_mapping_value() { - var token; - if (this.check_token(tokens.ValueToken)) { - token = this.get_token(); - if (!this.check_token(tokens.KeyToken, tokens.ValueToken, tokens.BlockEndToken)) { - this.states.push("parse_block_mapping_key"); - return this.parse_block_node_or_indentless_sequence(); - } else { - this.state = "parse_block_mapping_key"; - return this.process_empty_scalar(token.end_mark); - } - } else { - this.state = "parse_block_mapping_key"; - token = this.peek_token(); - return this.process_empty_scalar(token.start_mark); - } - } - // flow_sequence ::= FLOW-SEQUENCE-START - // (flow_sequence_entry FLOW-ENTRY)* flow_sequence_entry? FLOW-SEQUENCE-END - // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - // Note that while production rules for both flow_sequence_entry and - // flow_mapping_entry are equal, their interpretations are different. For - // `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` - // generate an inline mapping (set syntax). - parse_flow_sequence_first_entry() { - var token; - token = this.get_token(); - this.marks.push(token.start_mark); - return this.parse_flow_sequence_entry(true); - } - parse_flow_sequence_entry(first = false) { - var event, token; - if (!this.check_token(tokens.FlowSequenceEndToken)) { - if (!first) { - if (this.check_token(tokens.FlowEntryToken)) { - this.get_token(); - } else { - token = this.peek_token(); - throw new exports.ParserError("while parsing a flow sequence", this.marks.slice(-1)[0], `expected ',' or ']', but got ${token.id}`, token.start_mark); - } - } - if (this.check_token(tokens.KeyToken)) { - token = this.peek_token(); - event = new events.MappingStartEvent(null, null, true, token.start_mark, token.end_mark, true); - this.state = "parse_flow_sequence_entry_mapping_key"; - return event; - } else if (!this.check_token(tokens.FlowSequenceEndToken)) { - this.states.push("parse_flow_sequence_entry"); - return this.parse_flow_node(); - } - } - token = this.get_token(); - event = new events.SequenceEndEvent(token.start_mark, token.end_mark); - this.state = this.states.pop(); - this.marks.pop(); - return event; - } - parse_flow_sequence_entry_mapping_key() { - var token; - token = this.get_token(); - if (!this.check_token(tokens.ValueToken, tokens.FlowEntryToken, tokens.FlowSequenceEndToken)) { - this.states.push("parse_flow_sequence_entry_mapping_value"); - return this.parse_flow_node(); - } else { - this.state = "parse_flow_sequence_entry_mapping_value"; - return this.process_empty_scalar(token.end_mark); - } - } - parse_flow_sequence_entry_mapping_value() { - var token; - if (this.check_token(tokens.ValueToken)) { - token = this.get_token(); - if (!this.check_token(tokens.FlowEntryToken, tokens.FlowSequenceEndToken)) { - this.states.push("parse_flow_sequence_entry_mapping_end"); - return this.parse_flow_node(); - } else { - this.state = "parse_flow_sequence_entry_mapping_end"; - return this.process_empty_scalar(token.end_mark); - } - } else { - this.state = "parse_flow_sequence_entry_mapping_end"; - token = this.peek_token(); - return this.process_empty_scalar(token.start_mark); - } - } - parse_flow_sequence_entry_mapping_end() { - var token; - this.state = "parse_flow_sequence_entry"; - token = this.peek_token(); - return new events.MappingEndEvent(token.start_mark, token.start_mark); - } - // flow_mapping ::= FLOW-MAPPING-START (flow_mapping_entry FLOW-ENTRY)* - // flow_mapping_entry? FLOW-MAPPING-END - // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - parse_flow_mapping_first_key() { - var token; - token = this.get_token(); - this.marks.push(token.start_mark); - return this.parse_flow_mapping_key(true); - } - parse_flow_mapping_key(first = false) { - var event, token; - if (!this.check_token(tokens.FlowMappingEndToken)) { - if (!first) { - if (this.check_token(tokens.FlowEntryToken)) { - this.get_token(); - } else { - token = this.peek_token(); - throw new exports.ParserError("while parsing a flow mapping", this.marks.slice(-1)[0], `expected ',' or '}', but got ${token.id}`, token.start_mark); - } - } - if (this.check_token(tokens.KeyToken)) { - token = this.get_token(); - if (!this.check_token(tokens.ValueToken, tokens.FlowEntryToken, tokens.FlowMappingEndToken)) { - this.states.push("parse_flow_mapping_value"); - return this.parse_flow_node(); - } else { - this.state = "parse_flow_mapping_value"; - return this.process_empty_scalar(token.end_mark); - } - } else if (!this.check_token(tokens.FlowMappingEndToken)) { - this.states.push("parse_flow_mapping_empty_value"); - return this.parse_flow_node(); - } - } - token = this.get_token(); - event = new events.MappingEndEvent(token.start_mark, token.end_mark); - this.state = this.states.pop(); - this.marks.pop(); - return event; - } - parse_flow_mapping_value() { - var token; - if (this.check_token(tokens.ValueToken)) { - token = this.get_token(); - if (!this.check_token(tokens.FlowEntryToken, tokens.FlowMappingEndToken)) { - this.states.push("parse_flow_mapping_key"); - return this.parse_flow_node(); - } else { - this.state = "parse_flow_mapping_key"; - return this.process_empty_scalar(token.end_mark); - } - } else { - this.state = "parse_flow_mapping_key"; - token = this.peek_token(); - return this.process_empty_scalar(token.start_mark); - } - } - parse_flow_mapping_empty_value() { - this.state = "parse_flow_mapping_key"; - return this.process_empty_scalar(this.peek_token().start_mark); - } - process_empty_scalar(mark) { - return new events.ScalarEvent(null, null, [true, false], "", mark, mark); - } - } - - DEFAULT_TAGS = { - "!": "!", - "!!": "tag:yaml.org,2002:" - }; - ctor = Parser.prototype.initialise; - return Parser; - }).call(this); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/loader.js -var require_loader = __commonJS({ - "node_modules/yaml-js/lib/loader.js"(exports) { - (function() { - var composer, constructor, parser, reader, resolver, scanner, util; - util = require_util(); - reader = require_reader(); - scanner = require_scanner(); - parser = require_parser(); - composer = require_composer(); - resolver = require_resolver(); - constructor = require_constructor(); - this.make_loader = function(Reader = reader.Reader, Scanner = scanner.Scanner, Parser = parser.Parser, Composer = composer.Composer, Resolver = resolver.Resolver, Constructor = constructor.Constructor) { - var Loader, components; - components = [Reader, Scanner, Parser, Composer, Resolver, Constructor]; - return Loader = (function() { - var component; - class Loader2 { - constructor(stream) { - var i, len, ref; - components[0].prototype.initialise.call(this, stream); - ref = components.slice(1); - for (i = 0, len = ref.length; i < len; i++) { - component = ref[i]; - component.prototype.initialise.call(this); - } - } - } - - util.extend(Loader2.prototype, ...(function() { - var i, len, results; - results = []; - for (i = 0, len = components.length; i < len; i++) { - component = components[i]; - results.push(component.prototype); - } - return results; - })()); - return Loader2; - }).call(this); - }; - this.Loader = this.make_loader(); - }).call(exports); - } -}); - -// node_modules/yaml-js/lib/yaml.js -var require_yaml = __commonJS({ - "node_modules/yaml-js/lib/yaml.js"(exports) { - (function() { - var composer, constructor, dumper, errors, events, loader, nodes, parser, reader, resolver, scanner, tokens, util; - composer = this.composer = require_composer(); - constructor = this.constructor = require_constructor(); - dumper = this.dumper = require_dumper(); - errors = this.errors = require_errors(); - events = this.events = require_events(); - loader = this.loader = require_loader(); - nodes = this.nodes = require_nodes(); - parser = this.parser = require_parser(); - reader = this.reader = require_reader(); - resolver = this.resolver = require_resolver(); - scanner = this.scanner = require_scanner(); - tokens = this.tokens = require_tokens(); - util = require_util(); - this.scan = function(stream, Loader = loader.Loader) { - var _loader, results; - _loader = new Loader(stream); - results = []; - while (_loader.check_token()) { - results.push(_loader.get_token()); - } - return results; - }; - this.parse = function(stream, Loader = loader.Loader) { - var _loader, results; - _loader = new Loader(stream); - results = []; - while (_loader.check_event()) { - results.push(_loader.get_event()); - } - return results; - }; - this.compose = function(stream, Loader = loader.Loader) { - var _loader; - _loader = new Loader(stream); - return _loader.get_single_node(); - }; - this.compose_all = function(stream, Loader = loader.Loader) { - var _loader, results; - _loader = new Loader(stream); - results = []; - while (_loader.check_node()) { - results.push(_loader.get_node()); - } - return results; - }; - this.load = function(stream, Loader = loader.Loader) { - var _loader; - _loader = new Loader(stream); - return _loader.get_single_data(); - }; - this.load_all = function(stream, Loader = loader.Loader) { - var _loader, results; - _loader = new Loader(stream); - results = []; - while (_loader.check_data()) { - results.push(_loader.get_data()); - } - return results; - }; - this.emit = function(events2, stream, Dumper = dumper.Dumper, options = {}) { - var _dumper, dest, event, i, len; - dest = stream || new util.StringStream(); - _dumper = new Dumper(dest, options); - try { - for (i = 0, len = events2.length; i < len; i++) { - event = events2[i]; - _dumper.emit(event); - } - } finally { - _dumper.dispose(); - } - return stream || dest.string; - }; - this.serialize = function(node, stream, Dumper = dumper.Dumper, options = {}) { - return exports.serialize_all([node], stream, Dumper, options); - }; - this.serialize_all = function(nodes2, stream, Dumper = dumper.Dumper, options = {}) { - var _dumper, dest, i, len, node; - dest = stream || new util.StringStream(); - _dumper = new Dumper(dest, options); - try { - _dumper.open(); - for (i = 0, len = nodes2.length; i < len; i++) { - node = nodes2[i]; - _dumper.serialize(node); - } - _dumper.close(); - } finally { - _dumper.dispose(); - } - return stream || dest.string; - }; - this.dump = function(data, stream, Dumper = dumper.Dumper, options = {}) { - return exports.dump_all([data], stream, Dumper, options); - }; - this.dump_all = function(documents, stream, Dumper = dumper.Dumper, options = {}) { - var _dumper, dest, document, i, len; - dest = stream || new util.StringStream(); - _dumper = new Dumper(dest, options); - try { - _dumper.open(); - for (i = 0, len = documents.length; i < len; i++) { - document = documents[i]; - _dumper.represent(document); - } - _dumper.close(); - } finally { - _dumper.dispose(); - } - return stream || dest.string; - }; - }).call(exports); - } -}); - -// entry.js -var import_yaml_js = __toESM(require_yaml()); -var entry_default = import_yaml_js.default; -export { - entry_default as default -}; From d060b861a705d0dde0d5ca7c6dfc8bd6a7747bde Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 11:51:46 -0400 Subject: [PATCH 038/247] Fix Plugin Searching --- src/components/settings/tabs/plugins/index.tsx | 11 +---------- src/equicordplugins/userpluginInstaller.dev/index.tsx | 2 +- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/components/settings/tabs/plugins/index.tsx b/src/components/settings/tabs/plugins/index.tsx index ed75e2849..022bb9322 100644 --- a/src/components/settings/tabs/plugins/index.tsx +++ b/src/components/settings/tabs/plugins/index.tsx @@ -197,18 +197,9 @@ export default function PluginSettings() { const hasUserPlugins = useMemo(() => !IS_STANDALONE && Object.values(PluginMeta).some(m => m.userPlugin), []); const [searchValue, setSearchValue] = useState({ value: "", tags: [] as PluginTag[], status: SearchStatus.ALL }); - const [searchInput, setSearchInput] = useState(""); - - const debouncedSetSearch = useMemo( - () => debounce((query: string) => setSearchValue(prev => ({ ...prev, value: query })), 150), - [] - ); const search = searchValue.value.toLowerCase(); - const onSearch = useCallback((query: string) => { - setSearchInput(query); - debouncedSetSearch(query); - }, [debouncedSetSearch]); + const onSearch = (query: string) => setSearchValue(prev => ({ ...prev, value: query })); const pluginFilter = useCallback((plugin: typeof Plugins[keyof typeof Plugins], newPluginsSet: Set | null) => { const { status, tags } = searchValue; diff --git a/src/equicordplugins/userpluginInstaller.dev/index.tsx b/src/equicordplugins/userpluginInstaller.dev/index.tsx index 1d30ce697..a06afa7b3 100644 --- a/src/equicordplugins/userpluginInstaller.dev/index.tsx +++ b/src/equicordplugins/userpluginInstaller.dev/index.tsx @@ -80,7 +80,7 @@ export default definePlugin({ async start() { if (!VencordNative.pluginHelpers.UserpluginInstaller) return void Alerts.show({ title: "UserpluginInstaller not fully loaded", - body: "This usually happens if you didn't fully restart your client after installing the plugin, which prevents the native helpers from loading. Restart your client to fix the issue.", + body: "You need to restart to allow the native to be loaded :)", confirmText: "Restart now", onConfirm() { relaunch(); From ed9688983dc0ac995cad9b29510c13e6f4339a6f Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 11:58:00 -0400 Subject: [PATCH 039/247] AccountPanelServerProfile: Fix Patch --- src/plugins/accountPanelServerProfile/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index 1e2cf20c6..56c4b84b2 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -80,7 +80,7 @@ export default definePlugin({ group: true, replacement: [ { - match: /(\.AVATAR,children:.+?renderPopout:(\i)=>){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, + match: /(\.AVATAR,children:.+?renderPopout:\(?(\i)(?:,\i\)=>)?){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, replace: (_, rest, popoutProps, originalPopout, currentUser) => `${rest}$self.UserProfile({popoutProps:${popoutProps},currentUser:${currentUser},originalRenderPopout:()=>{${originalPopout}}})` }, { From b0068dafac6e17289f7ddf32c222135f636b949e Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:01:01 -0400 Subject: [PATCH 040/247] AccountPanelServerProfile: Fix Mistake --- src/plugins/accountPanelServerProfile/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index 56c4b84b2..dad81c7bb 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -80,7 +80,7 @@ export default definePlugin({ group: true, replacement: [ { - match: /(\.AVATAR,children:.+?renderPopout:\(?(\i)(?:,\i\)=>)?){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, + match: /(\.AVATAR,children:.+?renderPopout:\(?(\i)(?:,\i\))?=>){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, replace: (_, rest, popoutProps, originalPopout, currentUser) => `${rest}$self.UserProfile({popoutProps:${popoutProps},currentUser:${currentUser},originalRenderPopout:()=>{${originalPopout}}})` }, { From 88b718f1e150a020e3f1cd603bca97e764a1d655 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:01:58 -0400 Subject: [PATCH 041/247] ViewIcons: Fix Find --- src/plugins/viewIcons/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/viewIcons/index.tsx b/src/plugins/viewIcons/index.tsx index d7a74223b..3ffb346dd 100644 --- a/src/plugins/viewIcons/index.tsx +++ b/src/plugins/viewIcons/index.tsx @@ -197,7 +197,7 @@ export default definePlugin({ patches: [ // Avatar component used in User DMs "User Profile" popup in the right and User Profile Modal pfp { - find: "return{avatarProps:{", + find: ".AVATAR),{trackUserProfileAction:", replacement: { match: /(?<=avatarProps:(\i),eventHandlers:(\i).{0,50}?)return null==/, replace: 'Object.assign($2,{style:{cursor:"pointer"},onClick:()=>$self.openAvatar($1.src)});$&', From c89b6058229b6c54582f2529f9b089ed3f4e64ba Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:04:34 -0400 Subject: [PATCH 042/247] Revert ViewIcons: Not Fixing On Stable --- src/plugins/viewIcons/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/viewIcons/index.tsx b/src/plugins/viewIcons/index.tsx index 3ffb346dd..d7a74223b 100644 --- a/src/plugins/viewIcons/index.tsx +++ b/src/plugins/viewIcons/index.tsx @@ -197,7 +197,7 @@ export default definePlugin({ patches: [ // Avatar component used in User DMs "User Profile" popup in the right and User Profile Modal pfp { - find: ".AVATAR),{trackUserProfileAction:", + find: "return{avatarProps:{", replacement: { match: /(?<=avatarProps:(\i),eventHandlers:(\i).{0,50}?)return null==/, replace: 'Object.assign($2,{style:{cursor:"pointer"},onClick:()=>$self.openAvatar($1.src)});$&', From 1d4fcf2bb501e4a45c08a4ecc56f04c0087d50c9 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:23:06 -0400 Subject: [PATCH 043/247] UserpluginInstaller: About Warning --- src/equicordplugins/userpluginInstaller.dev/index.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/equicordplugins/userpluginInstaller.dev/index.tsx b/src/equicordplugins/userpluginInstaller.dev/index.tsx index a06afa7b3..98e884661 100644 --- a/src/equicordplugins/userpluginInstaller.dev/index.tsx +++ b/src/equicordplugins/userpluginInstaller.dev/index.tsx @@ -9,6 +9,7 @@ import "./misc/style.css"; import { showNotification } from "@api/Notifications"; import { definePluginSettings } from "@api/Settings"; import { Button } from "@components/Button"; +import { Notice } from "@components/Notice"; import plSettings from "@plugins/_core/settings"; import { Devs } from "@utils/constants"; import { relaunch } from "@utils/native"; @@ -53,6 +54,12 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "UserpluginInstaller", description: "Install userplugins with a simple button click", + settingsAboutComponent: () => ( + + Equicord does not moderate userplugins and takes no responsibility for anything that may result from installing them. + Only install userplugins from developers you trust. Doing so is entirely at your own risk. + + ), async checkPluginUpdates() { for (const p of this.plugins.value()) { if (await Native.isUpdateAvailableForPlugin(p.directory!)) { From 735dc9e5f2e87dcef5f85c7fca4ef0d67af2c74d Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:58:48 -0400 Subject: [PATCH 044/247] Fix broken Value --- .../components/SettingsTab.tsx | 110 +++++++++--------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx b/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx index 3bdfc9859..0bc5a1c53 100644 --- a/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx +++ b/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx @@ -142,7 +142,7 @@ function UserPluginsTab() { return "Invalid URL, read the notice above"; } }} - value={url} + initialValue={url} />
@@ -251,61 +251,61 @@ function UserPluginsTab() { {Object.keys( pluginsWithUpdates, ).includes(plugin.directory!) && ( - - )} + ); + const oldPWU = + userpluginInstaller.pluginsWithUpdates.value() + .plugins; + oldPWU.splice( + oldPWU.indexOf( + plugin.directory!, + ), + 1, + ); + userpluginInstaller.pluginsWithUpdates.value( + { + finished: true, + plugins: oldPWU, + }, + ); + Alerts.show({ + title: "Done!", + body: `${plugin.name} has been updated. A ${plugin.usesNative ? "restart" : "refresh"} is needed to apply the update.`, + confirmText: + plugin.usesNative + ? "Restart" + : "Refresh", + cancelText: "Later", + onConfirm() { + plugin.usesNative + ? relaunch() + : window.location.reload(); + }, + }); + } catch (e: any) { + if ( + e + .toString() + .includes( + "silentStop", + ) + ) + return; + Alerts.show({ + title: "Update error", + body: e.toString(), + }); + } + }} + > + Update + + )} -
- -
- {pluginsLoaded ? ( -
- {plugins - .toSorted((a, b) => - a.name.localeCompare(b.name, "en", { - sensitivity: "base", - }), - ) - .toSorted((a, b) => { - const updatePendingNames = - Object.keys(pluginsWithUpdates); - const [aa, bb] = [ - updatePendingNames.includes(a.directory!) - ? 1000 - : 0, - updatePendingNames.includes(b.directory!) - ? 1000 - : 0, - ]; - return bb - aa; - }) - .map(plugin => { - - const pl = Vencord.Plugins.plugins[ - plugin.name - ]; - return { - await Native.rmPlugin( - plugin.directory!, - ); - Alerts.show({ - title: "Done!", - body: `${plugin.name} has been uninstalled. A ${plugin.usesNative ? "restart" : "refresh"} is needed to fully remove the plugin.`, - confirmText: - plugin.usesNative - ? "Restart" - : "Refresh", - cancelText: "Later", - onConfirm() { - plugin.usesNative - ? relaunch() - : window.location.reload(); - }, - }); - }} - className={cl("delete-button")} - > - - } - setEnabled={t => { - Vencord.Settings.plugins[pl.name].enabled = t; - if (pluginRequiresRestart(pl)) { - Toasts.show({ - id: Toasts.genId(), - message: "Restart to apply changes!", - type: Toasts.Type.MESSAGE - }); - } else { - (t ? startPlugin : stopPlugin)(pl); - } - }} - footer={( -
- {Object.keys( - pluginsWithUpdates, - ).includes(plugin.directory!) && ( - - )} - - {plugin.supportChannelID && } -
- )} - />; - })} -
- ) : ( - Loading plugins... - )} -
- - ); -} - -export default wrapTab(UserPluginsTab, "UserPlugins"); diff --git a/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx b/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx deleted file mode 100644 index 753a93961..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2025 nin0 - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { Button } from "@components/Button"; -import { Alerts, ChannelStore, useEffect, useState } from "@webpack/common"; - -import userpluginInstaller, { Native, OpenSettingsModule, settings } from ".."; -import { CLONE_LINK_REGEX, showInstallFinishedAlert, WHITELISTED_SHARE_CHANNELS } from "../misc/constants"; - -export default function UserpluginInstallButton({ props }: any) { - const [plugins, setPlugins] = useState<{ - directory?: string; - }[]>([]); - useEffect(() => { - const { plugins } = userpluginInstaller; - - setPlugins(plugins.value()); - const cid = plugins.registerCallback(value => setPlugins(plugins.value())); - return () => plugins.deregisterCallback(cid); - }); - const { message } = props; - if (![...WHITELISTED_SHARE_CHANNELS, ...(settings.store.allowlistedChannels || "").split(",")].includes(ChannelStore.getChannel(message.channel_id).parent_id) && !WHITELISTED_SHARE_CHANNELS.includes(message.channel_id)) - return; - const gitLink = (props.message.content as string).match(CLONE_LINK_REGEX); - if (!gitLink) return; - const idpl = gitLink.includes("plugins.nin0.dev") ? 1 : 0; - const installed = plugins.map(p => p.directory).includes(gitLink[[3, 6][idpl]]); - return <> -
- -
- ; -} diff --git a/src/equicordplugins/userpluginInstaller.dev/index.tsx b/src/equicordplugins/userpluginInstaller.dev/index.tsx deleted file mode 100644 index 98e884661..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/index.tsx +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2025 nin0 - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import "./misc/style.css"; - -import { showNotification } from "@api/Notifications"; -import { definePluginSettings } from "@api/Settings"; -import { Button } from "@components/Button"; -import { Notice } from "@components/Notice"; -import plSettings from "@plugins/_core/settings"; -import { Devs } from "@utils/constants"; -import { relaunch } from "@utils/native"; -import definePlugin, { OptionType, PluginNative } from "@utils/types"; -import { findByPropsLazy, findComponentByCodeLazy } from "@webpack"; -import { Alerts } from "@webpack/common"; - -import SettingsTab from "./components/SettingsTab"; -import UserpluginInstallButton from "./components/UserpluginInstallButton"; -import { VariableWithCallbacks } from "./VariableWithCallbacks"; - -// @ts-ignore -export const Native = VencordNative.pluginHelpers.UserpluginInstaller as PluginNative; -export const OpenSettingsModule = findByPropsLazy("openUserSettings"); -const AppsIcon = findComponentByCodeLazy("2.95H20a2 2 0"); - -export const settings = definePluginSettings({ - allowlistedChannels: { - type: OptionType.STRING, - description: "Comma separated list of channels where the Install Plugin button should be displayed. It is always displayed in the Vencord Userplugin channels" - }, - notifyIfUpdate: { - type: OptionType.BOOLEAN, - description: "Show a Vencord notification if UserPlugins need to be updated", - default: true - }, - neverNotifyForPlugins: { - type: OptionType.STRING, - description: "Never show update notifications for these plugins (you can still update them from the UserPlugins tab)", - default: "" - }, - setGitPath: { - type: OptionType.COMPONENT, - component: () => - } -}); - -export default definePlugin({ - name: "UserpluginInstaller", - description: "Install userplugins with a simple button click", - settingsAboutComponent: () => ( - - Equicord does not moderate userplugins and takes no responsibility for anything that may result from installing them. - Only install userplugins from developers you trust. Doing so is entirely at your own risk. - - ), - async checkPluginUpdates() { - for (const p of this.plugins.value()) { - if (await Native.isUpdateAvailableForPlugin(p.directory!)) { - const t = this.pluginsWithUpdates.value().plugins; - t.push(p.directory!); - this.pluginsWithUpdates.value({ - finished: false, - plugins: t - }); - } - } - const t = this.pluginsWithUpdates.value().plugins; - this.pluginsWithUpdates.value({ - finished: true, - plugins: t - }); - }, - section: { - key: "vencord_userplugins", - title: "UserPlugins", - panelTitle: "UserPlugins", - Component: SettingsTab, - Icon: AppsIcon - }, - async start() { - if (!VencordNative.pluginHelpers.UserpluginInstaller) return void Alerts.show({ - title: "UserpluginInstaller not fully loaded", - body: "You need to restart to allow the native to be loaded :)", - confirmText: "Restart now", - onConfirm() { - relaunch(); - }, - cancelText: "Later" - }); - - plSettings.customEntries.push(this.section); - - this.pluginsWithUpdates.registerCallback((value, id) => { - if (value.plugins.length === 0) return; - if (settings.store.neverNotifyForPlugins.split(",").map(t => t.trim().toLowerCase()).includes(value.plugins[value.plugins.length - 1].toLowerCase())) - return; - this.pluginsWithUpdates.deregisterCallback(id); - if (settings.store.notifyIfUpdate) - showNotification({ - title: "Some UserPlugins are out of date!", - body: "Click to open the UserPlugin Updater", - noPersist: true, - permanent: true, - onClick() { - OpenSettingsModule.openUserSettings("vencord_userplugins_panel"); - }, - }); - }); - const pls = await Native.getUserplugins(); - // @ts-ignore :trolley: - this.plugins.value(pls); - await this.checkPluginUpdates(); - }, - stop() { - // @ts-ignore - plSettings.customEntries.splice(plSettings.customEntries.indexOf(this.section), 1); - }, - plugins: new VariableWithCallbacks<{ - name: string; - description: string; - usesPreSend: boolean; - usesNative: boolean; - directory: string; - remote: string; - }[]>([]), - pluginsWithUpdates: new VariableWithCallbacks<{ - finished: boolean; - plugins: string[]; - }>({ - finished: false, - plugins: [] - }), - settings, - authors: [Devs.nin0dev], - renderMessageAccessory: props => { - return ; - } -}); diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts b/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts deleted file mode 100644 index b860a82c3..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2025 nin0 - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { classNameFactory } from "@api/Styles"; -import { relaunch } from "@utils/native"; -import { Alerts } from "@webpack/common"; - -// if edited, also edit in native.ts!!! -export const CLONE_LINK_REGEX = /https:\/\/(?:((?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org))\/(?!user-attachments)((?:[a-zA-Z0-9]|-)+)\/((?:[a-zA-Z0-9]|-|\.)+)(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?/; -export const WHITELISTED_SHARE_CHANNELS = ["1256395889354997771", "1032200195582197831", "1301947896601509900", "1322935137591365683"]; -export const cl = classNameFactory("vc-userplugininstaller-"); - -export function showInstallFinishedAlert(pluginToEnable: string, native: boolean) { - Alerts.show({ - title: "Done!", - body: `${pluginToEnable} has been successfully installed.${native ? " However, as it makes use of native functions, a client restart is required." : ""} What now?`, - confirmText: `Enable & ${native ? "restart" : "refresh"}`, - cancelText: native ? "Restart" : "Refresh", - onConfirm() { - !Vencord.Plugins.plugins[pluginToEnable] ? Vencord.Settings.plugins[pluginToEnable] = { enabled: true } : Vencord.Settings.plugins[pluginToEnable].enabled = true; - native ? relaunch() : window.location.reload(); - }, - onCancel: () => native ? relaunch() : window.location.reload() - }); -} diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt b/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt deleted file mode 100644 index 9486605c9..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - Review userplugin - - - - %WARNINGHIDER% %NATIVETSHIDER% %PRESENDHIDER% - - - -

Plugin info

-
-

%PLUGINNAME%

-

%PLUGINDESC%

-
- -

Warnings

-
-

Uses a native.ts file

-

- Use of this file allows the plugin to escape the browser sandbox - and potentially do anything to your system and data. - ONLY INSTALL THIS PLUGIN AFTER REVIEWING THE CODE AND BEING - 100% SURE THAT NOTHING BAD CAN BE DONE! -

-
- Acknowledge warning (required to allow - install) -
-
-

Has pre-send listeners

-

- This allows the plugin to edit your messages before they are - sent. -

-
-

- Reminder: installing a userplugin can be a destructive action. Make - sure that you know and trust the developer before installing any. -

-
- - -
- - diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt b/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt deleted file mode 100644 index 5e4e6938e..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - Git Path - - - - - -

Git path

-

- If you're having issues downloading userplugins because Git isn't properly detected, you can manually set a Git - path - that'll be used instead of - simply looking in PATH. -
- If you do not specify anything, Git will be called from the PATH variable. Do not set this setting unless you - have issues. -
-
- On Linux, Flatpak still isn't supported. -

- -
- - - -
- - - diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/style.css b/src/equicordplugins/userpluginInstaller.dev/misc/style.css deleted file mode 100644 index 098e37ea6..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/misc/style.css +++ /dev/null @@ -1,78 +0,0 @@ -.vc-userplugininstaller-info-card { - padding: 15px 20px; - margin-bottom: 20px; -} - -.vc-userplugininstaller-install-desc { - margin-top: 5px; -} - -.vc-userplugininstaller-install-field, -.vc-userplugininstaller-button-container { - margin-top: 10px; -} - -.vc-userplugininstaller-install-button { - margin-left: auto; -} - -.vc-userplugininstaller-update-check-container { - margin-top: 10px; -} - -.vc-userplugininstaller-plugins-grid { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 10px; - align-items: start; -} - -.vc-userplugininstaller-info-button { - height: 24px; - width: 24px; - padding: 0; - background: transparent; - color: var(--icon-secondary); - transition: background-color 0.2s ease; - - &:hover { - color: var(--interactive-hover); - } -} - -.vc-userplugininstaller-settings-button:hover { - color: var(--interactive-hover); -} - -.vc-userplugininstaller-plugin-footer { - margin-top: 10px; - display: flex; - flex-wrap: wrap; - gap: 5px; - - div { - flex-basis: 100%; - margin-top: 5px; - font-size: 0.9rem; - } -} - -.vc-userplugininstaller-outdated-list { - padding-left: 30px; - margin: 3px 0; - list-style-type: disc; -} - -.vc-userplugininstaller-delete-button { - height: 24px; - width: 24px; - padding: 0; - background: transparent; - margin-right: 8px; - color: var(--icon-muted); - transition: background-color .2s ease; - - &:hover { - color: var(--red-new-46) - } -} diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt b/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt deleted file mode 100644 index 573200223..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - Review userplugin - - - - -

Plugin info

-
-

%PLUGINNAME%

-

%PLUGINDESC%

-
-

Update info

-
-

%COMMITMESSAGE%

-
-

- You may want to review the - source code that will be applied. -

-
- -

- Reminder: installing a userplugin can be a destructive action. Make - sure that you know and trust the developer before installing any. -

-
- - -
- - diff --git a/src/equicordplugins/userpluginInstaller.dev/native.ts b/src/equicordplugins/userpluginInstaller.dev/native.ts deleted file mode 100644 index 1203b4a85..000000000 --- a/src/equicordplugins/userpluginInstaller.dev/native.ts +++ /dev/null @@ -1,473 +0,0 @@ -/* - * Vencord, a Discord client mod - * Copyright (c) 2025 nin0 - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -import { NativeSettings } from "@main/settings"; -import { exec, spawn } from "child_process"; -import { BrowserWindow, dialog, shell, WebContentsView } from "electron"; -import { existsSync, readdirSync, readFileSync } from "fs"; -import { readdir, readFile, rm } from "fs/promises"; -import { basename, join } from "path"; -import yaml from "yaml-js"; - -// @ts-ignore fuck off -import pluginValidateContent from "./misc/pluginValidate.txt"; // i would use HTML but esbuild is being whiny -// @ts-ignore fuck off -import setGitPathContent from "./misc/setGitPath.txt"; -// @ts-ignore fuck off -import updateValidateContent from "./misc/updateValidate.txt"; // see above - -const PLUGIN_META_REGEX = /export default definePlugin\((?:\s|\/(?:\/|\*).*)*{\s*(?:\s|\/(?:\/|\*).*)*name:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*,(?:\s|\/(?:\/|\*).*)*(?:\s|\/(?:\/|\*).*)*description:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*/; -// if edited, also edit in misc/constants.ts!!! -const CLONE_LINK_REGEX = /https:\/\/(?:((?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org))\/(?!user-attachments)((?:[a-zA-Z0-9]|-)+)\/((?:[a-zA-Z0-9]|-|\.)+)(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?/; - -const vencordPath = ["desktop", "equibop"].includes(basename(__dirname)) ? join(__dirname, "../") : __dirname; - -export async function rmPlugin(_, name: string): Promise { - // eslint-disable-next-line - return new Promise(async (resolve, reject) => { - const ups = await getUserplugins(); - const pl = ups.find(p => p.directory! === name); - if (!pl) return; - - const deleteReqDialog = await dialog.showMessageBox({ - title: "Uninstall plugin", - message: `Uninstall ${pl.name}`, - type: "error", - detail: `The uninstall of the userplugin ${pl.name} has been requested. Would you like to do so?\n\nIf you did not initiate this, press No.`, - buttons: ["No", "Yes"] - }); - - if (deleteReqDialog.response !== 1) return reject("User rejected"); - await rm(join(vencordPath, "../src/userplugins", name), { recursive: true }); - - await build(); - resolve("Done"); - }); -} - -export async function isUpdateAvailableForPlugin(_, name: string): Promise { - return new Promise(resolve => { - const pluginDir = join(vencordPath, "../src/userplugins", name); - const otherProc = exec("git fetch", { - cwd: pluginDir - }); - otherProc.once("close", () => { - async function doStuff() { - try { - const head = (await readFile(join(pluginDir, ".git/HEAD"), "utf8")).match(/^ref: (.+)/)![1]; - const remoteHead = (await readFile(join(pluginDir, ".git/refs/remotes/origin/HEAD"), "utf8")).match(/^ref: (.+)/)![1]; - const localCommit = await readFile(join(pluginDir, ".git", head), "utf8"); - const remoteCommit = await readFile(join(pluginDir, ".git", remoteHead), "utf8"); - - resolve(localCommit !== remoteCommit); - } - catch (e) { - resolve(false); - } - } - doStuff(); - }); - }); -} - -export function initPluginInstall(_, link: string, source: string, owner: string, repo: string): Promise { - // eslint-disable-next-line - return new Promise(async (resolve, reject) => { - const verifiedRegex = link.match(CLONE_LINK_REGEX)!; - const idpl = source === "plugins.nin0.dev" ? 1 : 0; - if (![4, 7].includes(verifiedRegex.length) || verifiedRegex[0] !== link || verifiedRegex[[1, 4][idpl]] !== source || verifiedRegex[[2, 5][idpl]] !== owner || verifiedRegex[[3, 6][idpl]] !== repo) return reject("Invalid link"); - - // Ask for clone - const cloneDialog = await dialog.showMessageBox({ - title: "Clone userplugin", - message: `You are about to clone a userplugin from ${source}.`, - type: "question", - detail: `The repository name is "${repo}" and it is owned by "${owner}".\nThe repository URL is ${link}\n\n(If you did not request this intentionally, choose Cancel)`, - buttons: ["Cancel", "Clone repository and continue install", "Open repository in browser"] - }); - switch (cloneDialog.response) { - case 0: { - return reject("Rejected by user"); - } - case 1: { - await cloneRepo(link, repo); - break; - } - case 2: { - await shell.openExternal(link); - return reject("silentStop"); - } - } - - // Get plugin meta - const meta = await getPluginMeta(join(vencordPath, "..", "src", "userplugins", repo)); - - // Review plugin - const win = new BrowserWindow({ - maximizable: false, - minimizable: false, - width: 560, - height: meta.usesNative || meta.usesPreSend ? 650 : 360, - resizable: false, - webPreferences: { - devTools: true - }, - title: "Review userplugin", - modal: true, - parent: BrowserWindow.getAllWindows()[0], - show: false, - autoHideMenuBar: true - }); - const reView /* haha got it */ = new WebContentsView({ - webPreferences: { - devTools: true, - nodeIntegration: true - } - }); - win.contentView.addChildView(reView); - win.loadURL(generateReviewPluginContent(meta)); - win.on("page-title-updated", async e => { - switch (win.webContents.getTitle() as "abortInstall" | "reviewCode" | "install") { - case "abortInstall": { - win.close(); - await rm(join(vencordPath, "..", "src", "userplugins", repo), { - recursive: true - }); - return reject("Rejected by user"); - } - case "install": { - win.close(); - try { - await build(); - } - catch (e) { - reject((e as Error).toString()); - } - resolve(JSON.stringify({ - name: meta.name, - native: meta.usesNative - })); - break; - } - } - }); - win.show(); - }); -} - -async function build(): Promise { - return new Promise((resolve, reject) => { - const proc = exec("pnpm build --dev", { - cwd: join(vencordPath, ".."), - shell: process.env.SHELL || process.env.ComSpec || "/bin/sh" - }); - proc.once("close", () => { - if (proc.exitCode !== 0) { - reject("Failed to build Vencord, try building from console"); - } - resolve("Success"); - }); - }); -} - -async function getPluginMeta(path: string, extra: object = {}): Promise<{ - name: string; - description: string; - usesPreSend: boolean; - usesNative: boolean; - directory?: string; - remote: string; - supportChannelID?: string; -}> { - return new Promise((resolve, reject) => { - const files = readdirSync(path); - let fileToRead: "index.ts" | "index.tsx" | "index.js" | "index.jsx" | undefined; - files.forEach(f => { - if (f === "index.ts") fileToRead = "index.ts"; - if (f === "index.tsx") fileToRead = "index.tsx"; - if (f === "index.js") fileToRead = "index.js"; - if (f === "index.jsx") fileToRead = "index.jsx"; - }); - if (!fileToRead) reject("Invalid plugin"); - - const file = readFileSync(`${path}/${fileToRead}`, "utf8"); - let remoteURL; - try { - const remoteC = readFileSync(join(path, ".git/config"), "utf8"); - remoteURL = remoteC.match(/\[remote "origin"]\s+url = (https:\/\/(?:(?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org)\/(?!user-attachments)(?:[a-zA-Z0-9]|-)+\/(?:[a-zA-Z0-9]|-|\.)+(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?)\n/); - } catch { - remoteURL = null; - } - - let supportChannelID; - try { - const meta = readFileSync(join(path, "meta.yml"), "utf8"); - console.log(meta); - const parsed = yaml.load(meta); - if (parsed.thread && typeof parsed.thread === "string" && /^\d+$/.test(parsed.thread)) { - supportChannelID = parsed.thread; - } - } catch { - supportChannelID = null; - } - - const rawMeta = file.match(PLUGIN_META_REGEX); - resolve({ - name: rawMeta![1], - description: rawMeta![2], - usesPreSend: file.includes("PreSendListener") || file.includes("onBeforeMessage"), - usesNative: files.includes("native.ts") || files.includes("native.js"), - remote: remoteURL ? remoteURL[1] : "", - supportChannelID, - ...extra - }); - - }); -} - -async function cloneRepo(link: string, repo: string): Promise { - return new Promise((resolve, reject) => { - const proc = spawn("git", ["clone", link], { - cwd: join(vencordPath, "..", "src", "userplugins") - }); - proc.once("close", async () => { - if (proc.exitCode !== 0) { - if (!existsSync(join(vencordPath, "..", "src", "userplugins", repo))) - return reject("Failed to clone"); - const deleteReqDialog = await dialog.showMessageBox({ - title: "Error", - message: "Plugin already exists", - type: "error", - detail: `The plugin that you tried to clone already exists at ${join(vencordPath, "..", "src", "userplugins")}.\nWould you like to reclone it? Only do this if you want to reinstall or update the plugin.`, - buttons: ["No", "Yes"] - }); - if (deleteReqDialog.response !== 1) return reject("User rejected"); - await rm(join(vencordPath, "..", "src", "userplugins", repo), { - recursive: true - }); - await cloneRepo(link, repo); - } - resolve(); - }); - }); -} - -function generateReviewPluginContent(meta: { - name: string; - description: string; - usesPreSend: boolean; - usesNative: boolean; -}): string { - const template = pluginValidateContent.replace("%PLUGINNAME%", meta.name.replaceAll("<", "<")).replace("%PLUGINDESC%", meta.description.replaceAll("<", "<")).replace("%WARNINGHIDER%", !meta.usesNative && !meta.usesPreSend ? "[data-useless=\"warning\"] { display: none !important; }" : "").replace("%NATIVETSHIDER%", meta.usesNative ? "" : "#native-ts-warning { display: none !important; }").replace("%PRESENDHIDER%", meta.usesPreSend ? "" : "#pre-send-warning { display: none !important; }"); - const buf = Buffer.from(template).toString("base64"); - return `data:text/html;base64,${buf}`; -} - -function generateUpdatePluginContent(meta: { - name: string; - description: string; - remote: string; - commit: string; -}): string { - const template = updateValidateContent.replace("%PLUGINNAME%", meta.name.replaceAll("<", "<")).replace("%PLUGINDESC%", meta.description.replaceAll("<", "<")).replace("%REMOTE%", meta.remote).replace("%COMMITMESSAGE%", meta.commit.replaceAll("\n", "
")); - const buf = Buffer.from(template).toString("base64"); - return `data:text/html;base64,${buf}`; -} - -export async function getUserplugins() { - const folderContents = await readdir(join(vencordPath, "..", "src", "userplugins"), { - withFileTypes: true - }); - const plugins = await Promise.allSettled( - folderContents - .filter(item => item.isDirectory()) - .map(item => ({ - path: join(item.parentPath, item.name), - directory: item.name - })) - .map(({ path, directory }) => getPluginMeta(path, { directory })) - ); - - return plugins - .filter(p => p.status === "fulfilled") - .map(p => p.value); -} - -export async function updatePlugin(_, directory: string) { - return new Promise((resolve, reject) => { - const pluginDir = join(vencordPath, "../src/userplugins", directory); - - async function doStuff() { - const pluginMeta = await getPluginMeta(pluginDir); - - const win = new BrowserWindow({ - maximizable: false, - minimizable: false, - width: 560, - height: 600, - resizable: false, - webPreferences: { - devTools: true - }, - title: "Review userplugin", - modal: true, - parent: BrowserWindow.getAllWindows()[0], - show: false, - autoHideMenuBar: true - }); - const reView /* haha got it */ = new WebContentsView({ - webPreferences: { - devTools: true, - nodeIntegration: true - } - }); - win.contentView.addChildView(reView); - - const commitProc = exec("git log origin/HEAD...HEAD --oneline --pretty=format:%an////////%h////////%H////////%s", { - cwd: pluginDir - }); - let rawOutput = ""; - commitProc.stdout?.on("data", d => { - rawOutput += String(d); - }); - commitProc.once("close", () => { - win.loadURL(generateUpdatePluginContent({ - name: pluginMeta.name, - description: pluginMeta.description, - remote: pluginMeta.remote, - commit: rawOutput.split("\n").map(line => line.split("////////")).map(([user, shortCommit, longCommit, message]) => `${user} (${shortCommit}) ~ ${message}`).join("\n") - })); - win.on("page-title-updated", async e => { - if (win.webContents.getTitle().startsWith("openLink:")) { - await shell.openExternal(win.webContents.getTitle().replace("openLink:", "")); - } - switch (win.webContents.getTitle() as "abortInstall" | "install") { - case "abortInstall": { - win.close(); - return reject("Rejected by user"); - } - case "install": { - win.close(); - try { - const otherProc = exec("git rebase origin/HEAD", { - cwd: pluginDir - }); - let errored = ""; - otherProc.stderr?.on("data", d => { if (String(d).includes("Success")) return; errored += String(d); }); - otherProc.once("close", () => { - if (errored) if (!errored.includes("Success")) return reject(`Failed to apply the update, chances are you have local changes that conflict with your remote. Git errors:\n\n${errored}`); - build().then(() => resolve(JSON.stringify({ - name: pluginMeta.name, - native: pluginMeta.usesNative - }))); - }); - } - catch (e) { - reject((e as Error).toString()); - } - break; - } - } - }); - }); - win.show(); - } - doStuff(); - }); -} - -export async function openGitPathModal(_: any) { - const gitPathSet: string | undefined = NativeSettings.store.plugins.UserpluginInstaller?.gitPath; - const win = new BrowserWindow({ - maximizable: false, - minimizable: false, - width: 560, - height: 400, - resizable: false, - webPreferences: { - devTools: true - }, - title: "Set Git path", - modal: true, - parent: BrowserWindow.getAllWindows()[0], - show: false, - autoHideMenuBar: true - }); - const reView = new WebContentsView({ - webPreferences: { - devTools: true, - nodeIntegration: true - } - }); - win.contentView.addChildView(reView); - win.loadURL(`data:text/html;base64,${Buffer.from(setGitPathContent).toString("base64")}`); - win.on("page-title-updated", async _ => { - const t = win.webContents.getTitle(); - if (t === "abort") win.close(); - if (t.startsWith("ok")) { - if (!NativeSettings.store.plugins.UserpluginInstaller) { - NativeSettings.store.plugins.UserpluginInstaller = { - gitPath: undefined - }; - } - if (t === "ok-") { - NativeSettings.store.plugins.UserpluginInstaller.gitPath = undefined; - } else { - const gitPath2 = t.split("-").toSpliced(0, 1).join("-"); - NativeSettings.store.plugins.UserpluginInstaller.gitPath = gitPath2; - } - win.close(); - } - if (t.startsWith("check")) { - try { - const gitProc = spawn(t === "check-" ? "git" : t.split("-").toSpliced(0, 1).join("-"), ["--version"]); - let rawOutput = ""; - gitProc.stdout?.on("data", d => { - rawOutput += String(d); - }); - gitProc.on("error", e => { - dialog.showMessageBox({ - title: "Error", - message: "Git error", - type: "error", - detail: `${e}\n\nDouble-check the path you entered.`, - buttons: ["OK"] - }); - }); - gitProc.once("close", () => { - if (gitProc.exitCode === 0) { - dialog.showMessageBox({ - title: "Success", - message: "Git works!", - type: "info", - detail: `Successfully called ${rawOutput.trim()}`, - buttons: ["OK"] - }); - } - }); - } catch (e) { - dialog.showMessageBox({ - title: "Error", - message: "Git error", - type: "error", - detail: `${e}\n\nDouble-check the path you entered.`, - buttons: ["OK"] - }); - } - } - }); - win.show(); - if (gitPathSet) { - win.webContents.executeJavaScript(`document.querySelector("input").value = ${JSON.stringify(gitPathSet)};`); - } - - console.log(yaml.load(` - name: test - items: - - a - - b - `)); -} diff --git a/src/equicordplugins/vcNarratorCustom/index.tsx b/src/equicordplugins/vcNarratorCustom/index.tsx index fac57eced..c9d80123c 100644 --- a/src/equicordplugins/vcNarratorCustom/index.tsx +++ b/src/equicordplugins/vcNarratorCustom/index.tsx @@ -895,7 +895,6 @@ const UserContextMenuPatch: NavContextMenuPatchCallback = (children, { user }: U export default definePlugin({ name: "VcNarratorCustom", description: "Announces when users join, leave, or move voice channels via narrator using TikTok TTS. Revamped and back from the dead.", - tags: ["Accessibility", "Voice"], authors: [Devs.Ven, Devs.Nyako, EquicordDevs.Loukios, EquicordDevs.examplegit], settings, contextMenus: { diff --git a/src/equicordplugins/vcPanelSettings/index.tsx b/src/equicordplugins/vcPanelSettings/index.tsx index 24893ae04..bfc60e08f 100644 --- a/src/equicordplugins/vcPanelSettings/index.tsx +++ b/src/equicordplugins/vcPanelSettings/index.tsx @@ -238,7 +238,6 @@ function VoiceSettings() { export default definePlugin({ name: "VCPanelSettings", description: "Control voice settings right from the voice panel", - tags: ["Utility", "Voice"], authors: [Devs.nin0dev], settings, renderVoiceSettings() { return ; }, diff --git a/src/equicordplugins/viewRawVariant/index.tsx b/src/equicordplugins/viewRawVariant/index.tsx index 97730526b..41597a401 100644 --- a/src/equicordplugins/viewRawVariant/index.tsx +++ b/src/equicordplugins/viewRawVariant/index.tsx @@ -129,7 +129,6 @@ function makeContextCallback( export default definePlugin({ name: "ViewRawVariant", description: "Copy/View raw content of any message, channel, or guild, but show in the right click menu.", - tags: ["Appearance", "Customisation", "Chat", "Organisation", "Servers"], authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna, Devs.Kyuuhachi], contextMenus: { "guild-context": makeContextCallback("guild", val => diff --git a/src/equicordplugins/voiceButtons/index.tsx b/src/equicordplugins/voiceButtons/index.tsx index 4654572ff..af960f502 100644 --- a/src/equicordplugins/voiceButtons/index.tsx +++ b/src/equicordplugins/voiceButtons/index.tsx @@ -16,7 +16,6 @@ import { UserChatButton, UserDeafenButton, UserMuteButton } from "./utils"; export default definePlugin({ name: "VoiceButtons", description: "Quickly DM, mute, or deafen any user right from the voice-call panel.", - tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.nicola02nb, EquicordDevs.omaw], settings, patches: [ diff --git a/src/equicordplugins/voiceChannelLog/index.tsx b/src/equicordplugins/voiceChannelLog/index.tsx index 377ff7503..a0e4d1d9c 100644 --- a/src/equicordplugins/voiceChannelLog/index.tsx +++ b/src/equicordplugins/voiceChannelLog/index.tsx @@ -54,9 +54,8 @@ const patchChannelContextMenu: NavContextMenuPatchCallback = (children, { channe export default definePlugin({ name: "VoiceChannelLog", description: "Logs voice channel activity including joins, leaves, soundboard, mute, camera, screenshare, and more.", - tags: ["Servers", "Utility", "Voice"], authors: [Devs.Sqaaakoi, Devs.thororen, EquicordDevs.nyx, Devs.Moxxie, EquicordDevs.Fres, Devs.amy], - dependencies: ["AudioPlayerAPI", "HeaderBarAPI"], + dependencies: ["AudioPlayerAPI"], settings, contextMenus: { "channel-context": patchChannelContextMenu diff --git a/src/equicordplugins/voiceChatUtils/index.tsx b/src/equicordplugins/voiceChatUtils/index.tsx index a9ebea15f..421000cf7 100644 --- a/src/equicordplugins/voiceChatUtils/index.tsx +++ b/src/equicordplugins/voiceChatUtils/index.tsx @@ -174,7 +174,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "VoiceChatUtilities", description: "This plugin allows you to perform multiple actions on an entire channel (move, mute, disconnect, etc.) (originally by dutake)", - tags: ["Chat", "Servers", "Voice"], authors: [Devs.D3SOX, EquicordDevs.nickwoah], settings, diff --git a/src/equicordplugins/voiceJoinMessages/index.ts b/src/equicordplugins/voiceJoinMessages/index.ts index 3fdc3499b..12824ab91 100644 --- a/src/equicordplugins/voiceJoinMessages/index.ts +++ b/src/equicordplugins/voiceJoinMessages/index.ts @@ -111,7 +111,6 @@ let clientOldChannelId: string | undefined; export default definePlugin({ name: "VoiceJoinMessages", description: "Recieve client-side ephemeral messages when your friends join voice channels", - tags: ["Servers", "Utility", "Voice"], authors: [Devs.Sqaaakoi, Devs.thororen], settings, flux: { diff --git a/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx b/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx index db2d8def3..f60724321 100644 --- a/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx +++ b/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx @@ -314,7 +314,6 @@ export default definePlugin({ name: "VoiceMessageTranscriber", authors: [Devs.TheSun], description: "On-device transcriptions for voice messages powered by Whisper v3", - tags: ["Chat", "Media", "Utility", "Voice"], patches: [ { find: ".VOICE_MESSAGE)),", diff --git a/src/equicordplugins/voiceRejoin/index.tsx b/src/equicordplugins/voiceRejoin/index.tsx index 291bd7aee..12042df43 100644 --- a/src/equicordplugins/voiceRejoin/index.tsx +++ b/src/equicordplugins/voiceRejoin/index.tsx @@ -51,7 +51,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "VoiceRejoin", description: "Rejoins DM/Server call automatically when restarting Discord.", - tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.omaw, EquicordDevs.keircn], settings, diff --git a/src/equicordplugins/waitForSlot/index.tsx b/src/equicordplugins/waitForSlot/index.tsx index 4df55ee89..fbcfd636e 100644 --- a/src/equicordplugins/waitForSlot/index.tsx +++ b/src/equicordplugins/waitForSlot/index.tsx @@ -64,7 +64,6 @@ function promptVoiceChannel(channel: Channel | null | undefined): boolean { export default definePlugin({ name: "WaitForSlot", description: "Automatically join a full voice channel when a slot opens.", - tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.omaw, Devs.prism], settings, patches: [ diff --git a/src/equicordplugins/wallpaperFree/index.tsx b/src/equicordplugins/wallpaperFree/index.tsx index 6cd0364c4..cfc8fe99e 100644 --- a/src/equicordplugins/wallpaperFree/index.tsx +++ b/src/equicordplugins/wallpaperFree/index.tsx @@ -33,7 +33,6 @@ export default definePlugin({ name: "WallpaperFree", authors: [Devs.Joona], description: "Recreation of the old DM wallpaper experiment; Set a background image for any channel, user or server.", - tags: ["Appearance", "Chat", "Customisation"], patches: [ { find: ".handleSendMessage,onResize", diff --git a/src/equicordplugins/webpackTarball/index.tsx b/src/equicordplugins/webpackTarball/index.tsx index c96e9011c..536e1212c 100644 --- a/src/equicordplugins/webpackTarball/index.tsx +++ b/src/equicordplugins/webpackTarball/index.tsx @@ -31,7 +31,6 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "WebpackTarball", description: "Converts Discord's webpack sources into a tarball.", - tags: ["Developers", "Utility"], authors: [Devs.Kyuuhachi], settings, diff --git a/src/equicordplugins/whitelistedEmojis/index.tsx b/src/equicordplugins/whitelistedEmojis/index.tsx index 7a72e531f..70d21eb37 100644 --- a/src/equicordplugins/whitelistedEmojis/index.tsx +++ b/src/equicordplugins/whitelistedEmojis/index.tsx @@ -597,7 +597,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhitelistedEmojis", description: "Adds the ability to disable all message emojis except for a whitelisted set.", - tags: ["Chat", "Emotes"], authors: [EquicordDevs.creations], patches: [ { diff --git a/src/equicordplugins/whosWatching/index.tsx b/src/equicordplugins/whosWatching/index.tsx index e7dfe0020..2412d1827 100644 --- a/src/equicordplugins/whosWatching/index.tsx +++ b/src/equicordplugins/whosWatching/index.tsx @@ -82,7 +82,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhosWatching", description: "Hover over the screenshare icon to view what users are watching your stream", - tags: ["Activity"], authors: [EquicordDevs.Fres, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/wigglyText/index.tsx b/src/equicordplugins/wigglyText/index.tsx index b3118029f..1f683e9e6 100644 --- a/src/equicordplugins/wigglyText/index.tsx +++ b/src/equicordplugins/wigglyText/index.tsx @@ -112,7 +112,6 @@ const updateStyles = () => { export default definePlugin({ name: "WigglyText", description: "Adds a new markdown formatting that makes text wiggly.", - tags: ["Appearance", "Customisation", "Fun"], authors: [EquicordDevs.nexpid], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/writeUpperCase/index.ts b/src/equicordplugins/writeUpperCase/index.ts index 81a9a329a..263b1a231 100644 --- a/src/equicordplugins/writeUpperCase/index.ts +++ b/src/equicordplugins/writeUpperCase/index.ts @@ -37,7 +37,6 @@ const presendObject: MessageSendListener = (_, msg) => { export default definePlugin({ name: "WriteUpperCase", description: "Changes the first Letter of each Sentence in Message Inputs to Uppercase", - tags: ["Appearance", "Customisation", "Chat"], authors: [Devs.Samwich, EquicordDevs.KrystalSkull], settings, diff --git a/src/main/utils/extensions.ts b/src/main/utils/extensions.ts index 0b19d9286..9ecfbfe82 100644 --- a/src/main/utils/extensions.ts +++ b/src/main/utils/extensions.ts @@ -79,6 +79,6 @@ export async function installExt(id: string) { .catch(err => console.error(`Failed to extract extension ${id}`, err)); } - // Electron 36 Deprecates session.defaultSession.loadExtension() + // @ts-expect-error Electron 36 Deprecates session.defaultSession.loadExtension() session.defaultSession.extensions ? session.defaultSession.extensions.loadExtension(extDir) : session.defaultSession.loadExtension(extDir); } diff --git a/src/plugins/_core/supportHelper.tsx b/src/plugins/_core/supportHelper.tsx index 385472477..a2e1d8172 100644 --- a/src/plugins/_core/supportHelper.tsx +++ b/src/plugins/_core/supportHelper.tsx @@ -289,7 +289,7 @@ export default definePlugin({ required: true, description: "Helps us provide support to you", authors: [Devs.Ven], - dependencies: ["UserSettingsAPI", "CommandsAPI", "MessageAccessoriesAPI"], + dependencies: ["UserSettingsAPI"], settings, diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index dad81c7bb..12f5f5cbb 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -70,7 +70,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AccountPanelServerProfile", description: "Right click your account panel in the bottom left to view your profile in the current server", - tags: ["Appearance", "Servers"], authors: [Devs.Nuckyz, Devs.relitrix], settings, @@ -80,7 +79,7 @@ export default definePlugin({ group: true, replacement: [ { - match: /(\.AVATAR,children:.+?renderPopout:\(?(\i)(?:,\i\))?=>){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, + match: /(\.AVATAR,children:.+?renderPopout:(\i)=>){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, replace: (_, rest, popoutProps, originalPopout, currentUser) => `${rest}$self.UserProfile({popoutProps:${popoutProps},currentUser:${currentUser},originalRenderPopout:()=>{${originalPopout}}})` }, { diff --git a/src/plugins/alwaysAnimate/index.ts b/src/plugins/alwaysAnimate/index.ts index e66792ee5..071596253 100644 --- a/src/plugins/alwaysAnimate/index.ts +++ b/src/plugins/alwaysAnimate/index.ts @@ -51,7 +51,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AlwaysAnimate", description: "Animates anything that can be animated", - tags: ["Appearance", "Fun"], authors: [Devs.FieryFlames], settings, patches: [ diff --git a/src/plugins/alwaysExpandRoles/index.ts b/src/plugins/alwaysExpandRoles/index.ts index 502679ea9..7ad1e6fae 100644 --- a/src/plugins/alwaysExpandRoles/index.ts +++ b/src/plugins/alwaysExpandRoles/index.ts @@ -33,7 +33,6 @@ migratePluginSettings("AlwaysExpandRoles", "ShowAllRoles"); export default definePlugin({ name: "AlwaysExpandRoles", description: "Always expands the role list in profile popouts", - tags: ["Appearance", "Roles"], authors: [Devs.surgedevs], isModified: true, settings, diff --git a/src/plugins/alwaysTrust/index.tsx b/src/plugins/alwaysTrust/index.tsx index 1682fc50a..a7d975726 100644 --- a/src/plugins/alwaysTrust/index.tsx +++ b/src/plugins/alwaysTrust/index.tsx @@ -60,7 +60,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AlwaysTrust", description: "Removes the annoying untrusted domain and suspicious file popup", - tags: ["Utility"], authors: [Devs.zt, Devs.Trwy], isModified: true, settings, diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx index 565ec1a39..f136d08a0 100644 --- a/src/plugins/anonymiseFileNames/index.tsx +++ b/src/plugins/anonymiseFileNames/index.tsx @@ -75,8 +75,6 @@ export default definePlugin({ name: "AnonymiseFileNames", authors: [Devs.fawn], description: "Anonymise uploaded file names", - dependencies: ["CommandsAPI"], - tags: ["Privacy", "Utility"], isModified: true, settings, diff --git a/src/plugins/appleMusic.desktop/index.tsx b/src/plugins/appleMusic.desktop/index.tsx index c477f8e2a..e265f4efc 100644 --- a/src/plugins/appleMusic.desktop/index.tsx +++ b/src/plugins/appleMusic.desktop/index.tsx @@ -157,7 +157,6 @@ function getImageAsset(type: AssetImageType, data: TrackData) { export default definePlugin({ name: "AppleMusicRichPresence", description: "Discord rich presence for your Apple Music!", - tags: ["Activity", "Media"], authors: [Devs.RyanCaoDev], hidden: !IS_MAC, reporterTestable: ReporterTestable.None, diff --git a/src/plugins/arRPC.web/index.tsx b/src/plugins/arRPC.web/index.tsx index 31a813211..e602b18eb 100644 --- a/src/plugins/arRPC.web/index.tsx +++ b/src/plugins/arRPC.web/index.tsx @@ -42,7 +42,6 @@ migratePluginSettings("WebRichPresence", "WebRichPresence (arRPC)"); export default definePlugin({ name: "WebRichPresence", description: "Client plugin for arRPC to enable RPC on Discord Web (experimental)", - tags: ["Activity", "Utility"], authors: [Devs.Ducko], reporterTestable: ReporterTestable.None, hidden: !IS_EQUIBOP && !IS_VESKTOP && !("legcord" in window), diff --git a/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts b/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts index 2c74fec66..d1dbdc213 100644 --- a/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts +++ b/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts @@ -48,7 +48,6 @@ migratePluginSettings("AutoDNDWhilePlaying", "StatusWhilePlaying"); export default definePlugin({ name: "AutoDNDWhilePlaying", description: "Automatically updates your online status (online, idle, dnd) when launching games", - tags: ["Activity", "Utility"], authors: [Devs.thororen], isModified: true, settings, diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx index 947768aac..caaa38991 100644 --- a/src/plugins/betterFolders/index.tsx +++ b/src/plugins/betterFolders/index.tsx @@ -254,9 +254,9 @@ const GRID_STYLE_NAME = "vc-betterFolders-sidebar-grid"; export default definePlugin({ name: "BetterFolders", description: "Shows server folders on dedicated sidebar and adds folder related improvements", - tags: ["Organisation", "Servers", "Appearance"], authors: [Devs.juby, Devs.AutumnVN, Devs.Nuckyz], isModified: true, + settings, start() { settings.store.nestedFolders = getNestedFolderMap(); diff --git a/src/plugins/betterGifAltText/index.ts b/src/plugins/betterGifAltText/index.ts index 3b95f912e..0a381e547 100644 --- a/src/plugins/betterGifAltText/index.ts +++ b/src/plugins/betterGifAltText/index.ts @@ -24,7 +24,6 @@ export default definePlugin({ authors: [Devs.Ven], description: "Change GIF alt text from simply being 'GIF' to containing the gif tags / filename", - tags: ["Media", "Accessibility", "Customisation"], patches: [ { find: ".modalContext})};", diff --git a/src/plugins/betterGifPicker/index.ts b/src/plugins/betterGifPicker/index.ts index 3718b03eb..cb2675886 100644 --- a/src/plugins/betterGifPicker/index.ts +++ b/src/plugins/betterGifPicker/index.ts @@ -20,7 +20,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterGifPicker", description: "Makes the gif picker open the favourite category by default", - tags: ["Emotes", "Customisation"], authors: [Devs.Samwich, EquicordDevs.justjxke], isModified: true, settings, diff --git a/src/plugins/betterNotes/index.tsx b/src/plugins/betterNotes/index.tsx index 465010cff..68aa70c61 100644 --- a/src/plugins/betterNotes/index.tsx +++ b/src/plugins/betterNotes/index.tsx @@ -40,7 +40,6 @@ export default definePlugin({ name: "BetterNotesBox", description: "Hide notes or disable spellcheck (Configure in settings!!)", authors: [Devs.Ven], - tags: ["Customisation", "Utility"], settings, patches: [ diff --git a/src/plugins/betterRoleContext/index.tsx b/src/plugins/betterRoleContext/index.tsx index 6a3ec4141..4a99d8822 100644 --- a/src/plugins/betterRoleContext/index.tsx +++ b/src/plugins/betterRoleContext/index.tsx @@ -90,7 +90,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterRoleContext", description: "Adds options to copy role color / edit role / view role icon when right clicking roles in the user profile", - tags: ["Roles", "Appearance"], authors: [Devs.Ven, Devs.goodbee], dependencies: ["UserSettingsAPI"], diff --git a/src/plugins/betterRoleDot/index.ts b/src/plugins/betterRoleDot/index.ts index 89caa0056..3cdff9bb4 100644 --- a/src/plugins/betterRoleDot/index.ts +++ b/src/plugins/betterRoleDot/index.ts @@ -40,7 +40,6 @@ export default definePlugin({ name: "BetterRoleDot", authors: [Devs.Ven, Devs.AutumnVN], description: "Copy role colour on RoleDot (accessibility setting) click. Also allows using both RoleDot and coloured names simultaneously", - tags: ["Roles", "Appearance"], settings, patches: [ diff --git a/src/plugins/betterSessions/index.tsx b/src/plugins/betterSessions/index.tsx index cb016f856..fcdfbfece 100644 --- a/src/plugins/betterSessions/index.tsx +++ b/src/plugins/betterSessions/index.tsx @@ -56,7 +56,7 @@ export default definePlugin({ name: "BetterSessions", description: "Enhances the sessions (devices) menu. Allows you to view exact timestamps, give each session a custom name, and receive notifications about new sessions.", authors: [Devs.amia], - tags: ["Notifications", "Customisation", "Utility"], + settings: settings, patches: [ diff --git a/src/plugins/betterSessions/styles.css b/src/plugins/betterSessions/styles.css index fafba1ed0..adfc283f0 100644 --- a/src/plugins/betterSessions/styles.css +++ b/src/plugins/betterSessions/styles.css @@ -7,11 +7,13 @@ .vc-betterSessions-rename-btn { margin-left: 4px; translate: 0 -2px; + width: fit-content; } .vc-betterSessions-new-btn { margin-left: 4px; translate: 0 -2px; + width: fit-content; pointer-events: none; padding: 1px 4px; } \ No newline at end of file diff --git a/src/plugins/betterSettings/index.tsx b/src/plugins/betterSettings/index.tsx index 58591d6ed..fb95d41ba 100644 --- a/src/plugins/betterSettings/index.tsx +++ b/src/plugins/betterSettings/index.tsx @@ -78,7 +78,6 @@ export default definePlugin({ name: "BetterSettings", description: "Enhances your settings-menu-opening experience", authors: [Devs.Kyuuhachi], - tags: ["Appearance", "Customisation", "Organisation"], settings, start() { diff --git a/src/plugins/betterUploadButton/index.ts b/src/plugins/betterUploadButton/index.ts index 44fe643d2..9639dc60a 100644 --- a/src/plugins/betterUploadButton/index.ts +++ b/src/plugins/betterUploadButton/index.ts @@ -23,7 +23,6 @@ export default definePlugin({ name: "BetterUploadButton", authors: [Devs.fawn, Devs.Ven], description: "Upload with a single click, open menu with right click", - tags: ["Utility", "Shortcuts"], patches: [ { find: ".CHAT_INPUT_BUTTON_NOTIFICATION,", diff --git a/src/plugins/biggerStreamPreview/index.tsx b/src/plugins/biggerStreamPreview/index.tsx index a1e8959c9..2e8beb86a 100644 --- a/src/plugins/biggerStreamPreview/index.tsx +++ b/src/plugins/biggerStreamPreview/index.tsx @@ -89,7 +89,6 @@ export const userContextPatch: NavContextMenuPatchCallback = (children, { user } export default definePlugin({ name: "BiggerStreamPreview", description: "This plugin allows you to enlarge stream previews", - tags: ["Media", "Appearance"], authors: [Devs.phil], contextMenus: { "user-context": userContextPatch, diff --git a/src/plugins/blurNsfw/index.ts b/src/plugins/blurNsfw/index.ts index e959d7ffc..d37545836 100644 --- a/src/plugins/blurNsfw/index.ts +++ b/src/plugins/blurNsfw/index.ts @@ -43,7 +43,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BlurNSFW", description: "Blur attachments in NSFW channels until hovered", - tags: ["Privacy", "Appearance"], authors: [Devs.Ven], isModified: true, settings, diff --git a/src/plugins/callTimer/index.tsx b/src/plugins/callTimer/index.tsx index 8d50732e4..a006a793c 100644 --- a/src/plugins/callTimer/index.tsx +++ b/src/plugins/callTimer/index.tsx @@ -111,7 +111,6 @@ migrateSettingsFromPlugin("CallTimer", "AllCallTimers", "showWithoutHover", "sho export default definePlugin({ name: "CallTimer", description: "Add call timers for all users in voice channels and in the connection status.", - tags: ["Voice", "Utility"], authors: [Devs.Ven, EquicordDevs.MaxHerbold, Devs.D3SOX], managedStyle: alignedChatInputFix, settings, diff --git a/src/plugins/characterCounter/index.tsx b/src/plugins/characterCounter/index.tsx index 57b9c3f30..209924bc2 100644 --- a/src/plugins/characterCounter/index.tsx +++ b/src/plugins/characterCounter/index.tsx @@ -35,7 +35,6 @@ export default definePlugin({ name: "CharacterCounter", description: "Adds a character counter to the chat input", authors: [Devs.thororen], - tags: ["Utility"], settings, patches: [ { diff --git a/src/plugins/clearURLs/index.ts b/src/plugins/clearURLs/index.ts index 6affa8f9b..362706079 100644 --- a/src/plugins/clearURLs/index.ts +++ b/src/plugins/clearURLs/index.ts @@ -50,8 +50,6 @@ interface RuleSet { export default definePlugin({ name: "ClearURLs", description: "Automatically removes tracking elements from URLs you send", - dependencies: ["MessageEventsAPI"], - tags: ["Privacy", "Utility"], authors: [Devs.adryd, Devs.thororen], rules: [] as RuleSet[], diff --git a/src/plugins/clientTheme/index.tsx b/src/plugins/clientTheme/index.tsx index 48e16971d..984318e29 100644 --- a/src/plugins/clientTheme/index.tsx +++ b/src/plugins/clientTheme/index.tsx @@ -29,7 +29,6 @@ export default definePlugin({ name: "ClientTheme", authors: [Devs.Nuckyz], description: "Recreation of the old client theme experiment. Add a color to your Discord client theme", - tags: ["Appearance", "Customisation"], settings, startAt: StartAt.DOMContentLoaded, diff --git a/src/plugins/colorSighted/index.ts b/src/plugins/colorSighted/index.ts index 0f9201632..025cfb94e 100644 --- a/src/plugins/colorSighted/index.ts +++ b/src/plugins/colorSighted/index.ts @@ -23,7 +23,6 @@ export default definePlugin({ name: "ColorSighted", description: "Removes the colorblind-friendly icons from statuses, just like 2015-2017 Discord", authors: [Devs.lewisakura], - tags: ["Appearance", "Accessibility"], patches: [ { find: "Masks.STATUS_ONLINE", diff --git a/src/plugins/consoleJanitor/index.tsx b/src/plugins/consoleJanitor/index.tsx index b3e2d4f69..f01be7791 100644 --- a/src/plugins/consoleJanitor/index.tsx +++ b/src/plugins/consoleJanitor/index.tsx @@ -109,7 +109,6 @@ export default definePlugin({ name: "ConsoleJanitor", description: "Disables annoying console messages/errors", authors: [Devs.Nuckyz, Devs.sadan], - tags: ["Developers", "Console", "Utility"], settings, startAt: StartAt.Init, diff --git a/src/plugins/consoleShortcuts/index.ts b/src/plugins/consoleShortcuts/index.ts index f8edc29ad..8b158e6df 100644 --- a/src/plugins/consoleShortcuts/index.ts +++ b/src/plugins/consoleShortcuts/index.ts @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import { loadLazyChunks } from "@debug/loadLazyChunks"; import { Devs } from "@utils/constants"; import { getCurrentChannel, getCurrentGuild } from "@utils/discord"; import { runtimeHashMessageKey } from "@utils/intlHash"; @@ -29,6 +28,7 @@ import definePlugin, { PluginNative, StartAt } from "@utils/types"; import * as Webpack from "@webpack"; import { extract, filters, findAll, findModuleId, search } from "@webpack"; import * as Common from "@webpack/common"; +import { loadLazyChunks } from "debug/loadLazyChunks"; import type { ComponentType } from "react"; const DESKTOP_ONLY = (f: string) => () => { @@ -245,7 +245,6 @@ export default definePlugin({ name: "ConsoleShortcuts", description: "Adds shorter Aliases for many things on the window. Run `shortcutList` for a list.", authors: [Devs.Ven], - tags: ["Developers", "Console", "Shortcuts", "Utility"], startAt: StartAt.Init, patches: [ diff --git a/src/plugins/copyEmojiMarkdown/index.tsx b/src/plugins/copyEmojiMarkdown/index.tsx index dfa46a350..e03197fec 100644 --- a/src/plugins/copyEmojiMarkdown/index.tsx +++ b/src/plugins/copyEmojiMarkdown/index.tsx @@ -51,7 +51,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CopyEmojiMarkdown", description: "Allows you to copy emojis as formatted string (<:blobcatcozy:1026533070955872337>)", - tags: ["Emotes", "Utility"], authors: [Devs.HappyEnderman, Devs.Vishnya], settings, diff --git a/src/plugins/copyFileContents/index.tsx b/src/plugins/copyFileContents/index.tsx index c74a5c544..be7ec07a2 100644 --- a/src/plugins/copyFileContents/index.tsx +++ b/src/plugins/copyFileContents/index.tsx @@ -22,7 +22,6 @@ const CheckMarkIcon = () => { export default definePlugin({ name: "CopyFileContents", description: "Adds a button to text file attachments to copy their contents", - tags: ["Utility"], authors: [Devs.Obsidian, Devs.Nuckyz], patches: [ { diff --git a/src/plugins/copyStickerLinks/index.tsx b/src/plugins/copyStickerLinks/index.tsx index bc8fe8e90..635b8d313 100644 --- a/src/plugins/copyStickerLinks/index.tsx +++ b/src/plugins/copyStickerLinks/index.tsx @@ -87,7 +87,6 @@ const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { t export default definePlugin({ name: "CopyStickerLinks", description: "Adds the ability to copy & open Sticker links", - tags: ["Emotes", "Utility"], authors: [Devs.Ven, Devs.Byeoon], contextMenus: { "message": messageContextMenuPatch, diff --git a/src/plugins/copyUserURLs/index.tsx b/src/plugins/copyUserURLs/index.tsx index 07ac0721d..744f7ccac 100644 --- a/src/plugins/copyUserURLs/index.tsx +++ b/src/plugins/copyUserURLs/index.tsx @@ -47,7 +47,6 @@ export default definePlugin({ name: "CopyUserURLs", authors: [Devs.castdrian], description: "Adds a 'Copy User URL' option to the user context menu.", - tags: ["Utility", "Friends"], contextMenus: { "user-context": UserContextMenuPatch } diff --git a/src/plugins/crashHandler/index.ts b/src/plugins/crashHandler/index.ts index 19db0ea11..37f1d878b 100644 --- a/src/plugins/crashHandler/index.ts +++ b/src/plugins/crashHandler/index.ts @@ -61,8 +61,8 @@ export default definePlugin({ name: "CrashHandler", description: "Utility plugin for handling and possibly recovering from crashes without a restart", authors: [Devs.Nuckyz], - tags: ["Utility", "Developers"], enabledByDefault: true, + settings, patches: [ diff --git a/src/plugins/ctrlEnterSend/index.ts b/src/plugins/ctrlEnterSend/index.ts index ba6eb3df6..7b0b26b9a 100644 --- a/src/plugins/ctrlEnterSend/index.ts +++ b/src/plugins/ctrlEnterSend/index.ts @@ -12,7 +12,6 @@ export default definePlugin({ name: "CtrlEnterSend", authors: [Devs.UlyssesZhan], description: "Use Ctrl+Enter to send messages (customizable)", - tags: ["Shortcuts", "Chat"], settings: definePluginSettings({ submitRule: { description: "The way to send a message", diff --git a/src/plugins/customCommands/index.ts b/src/plugins/customCommands/index.ts index bc77ab6f6..b89e4d958 100644 --- a/src/plugins/customCommands/index.ts +++ b/src/plugins/customCommands/index.ts @@ -90,10 +90,8 @@ migratePluginSettings("CustomCommands", "MessageTags"); export default definePlugin({ name: "CustomCommands", description: "Allows you to create custom slash commands / tags", - dependencies: ["CommandsAPI"], - searchTerms: ["MessageTags"], + tags: ["MessageTags"], authors: [Devs.Ven, Devs.Luna,], - tags: ["Commands", "Customisation", "Utility"], settings, async start() { diff --git a/src/plugins/customIdle/index.ts b/src/plugins/customIdle/index.ts index 3f3dca72f..60ebf6ba7 100644 --- a/src/plugins/customIdle/index.ts +++ b/src/plugins/customIdle/index.ts @@ -29,7 +29,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomIdle", description: "Allows you to set the time before Discord goes idle (or disable auto-idle)", - tags: ["Activity", "Customisation"], authors: [Devs.newwares], settings, patches: [ diff --git a/src/plugins/customRPC/index.tsx b/src/plugins/customRPC/index.tsx index bafff2c2e..44f18f6c1 100644 --- a/src/plugins/customRPC/index.tsx +++ b/src/plugins/customRPC/index.tsx @@ -215,7 +215,6 @@ export async function setRpc(disable?: boolean) { export default definePlugin({ name: "CustomRPC", description: "Add a fully customisable Rich Presence (Game status) to your Discord profile", - tags: ["Activity", "Customisation"], authors: [Devs.captain, Devs.AutumnVN, Devs.nin0dev], dependencies: ["UserSettingsAPI"], // This plugin's patch is not important for functionality, so don't require a restart diff --git a/src/plugins/dearrow/index.tsx b/src/plugins/dearrow/index.tsx index b9a367f8a..1247472d4 100644 --- a/src/plugins/dearrow/index.tsx +++ b/src/plugins/dearrow/index.tsx @@ -170,7 +170,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Dearrow", description: "Makes YouTube embed titles and thumbnails less sensationalist, powered by Dearrow", - tags: ["Media", "Utility"], authors: [Devs.Ven], settings, diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index cbc57d06d..f9a3cf452 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -27,7 +27,6 @@ export interface AvatarDecoration { export default definePlugin({ name: "Decor", description: "Create and use your own custom avatar decorations, or pick your favorite from the presets.", - tags: ["Appearance", "Customisation"], authors: [Devs.FieryFlames], patches: [ // Patch MediaResolver to return correct URL for Decor avatar decorations diff --git a/src/plugins/devCompanion.dev/index.tsx b/src/plugins/devCompanion.dev/index.tsx index da7b42ebd..43449840c 100644 --- a/src/plugins/devCompanion.dev/index.tsx +++ b/src/plugins/devCompanion.dev/index.tsx @@ -48,7 +48,6 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "DevCompanion", description: "Dev Companion Plugin. Please report anything not working or being weird (most likely its a bug) to sadan, either ping or dm, thanks!", - tags: ["Developers", "Utility"], authors: [Devs.Ven, Devs.sadan], reporterTestable: ReporterTestable.None, isModified: true, diff --git a/src/plugins/devCompanion.dev/initWs.tsx b/src/plugins/devCompanion.dev/initWs.tsx index 49e931808..89bee1d38 100644 --- a/src/plugins/devCompanion.dev/initWs.tsx +++ b/src/plugins/devCompanion.dev/initWs.tsx @@ -5,14 +5,14 @@ */ import { popNotice, showNotice } from "@api/Notices"; -import { Settings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; -import { loadLazyChunks } from "@debug/loadLazyChunks"; -import { reporterData } from "@debug/reporterData"; import { getIntlMessageFromHash } from "@utils/discord"; import { canonicalizeMatch, canonicalizeReplace } from "@utils/patches"; import { filters, findAll, search, wreq } from "@webpack"; import { React, Toasts, useState } from "@webpack/common"; +import { loadLazyChunks } from "debug/loadLazyChunks"; +import { reporterData } from "debug/reporterData"; +import { Settings } from "Vencord"; import { CLIENT_VERSION, logger, PORT, settings } from "."; import { Recieve } from "./types"; diff --git a/src/plugins/devCompanion.dev/types/send.ts b/src/plugins/devCompanion.dev/types/send.ts index e9439e631..86260a4e3 100644 --- a/src/plugins/devCompanion.dev/types/send.ts +++ b/src/plugins/devCompanion.dev/types/send.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { ReporterData } from "@debug/reporterData"; +import { ReporterData } from "debug/reporterData"; export type OutgoingMessage = Base; export type FullOutgoingMessage = OutgoingMessage & Nonce; diff --git a/src/plugins/devCompanion.dev/util.tsx b/src/plugins/devCompanion.dev/util.tsx index 7611b8081..4fda47040 100644 --- a/src/plugins/devCompanion.dev/util.tsx +++ b/src/plugins/devCompanion.dev/util.tsx @@ -10,8 +10,8 @@ import { Settings } from "@api/Settings"; import { canonicalizeMatch } from "@utils/patches"; import { CodeFilter, stringMatches, wreq } from "@webpack"; import { Toasts } from "@webpack/common"; +import { WebpackPatcher } from "Vencord"; -import { WebpackPatcher } from "../../Vencord"; import { logger, settings as companionSettings } from "."; import { FindNode } from "./types/recieve"; diff --git a/src/plugins/disableCallIdle/index.ts b/src/plugins/disableCallIdle/index.ts index 523580e76..216f1218c 100644 --- a/src/plugins/disableCallIdle/index.ts +++ b/src/plugins/disableCallIdle/index.ts @@ -22,7 +22,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableCallIdle", description: "Disables automatically getting kicked from a DM voice call after 3 minutes and being moved to an AFK voice channel.", - tags: ["Voice", "Utility"], authors: [Devs.Nuckyz], patches: [ { diff --git a/src/plugins/dontRoundMyTimestamps/index.ts b/src/plugins/dontRoundMyTimestamps/index.ts index 7d8cb9b14..4c432c73f 100644 --- a/src/plugins/dontRoundMyTimestamps/index.ts +++ b/src/plugins/dontRoundMyTimestamps/index.ts @@ -24,7 +24,6 @@ export default definePlugin({ name: "DontRoundMyTimestamps", authors: [Devs.Lexi], description: "Always rounds relative timestamps down, so 7.6y becomes 7y instead of 8y", - tags: ["Appearance", "Utility"], start() { moment.relativeTimeRounding(Math.floor); diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index 5382dc250..9c1802577 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -37,7 +37,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Experiments", description: "Enable Access to Experiments & other dev-only features in Discord!", - tags: ["Developers", "Utility"], authors: [ Devs.Megu, Devs.Ven, @@ -71,8 +70,6 @@ export default definePlugin({ match: /(?<=children:\[)(?=null!=.{0,150}"Installation ID:)/, replace: "$self.WarningCard()," }, - // for some reason the installation id and copy buttons are on - // different lines so it looks stupid when the card above is added { match: /(?<=,marginBottom:16)(?=\},children:\[)/, replace: ',flexDirection:"row",alignItems:"center"' diff --git a/src/plugins/expressionCloner/index.tsx b/src/plugins/expressionCloner/index.tsx index 3e80f75b0..3a79a05ef 100644 --- a/src/plugins/expressionCloner/index.tsx +++ b/src/plugins/expressionCloner/index.tsx @@ -232,7 +232,7 @@ function CloneModal({ data }: { data: Sticker | Emoji; }) { <> Custom Name { data.name = v; setName(v); @@ -411,8 +411,7 @@ migratePluginSettings("ExpressionCloner", "EmoteCloner"); export default definePlugin({ name: "ExpressionCloner", description: "Allows you to clone Emotes & Stickers to your own server (right click them)", - tags: ["Emotes", "Servers"], - searchTerms: ["StickerCloner", "EmoteCloner", "EmojiCloner"], + tags: ["StickerCloner", "EmoteCloner", "EmojiCloner"], authors: [Devs.Ven, Devs.Nuckyz], contextMenus: { "message": messageContextMenuPatch, diff --git a/src/plugins/f8break/index.ts b/src/plugins/f8break/index.ts index 5b1b118ce..89dd2c92f 100644 --- a/src/plugins/f8break/index.ts +++ b/src/plugins/f8break/index.ts @@ -22,7 +22,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "F8Break", description: "Pause the client when you press F8 with DevTools (+ breakpoints) open.", - tags: ["Developers", "Shortcuts"], authors: [Devs.lewisakura], start() { diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx index dfd345191..10559321d 100644 --- a/src/plugins/fakeNitro/index.tsx +++ b/src/plugins/fakeNitro/index.tsx @@ -180,7 +180,6 @@ export default definePlugin({ name: "FakeNitro", authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven, Devs.fawn, Devs.captain, Devs.Nuckyz, Devs.AutumnVN, Devs.sadan], description: "Allows you to send fake emojis/stickers, use nitro themes, and stream in nitro quality", - tags: ["Emotes", "Appearance", "Customisation", "Chat"], dependencies: ["MessageEventsAPI"], settings, diff --git a/src/plugins/fakeProfileThemes/index.tsx b/src/plugins/fakeProfileThemes/index.tsx index ec550f850..589862c4d 100644 --- a/src/plugins/fakeProfileThemes/index.tsx +++ b/src/plugins/fakeProfileThemes/index.tsx @@ -200,7 +200,6 @@ function SettingsAboutComponent() { export default definePlugin({ name: "FakeProfileThemes", description: "Allows profile theming by hiding the colors in your bio thanks to invisible 3y3 encoding", - tags: ["Appearance", "Customisation"], authors: [Devs.Alyxia, Devs.Remty], patches: [ { diff --git a/src/plugins/favEmojiFirst/index.tsx b/src/plugins/favEmojiFirst/index.tsx index 4c6261d78..f369023c5 100644 --- a/src/plugins/favEmojiFirst/index.tsx +++ b/src/plugins/favEmojiFirst/index.tsx @@ -1101,9 +1101,8 @@ const messageSendListener = (_channelId: string, messageObj: { content: string; export default definePlugin({ name: "FavoriteEmojiFirst", authors: [Devs.Aria, Devs.Ven, EquicordDevs.justjxke], - tags: ["Emotes", "Customisation"], + tags: ["EmojiAlias"], description: "Puts your favorite emoji first in the emoji autocomplete and also has emoji alias.", - dependencies: ["MessagePopoverAPI"], settings, contextMenus: { "expression-picker": expressionPickerPatch, diff --git a/src/plugins/favGifSearch/index.tsx b/src/plugins/favGifSearch/index.tsx index 57926ef24..8c720f1fb 100644 --- a/src/plugins/favGifSearch/index.tsx +++ b/src/plugins/favGifSearch/index.tsx @@ -84,7 +84,6 @@ export default definePlugin({ name: "FavoriteGifSearch", authors: [Devs.Aria], description: "Adds a search bar to favorite gifs.", - tags: ["Media", "Customisation"], patches: [ { diff --git a/src/plugins/fixCodeblockGap/index.ts b/src/plugins/fixCodeblockGap/index.ts index e9a7cca28..d65d83dc7 100644 --- a/src/plugins/fixCodeblockGap/index.ts +++ b/src/plugins/fixCodeblockGap/index.ts @@ -10,7 +10,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "FixCodeblockGap", description: "Removes the gap between codeblocks and text below it", - tags: ["Appearance"], authors: [Devs.Grzesiek11], patches: [ { diff --git a/src/plugins/fixImagesQuality/index.tsx b/src/plugins/fixImagesQuality/index.tsx index 7b5bb9742..5215b68e9 100644 --- a/src/plugins/fixImagesQuality/index.tsx +++ b/src/plugins/fixImagesQuality/index.tsx @@ -24,7 +24,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FixImagesQuality", description: "Improves quality of images by loading them at their original resolution", - tags: ["Media", "Appearance"], authors: [Devs.Nuckyz, Devs.Ven], settings, diff --git a/src/plugins/fixSpotifyEmbeds.desktop/index.tsx b/src/plugins/fixSpotifyEmbeds.desktop/index.tsx index 4ca6f5fe3..c5b42742a 100644 --- a/src/plugins/fixSpotifyEmbeds.desktop/index.tsx +++ b/src/plugins/fixSpotifyEmbeds.desktop/index.tsx @@ -23,6 +23,5 @@ export default definePlugin({ name: "FixSpotifyEmbeds", description: "Fixes spotify embeds being incredibly loud by letting you customise the volume", authors: [Devs.Ven], - tags: ["Media", "Customisation"], settings, }); diff --git a/src/plugins/fixYoutubeEmbeds.desktop/index.tsx b/src/plugins/fixYoutubeEmbeds.desktop/index.tsx index d76bd666e..6ea46fd7f 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/index.tsx +++ b/src/plugins/fixYoutubeEmbeds.desktop/index.tsx @@ -27,7 +27,6 @@ migratePluginSettings("FixYoutubeEmbeds", "YoutubeDescription"); export default definePlugin({ name: "FixYoutubeEmbeds", description: "Bypasses youtube videos being blocked from display on Discord (for example by UMG)", - tags: ["Media", "Utility"], authors: [Devs.coolelectronics, Devs.arHSM], settings, patches: [ diff --git a/src/plugins/fixYoutubeEmbeds.desktop/native.ts b/src/plugins/fixYoutubeEmbeds.desktop/native.ts index 950940b06..f865a6566 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/native.ts +++ b/src/plugins/fixYoutubeEmbeds.desktop/native.ts @@ -4,8 +4,8 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { RendererSettings } from "@main/settings"; import { app } from "electron"; +import { RendererSettings } from "main/settings"; app.on("browser-window-created", (_, win) => { win.webContents.on("frame-created", (_, { frame }) => { diff --git a/src/plugins/forceOwnerCrown/index.ts b/src/plugins/forceOwnerCrown/index.ts index 17997568a..f7e4b4701 100644 --- a/src/plugins/forceOwnerCrown/index.ts +++ b/src/plugins/forceOwnerCrown/index.ts @@ -25,7 +25,6 @@ export default definePlugin({ name: "ForceOwnerCrown", description: "Force the owner crown next to usernames even if the server is large.", authors: [Devs.D3SOX, Devs.Nickyux], - tags: ["Roles", "Appearance", "Servers"], patches: [ { find: "#{intl::GUILD_OWNER}),children:", diff --git a/src/plugins/friendInvites/index.ts b/src/plugins/friendInvites/index.ts index 7cd486a7a..0af611bc9 100644 --- a/src/plugins/friendInvites/index.ts +++ b/src/plugins/friendInvites/index.ts @@ -26,8 +26,6 @@ const FriendInvites = findByPropsLazy("createFriendInvite"); export default definePlugin({ name: "FriendInvites", description: "Create and manage friend invite links via slash commands (/create friend invite, /view friend invites, /revoke friend invites).", - dependencies: ["CommandsAPI"], - tags: ["Friends", "Commands"], authors: [Devs.afn, Devs.Dziurwa], commands: [ { diff --git a/src/plugins/friendsSince/index.tsx b/src/plugins/friendsSince/index.tsx index cc0396c4f..006ea2fce 100644 --- a/src/plugins/friendsSince/index.tsx +++ b/src/plugins/friendsSince/index.tsx @@ -23,7 +23,6 @@ const Section = findComponentByCodeLazy("headingVariant:", '"section"', "heading export default definePlugin({ name: "FriendsSince", description: "Shows when you became friends with someone in the user popout", - tags: ["Friends"], authors: [Devs.Elvyra, Devs.Antti], patches: [ // DM User Sidebar diff --git a/src/plugins/fullSearchContext/index.tsx b/src/plugins/fullSearchContext/index.tsx index 672552d9f..2f20cd53b 100644 --- a/src/plugins/fullSearchContext/index.tsx +++ b/src/plugins/fullSearchContext/index.tsx @@ -81,7 +81,6 @@ migratePluginSettings("FullSearchContext", "SearchReply"); export default definePlugin({ name: "FullSearchContext", description: "Makes the message context menu in message search results have all options you'd expect", - tags: ["Utility"], authors: [Devs.Ven, Devs.Aria], patches: [{ diff --git a/src/plugins/fullUserInChatbox/index.tsx b/src/plugins/fullUserInChatbox/index.tsx index dfed0036e..9ac4f811d 100644 --- a/src/plugins/fullUserInChatbox/index.tsx +++ b/src/plugins/fullUserInChatbox/index.tsx @@ -23,7 +23,6 @@ interface UserMentionComponentProps { export default definePlugin({ name: "FullUserInChatbox", description: "Makes the user mention in the chatbox have more functionalities, like left/right clicking", - tags: ["Shortcuts", "Utility"], authors: [Devs.sadan], patches: [ diff --git a/src/plugins/gameActivityToggle/index.tsx b/src/plugins/gameActivityToggle/index.tsx index c0ad504ae..40667fb40 100644 --- a/src/plugins/gameActivityToggle/index.tsx +++ b/src/plugins/gameActivityToggle/index.tsx @@ -98,9 +98,8 @@ function GameActivityToggleButton({ iconForeground, hideTooltips, nameplate }: U export default definePlugin({ name: "GameActivityToggle", description: "Adds a button next to the mic and deafen button to toggle game activity.", - tags: ["Activity", "Shortcuts"], authors: [Devs.Nuckyz, Devs.RuukuLada], - dependencies: ["UserSettingsAPI", "UserAreaAPI"], + dependencies: ["UserSettingsAPI"], settings, userAreaButton: { diff --git a/src/plugins/gifPaste/index.ts b/src/plugins/gifPaste/index.ts index 24804a5b8..65ea464c4 100644 --- a/src/plugins/gifPaste/index.ts +++ b/src/plugins/gifPaste/index.ts @@ -26,7 +26,6 @@ import { ExpressionPickerStore } from "@webpack/common"; export default definePlugin({ name: "GifPaste", description: "Makes picking a gif in the gif picker insert a link into the chatbox instead of instantly sending it", - tags: ["Media", "Chat"], authors: [Devs.Ven], patches: [{ diff --git a/src/plugins/greetStickerPicker/index.tsx b/src/plugins/greetStickerPicker/index.tsx index 7b61f349e..0604c54d8 100644 --- a/src/plugins/greetStickerPicker/index.tsx +++ b/src/plugins/greetStickerPicker/index.tsx @@ -152,7 +152,6 @@ function GreetMenu({ channel, message }: { message: Message, channel: Channel; } export default definePlugin({ name: "GreetStickerPicker", description: "Allows you to use any greet sticker instead of only the random one by right-clicking the 'Wave to say hi!' button", - tags: ["Emotes", "Customisation"], authors: [Devs.Ven], settings, diff --git a/src/plugins/hideAttachments/index.tsx b/src/plugins/hideAttachments/index.tsx index b47e053ac..16579d0a7 100644 --- a/src/plugins/hideAttachments/index.tsx +++ b/src/plugins/hideAttachments/index.tsx @@ -56,9 +56,8 @@ async function toggleHide(channelId: string, messageId: string) { export default definePlugin({ name: "HideMedia", description: "Hide attachments and embeds for individual messages via hover button", - tags: ["Chat", "Appearance"], authors: [Devs.Ven], - dependencies: ["MessageUpdaterAPI", "MessageAccessoriesAPI", "MessagePopoverAPI"], + dependencies: ["MessageUpdaterAPI"], patches: [{ find: "this.renderAttachments(", diff --git a/src/plugins/iLoveSpam/index.ts b/src/plugins/iLoveSpam/index.ts index b1bb5b6bc..2e574cb46 100644 --- a/src/plugins/iLoveSpam/index.ts +++ b/src/plugins/iLoveSpam/index.ts @@ -24,7 +24,6 @@ migratePluginSettings("IloveSpam", "iLoveSpam"); export default definePlugin({ name: "ILoveSpam", description: "Do not hide messages from 'likely spammers'", - tags: ["Utility", "Chat"], authors: [Devs.botato, Devs.Nyako], patches: [ { diff --git a/src/plugins/ignoreActivities/index.tsx b/src/plugins/ignoreActivities/index.tsx index dfc57bdf4..8eb334cbf 100644 --- a/src/plugins/ignoreActivities/index.tsx +++ b/src/plugins/ignoreActivities/index.tsx @@ -232,7 +232,6 @@ export default definePlugin({ name: "IgnoreActivities", authors: [Devs.Nuckyz, Devs.Kylie], description: "Ignore activities from showing up on your status ONLY. You can configure which ones are specifically ignored from the Registered Games and Activities tabs, or use the general settings below", - tags: ["Activity", "Privacy", "Customisation"], dependencies: ["UserSettingsAPI"], settings, diff --git a/src/plugins/imageFilename/index.ts b/src/plugins/imageFilename/index.ts index d421fb43a..77717e5b5 100644 --- a/src/plugins/imageFilename/index.ts +++ b/src/plugins/imageFilename/index.ts @@ -23,7 +23,6 @@ export default definePlugin({ name: "ImageFilename", authors: [Devs.Ven], description: "Display the file name of images & GIFs as a tooltip when hovering over them", - tags: ["Media", "Utility"], settings, patches: [ diff --git a/src/plugins/imageLink/index.ts b/src/plugins/imageLink/index.ts index 0d01cb1d3..08d3a0247 100644 --- a/src/plugins/imageLink/index.ts +++ b/src/plugins/imageLink/index.ts @@ -10,7 +10,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ImageLink", description: "Never hide image links in messages, even if it's the only content", - tags: ["Media", "Appearance"], authors: [Devs.Kyuuhachi, Devs.Sqaaakoi], patches: [ diff --git a/src/plugins/imageZoom/index.tsx b/src/plugins/imageZoom/index.tsx index 38ed37ff2..bbd9b82a6 100644 --- a/src/plugins/imageZoom/index.tsx +++ b/src/plugins/imageZoom/index.tsx @@ -155,9 +155,8 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => export default definePlugin({ name: "ImageZoom", description: "Lets you zoom in to images and gifs. Use scroll wheel to zoom in and shift + scroll wheel to increase lens radius / size", - tags: ["Media", "Utility"], authors: [Devs.Aria], - searchTerms: ["ImageUtilities"], + tags: ["ImageUtilities"], managedStyle, diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts index 8600894f2..e5a547dbc 100644 --- a/src/plugins/implicitRelationships/index.ts +++ b/src/plugins/implicitRelationships/index.ts @@ -21,25 +21,12 @@ import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; import { Constants, FluxDispatcher, GuildStore, RelationshipStore, SnowflakeUtils, UserAffinitiesStore, UserStore } from "@webpack/common"; - -const settings = definePluginSettings( - { - sortByAffinity: { - type: OptionType.BOOLEAN, - default: true, - description: "Whether to sort implicit relationships by their affinity to you.", - restartNeeded: true - }, - } -); +import { Settings } from "Vencord"; export default definePlugin({ name: "ImplicitRelationships", description: "Shows your implicit relationships in the Friends tab.", - tags: ["Friends", "Servers"], authors: [Devs.Dolfies], - settings, - patches: [ // Counts header { @@ -86,7 +73,7 @@ export default definePlugin({ { find: "getRelationshipCounts(){", replacement: { - predicate: () => settings.store.sortByAffinity, + predicate: () => Settings.plugins.ImplicitRelationships.sortByAffinity, match: /\}\)\.sortBy\((.+?)\)\.value\(\)/, replace: "}).sortBy(row => $self.wrapSort(($1), row)).value()" } @@ -115,6 +102,16 @@ export default definePlugin({ }, } ], + settings: definePluginSettings( + { + sortByAffinity: { + type: OptionType.BOOLEAN, + default: true, + description: "Whether to sort implicit relationships by their affinity to you.", + restartNeeded: true + }, + } + ), wrapSort(comparator: Function, row: any) { return row.type === 5 diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts index cd405ecfd..c1d41fbfe 100644 --- a/src/plugins/ircColors/index.ts +++ b/src/plugins/ircColors/index.ts @@ -60,7 +60,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "IrcColors", description: "Makes username colors in chat unique, like in IRC clients", - tags: ["Appearance", "Customisation"], authors: [Devs.Grzesiek11, Devs.jamesbt365], settings, diff --git a/src/plugins/keepCurrentChannel/index.ts b/src/plugins/keepCurrentChannel/index.ts index 61c585aaa..92a389eb4 100644 --- a/src/plugins/keepCurrentChannel/index.ts +++ b/src/plugins/keepCurrentChannel/index.ts @@ -43,7 +43,6 @@ let previousCache: PreviousChannel | undefined; export default definePlugin({ name: "KeepCurrentChannel", description: "Attempt to navigate to the channel you were in before switching accounts or loading Discord.", - tags: ["Utility", "Organisation"], authors: [Devs.Nuckyz], patches: [ diff --git a/src/plugins/lastfmRichPresence/index.tsx b/src/plugins/lastfmRichPresence/index.tsx index fdb7b8528..98acdc2e3 100644 --- a/src/plugins/lastfmRichPresence/index.tsx +++ b/src/plugins/lastfmRichPresence/index.tsx @@ -186,7 +186,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LastFMRichPresence", description: "Little plugin for Last.fm rich presence", - tags: ["Activity", "Media"], authors: [Devs.dzshn, Devs.RuiNtD, Devs.blahajZip, Devs.archeruwu], settings, diff --git a/src/plugins/loadingQuotes/index.ts b/src/plugins/loadingQuotes/index.ts index fa0dd55fd..8c63fe5a2 100644 --- a/src/plugins/loadingQuotes/index.ts +++ b/src/plugins/loadingQuotes/index.ts @@ -57,7 +57,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LoadingQuotes", description: "Replace Discords loading quotes", - tags: ["Appearance", "Fun", "Customisation"], authors: [Devs.Ven, Devs.KraXen72, Devs.UlyssesZhan], settings, diff --git a/src/plugins/memberCount/index.tsx b/src/plugins/memberCount/index.tsx index 7f94cece4..83c4f85ef 100644 --- a/src/plugins/memberCount/index.tsx +++ b/src/plugins/memberCount/index.tsx @@ -62,7 +62,6 @@ export const cl = classNameFactory("vc-membercount-"); export default definePlugin({ name: "MemberCount", description: "Shows the number of online members, total members, and users in voice channels on the server — in the member list and tooltip.", - tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Commandtechno, Devs.Apexo], settings, diff --git a/src/plugins/mentionAvatars/index.tsx b/src/plugins/mentionAvatars/index.tsx index 44b4ec12d..b87995c8b 100644 --- a/src/plugins/mentionAvatars/index.tsx +++ b/src/plugins/mentionAvatars/index.tsx @@ -48,7 +48,6 @@ function DefaultRoleIcon() { export default definePlugin({ name: "MentionAvatars", description: "Shows user avatars and role icons inside mentions", - tags: ["Appearance", "Customisation"], authors: [Devs.Ven, Devs.SerStars], patches: [{ // HEY THOR UPDATE SHOW ME YOUR NAME IF THIS SHIT CHANGES TY :) diff --git a/src/plugins/messageClickActions/index.ts b/src/plugins/messageClickActions/index.ts index b070db16e..42fd83fef 100644 --- a/src/plugins/messageClickActions/index.ts +++ b/src/plugins/messageClickActions/index.ts @@ -577,7 +577,6 @@ async function executeAction( export default definePlugin({ name: "MessageClickActions", description: "Customize click actions on messages.", - tags: ["Chat", "Shortcuts"], authors: [Devs.Ven, EquicordDevs.keircn, EquicordDevs.ZcraftElite, EquicordDevs.omaw], isModified: true, diff --git a/src/plugins/messageLatency/index.tsx b/src/plugins/messageLatency/index.tsx index 0aac594de..6f66fb036 100644 --- a/src/plugins/messageLatency/index.tsx +++ b/src/plugins/messageLatency/index.tsx @@ -29,7 +29,6 @@ const DISCORD_KT_DELAY = 1471228928; export default definePlugin({ name: "MessageLatency", description: "Displays an indicator for messages that took ≥n seconds to send", - tags: ["Chat", "Utility"], authors: [Devs.arHSM], settings: definePluginSettings({ diff --git a/src/plugins/messageLinkEmbeds/index.tsx b/src/plugins/messageLinkEmbeds/index.tsx index 723e18d79..08d02cb82 100644 --- a/src/plugins/messageLinkEmbeds/index.tsx +++ b/src/plugins/messageLinkEmbeds/index.tsx @@ -364,7 +364,6 @@ function AutomodEmbedAccessory(props: MessageEmbedProps): JSX.Element | null { export default definePlugin({ name: "MessageLinkEmbeds", description: "Adds a preview to messages that link another message", - tags: ["Chat", "Appearance"], authors: [Devs.TheSun, Devs.Ven, Devs.RyanCaoDev], dependencies: ["MessageAccessoriesAPI", "MessageUpdaterAPI", "UserSettingsAPI"], diff --git a/src/plugins/messageLogger/index.tsx b/src/plugins/messageLogger/index.tsx index b54e70226..534f988bc 100644 --- a/src/plugins/messageLogger/index.tsx +++ b/src/plugins/messageLogger/index.tsx @@ -417,7 +417,6 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "MessageLogger", description: "Temporarily logs deleted and edited messages.", - tags: ["Chat", "Utility"], authors: [Devs.rushii, Devs.Ven, Devs.AutumnVN, Devs.Nickyux, Devs.Kyuuhachi, EquicordDevs.justjxke], dependencies: ["MessageUpdaterAPI"], isModified: true, diff --git a/src/plugins/moreQuickReactions/index.ts b/src/plugins/moreQuickReactions/index.ts index 811b15c1b..25e7ff4f7 100644 --- a/src/plugins/moreQuickReactions/index.ts +++ b/src/plugins/moreQuickReactions/index.ts @@ -52,7 +52,6 @@ migratePluginSettings("MoreQuickReactions", "BetterQuickReact"); export default definePlugin({ name: "MoreQuickReactions", description: "Improves the quick react buttons in the message context menu.", - tags: ["Emotes", "Reactions", "Customisation", "Shortcuts"], authors: [Devs.Ven, Devs.Sqaaakoi, Devs.iamme], isModified: true, settings, diff --git a/src/plugins/mutualGroupDMs/index.tsx b/src/plugins/mutualGroupDMs/index.tsx index 2d0a52ce0..08cb1bf41 100644 --- a/src/plugins/mutualGroupDMs/index.tsx +++ b/src/plugins/mutualGroupDMs/index.tsx @@ -35,7 +35,7 @@ const UserUtils = findByPropsLazy("getGlobalName"); const ProfileListClasses = findCssClassesLazy("empty", "textContainer", "connectionIcon"); const TabBarClasses = findCssClassesLazy("tabPanelScroller", "tabBarPanel"); const MutualsListClasses = findCssClassesLazy("row", "icon", "name", "details"); -const ExpandableList = findComponentByCodeLazy('action:"PRESS_SECTION"', '"section"'); +const ExpandableList = findComponentByCodeLazy('action:"PRESS_SECTION"', "section"); function getGroupDMName(channel: Channel) { return channel.name || @@ -86,7 +86,6 @@ const IS_PATCHED = Symbol("MutualGroupDMs.Patched"); export default definePlugin({ name: "MutualGroupDMs", description: "Shows mutual group dms in profiles", - tags: ["Friends", "Appearance"], authors: [Devs.amia], patches: [ diff --git a/src/plugins/newGuildSettings/index.tsx b/src/plugins/newGuildSettings/index.tsx index cbbba3d18..dd7f05a91 100644 --- a/src/plugins/newGuildSettings/index.tsx +++ b/src/plugins/newGuildSettings/index.tsx @@ -151,8 +151,7 @@ function applyDefaultSettings(guildId: string | null) { export default definePlugin({ name: "NewGuildSettings", description: "Automatically mute new servers and change various other settings upon joining", - tags: ["Servers", "Customisation"], - searchTerms: ["MuteNewGuild", "mute", "server"], + tags: ["MuteNewGuild", "mute", "server"], authors: [Devs.Glitch, Devs.Nuckyz, Devs.carince, Devs.Mopi, Devs.GabiRP], isModified: true, contextMenus: { diff --git a/src/plugins/noBlockedMessages/index.ts b/src/plugins/noBlockedMessages/index.ts index 4b6b312e4..3c50240fa 100644 --- a/src/plugins/noBlockedMessages/index.ts +++ b/src/plugins/noBlockedMessages/index.ts @@ -90,7 +90,6 @@ export default definePlugin({ name: "NoBlockedMessages", description: "Hide all blocked/ignored messages from chat completely.", authors: [Devs.rushii, Devs.Samu, Devs.jamesbt365, Devs.Elvyra, EquicordDevs.Etorix], - tags: ["Accessibility", "Chat"], isModified: true, settings, patches: [ diff --git a/src/plugins/noDeepLinks.web/index.ts b/src/plugins/noDeepLinks.web/index.ts index b1770a3a0..019df659a 100644 --- a/src/plugins/noDeepLinks.web/index.ts +++ b/src/plugins/noDeepLinks.web/index.ts @@ -10,7 +10,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableDeepLinks", description: "Disables Discord's stupid deep linking feature which tries to force you to use their Desktop App", - tags: ["Utility"], authors: [Devs.Ven], required: true, diff --git a/src/plugins/noDevtoolsWarning/index.ts b/src/plugins/noDevtoolsWarning/index.ts index d5dcad53c..5c35fa67b 100644 --- a/src/plugins/noDevtoolsWarning/index.ts +++ b/src/plugins/noDevtoolsWarning/index.ts @@ -23,7 +23,6 @@ export default definePlugin({ name: "NoDevtoolsWarning", description: "Disables the 'HOLD UP' banner in the console. As a side effect, also prevents Discord from hiding your token, which prevents random logouts.", authors: [Devs.Ven], - tags: ["Developers", "Console"], patches: [{ find: "setDevtoolsCallbacks", replacement: { diff --git a/src/plugins/noF1/index.ts b/src/plugins/noF1/index.ts index 36e088e46..a40be5acc 100644 --- a/src/plugins/noF1/index.ts +++ b/src/plugins/noF1/index.ts @@ -22,7 +22,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoF1", description: "Disables F1 help bind.", - tags: ["Utility"], authors: [Devs.Cyn], patches: [ { diff --git a/src/plugins/noMaskedUrlPaste/index.ts b/src/plugins/noMaskedUrlPaste/index.ts index fc10f8970..64f522cae 100644 --- a/src/plugins/noMaskedUrlPaste/index.ts +++ b/src/plugins/noMaskedUrlPaste/index.ts @@ -11,7 +11,6 @@ export default definePlugin({ name: "NoMaskedUrlPaste", authors: [Devs.CatNoir], description: "Pasting a link while having text selected will not paste as masked URL", - tags: ["Chat", "Utility"], patches: [ { find: ".selection,preventEmojiSurrogates:", diff --git a/src/plugins/noMosaic/index.ts b/src/plugins/noMosaic/index.ts index b360e1ea1..c52e19a6b 100644 --- a/src/plugins/noMosaic/index.ts +++ b/src/plugins/noMosaic/index.ts @@ -21,8 +21,7 @@ export default definePlugin({ name: "NoMosaic", authors: [Devs.AutumnVN], description: "Removes Discord image mosaic", - tags: ["Media", "Appearance", "Chat"], - searchTerms: ["image", "mosaic", "media"], + tags: ["image", "mosaic", "media"], settings, diff --git a/src/plugins/noOnboardingDelay/index.ts b/src/plugins/noOnboardingDelay/index.ts index b5f963463..285109761 100644 --- a/src/plugins/noOnboardingDelay/index.ts +++ b/src/plugins/noOnboardingDelay/index.ts @@ -22,7 +22,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoOnboardingDelay", description: "Skips the slow and annoying onboarding delay", - tags: ["Utility", "Servers"], authors: [Devs.nekohaxx], patches: [ { diff --git a/src/plugins/noPendingCount/index.ts b/src/plugins/noPendingCount/index.ts index 5bede8b49..b1a7ffad8 100644 --- a/src/plugins/noPendingCount/index.ts +++ b/src/plugins/noPendingCount/index.ts @@ -47,7 +47,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NoPendingCount", description: "Removes the ping count of incoming friend requests, message requests, and nitro offers.", - tags: ["Notifications", "Appearance"], authors: [Devs.amia], settings: settings, diff --git a/src/plugins/noProfileThemes/index.ts b/src/plugins/noProfileThemes/index.ts index a4fe648d0..7c440df80 100644 --- a/src/plugins/noProfileThemes/index.ts +++ b/src/plugins/noProfileThemes/index.ts @@ -23,7 +23,6 @@ import { UserStore } from "@webpack/common"; export default definePlugin({ name: "NoProfileThemes", description: "Completely removes Nitro profile themes from everyone but yourself", - tags: ["Appearance"], authors: [Devs.TheKodeToad], patches: [ { diff --git a/src/plugins/noReplyMention/index.tsx b/src/plugins/noReplyMention/index.tsx index 2e2bb9c6b..a08a04b8b 100644 --- a/src/plugins/noReplyMention/index.tsx +++ b/src/plugins/noReplyMention/index.tsx @@ -62,7 +62,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NoReplyMention", description: "Disables reply pings by default", - tags: ["Chat", "Notifications"], authors: [Devs.DustyAngel47, Devs.rae, Devs.pylix, Devs.outfoxxed], settings, diff --git a/src/plugins/noServerEmojis/index.ts b/src/plugins/noServerEmojis/index.ts index fd764dbf3..6550dabb8 100644 --- a/src/plugins/noServerEmojis/index.ts +++ b/src/plugins/noServerEmojis/index.ts @@ -26,7 +26,6 @@ export default definePlugin({ name: "NoServerEmojis", authors: [Devs.UlyssesZhan], description: "Do not show server emojis in the autocomplete menu.", - tags: ["Emotes", "Servers"], settings, patches: [ diff --git a/src/plugins/noSystemBadge.discordDesktop/index.ts b/src/plugins/noSystemBadge.discordDesktop/index.ts index c01c0b87a..0fbb5332a 100644 --- a/src/plugins/noSystemBadge.discordDesktop/index.ts +++ b/src/plugins/noSystemBadge.discordDesktop/index.ts @@ -22,7 +22,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoSystemBadge", description: "Disables the taskbar and system tray unread count badge.", - tags: ["Notifications", "Appearance"], authors: [Devs.rushii], patches: [ { diff --git a/src/plugins/noTypingAnimation/index.ts b/src/plugins/noTypingAnimation/index.ts index 6eca410fa..74bcdd50e 100644 --- a/src/plugins/noTypingAnimation/index.ts +++ b/src/plugins/noTypingAnimation/index.ts @@ -11,7 +11,6 @@ export default definePlugin({ name: "NoTypingAnimation", authors: [Devs.AutumnVN], description: "Disables the CPU-intensive typing dots animation", - tags: ["Appearance"], patches: [ { find: "dotCycle", diff --git a/src/plugins/noUnblockToJump/index.ts b/src/plugins/noUnblockToJump/index.ts index 6c1f504b6..5d876fc7b 100644 --- a/src/plugins/noUnblockToJump/index.ts +++ b/src/plugins/noUnblockToJump/index.ts @@ -22,7 +22,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoUnblockToJump", description: "Allows you to jump to messages of blocked or ignored users and likely spammers without unblocking them", - tags: ["Utility"], authors: [Devs.dzshn], patches: [ { diff --git a/src/plugins/notificationVolume/index.ts b/src/plugins/notificationVolume/index.ts index 5959c0dd1..d320d76f1 100644 --- a/src/plugins/notificationVolume/index.ts +++ b/src/plugins/notificationVolume/index.ts @@ -21,7 +21,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NotificationVolume", description: "Save your ears and set a separate volume for notifications and in-app sounds", - tags: ["Notifications", "Voice"], authors: [Devs.philipbry], settings, patches: [ diff --git a/src/plugins/onePingPerDM/index.ts b/src/plugins/onePingPerDM/index.ts index 87727fa32..05dba7e80 100644 --- a/src/plugins/onePingPerDM/index.ts +++ b/src/plugins/onePingPerDM/index.ts @@ -47,8 +47,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "OnePingPerDM", - description: "If unread messages are sent by a user in DMs multiple times, you'll only receive one audio ping. Read the messages to reset the limit", - tags: ["Notifications", "Customisation"], + description: "If unread messages are sent by a user in DMs multiple times, you'll only receive one audio ping.", authors: [Devs.ProffDea], isModified: true, settings, diff --git a/src/plugins/openInApp/index.ts b/src/plugins/openInApp/index.ts index 60012f735..05e5b1c29 100644 --- a/src/plugins/openInApp/index.ts +++ b/src/plugins/openInApp/index.ts @@ -84,7 +84,6 @@ const Native = VencordNative.pluginHelpers.OpenInApp as PluginNative | undefined; export default definePlugin({ name: "ReactErrorDecoder", - description: 'Replaces "Minified React Error" with the actual error.', - tags: ["Developers"], + description: 'Replaces "Minifed React Error" with the actual error.', authors: [Devs.Cyn, Devs.maisymoe], patches: [ { diff --git a/src/plugins/readAllNotificationsButton/index.tsx b/src/plugins/readAllNotificationsButton/index.tsx index 65c113a21..3a06c385b 100644 --- a/src/plugins/readAllNotificationsButton/index.tsx +++ b/src/plugins/readAllNotificationsButton/index.tsx @@ -66,7 +66,6 @@ const ReadAllButton = () => ( export default definePlugin({ name: "ReadAllNotificationsButton", description: "Read all server notifications with a single button click!", - tags: ["Notifications", "Shortcuts"], authors: [Devs.kemo, EquicordDevs.KrystalSkull], dependencies: ["ServerListAPI"], diff --git a/src/plugins/relationshipNotifier/index.ts b/src/plugins/relationshipNotifier/index.ts index ddb432e43..d913dde48 100644 --- a/src/plugins/relationshipNotifier/index.ts +++ b/src/plugins/relationshipNotifier/index.ts @@ -26,7 +26,6 @@ import { syncAndRunChecks, syncFriends, syncGroups, syncGuilds } from "./utils"; export default definePlugin({ name: "RelationshipNotifier", description: "Notifies you when a friend, group chat, or server removes you.", - tags: ["Friends", "Notifications"], authors: [Devs.nick], settings, diff --git a/src/plugins/replaceGoogleSearch/index.tsx b/src/plugins/replaceGoogleSearch/index.tsx index 434923251..e12048b18 100644 --- a/src/plugins/replaceGoogleSearch/index.tsx +++ b/src/plugins/replaceGoogleSearch/index.tsx @@ -131,7 +131,6 @@ migratePluginSettings("ReplaceGoogleSearch", "Search"); export default definePlugin({ name: "ReplaceGoogleSearch", description: "Replaces the Google search with different Engine(s)", - tags: ["Utility", "Customisation"], authors: [Devs.Moxxie, Devs.Ethan], settings, diff --git a/src/plugins/replyTimestamp/index.tsx b/src/plugins/replyTimestamp/index.tsx index 021caea59..65e969241 100644 --- a/src/plugins/replyTimestamp/index.tsx +++ b/src/plugins/replyTimestamp/index.tsx @@ -58,7 +58,6 @@ function ReplyTimestamp({ export default definePlugin({ name: "ReplyTimestamp", description: "Shows a timestamp on replied-message previews", - tags: ["Chat", "Appearance"], authors: [Devs.Kyuuhachi], patches: [ diff --git a/src/plugins/revealAllSpoilers/index.ts b/src/plugins/revealAllSpoilers/index.ts index a1176d7b5..173632d7a 100644 --- a/src/plugins/revealAllSpoilers/index.ts +++ b/src/plugins/revealAllSpoilers/index.ts @@ -27,7 +27,7 @@ export default definePlugin({ name: "RevealAllSpoilers", description: "Reveal all spoilers in a message by Ctrl-clicking a spoiler, or in the chat with Ctrl+Shift-click", authors: [Devs.whqwert], - tags: ["Accessibility", "Chat", "Shortcuts", "Utility"], + patches: [ { find: ".removeObscurity,", diff --git a/src/plugins/reverseImageSearch/index.tsx b/src/plugins/reverseImageSearch/index.tsx index 68845c0a1..10d3fad19 100644 --- a/src/plugins/reverseImageSearch/index.tsx +++ b/src/plugins/reverseImageSearch/index.tsx @@ -102,9 +102,8 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => export default definePlugin({ name: "ReverseImageSearch", description: "Adds ImageSearch to image context menus", - tags: ["Media", "Utility"], authors: [Devs.Ven, Devs.Nuckyz], - searchTerms: ["ImageUtilities"], + tags: ["ImageUtilities"], patches: [ { diff --git a/src/plugins/reviewDB/index.tsx b/src/plugins/reviewDB/index.tsx index dca4e7217..393237e0e 100644 --- a/src/plugins/reviewDB/index.tsx +++ b/src/plugins/reviewDB/index.tsx @@ -69,8 +69,6 @@ const userContextPatch: NavContextMenuPatchCallback = (children, { user }: { use export default definePlugin({ name: "ReviewDB", description: "Review other users (Adds a new settings to profiles)", - dependencies: ["ProfileCollectionsAPI"], - tags: ["Friends", "Servers"], authors: [Devs.mantikafasi, Devs.Ven], isModified: true, diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx index 6ebbdf1c2..5972bb240 100644 --- a/src/plugins/roleColorEverywhere/index.tsx +++ b/src/plugins/roleColorEverywhere/index.tsx @@ -76,7 +76,6 @@ export default definePlugin({ name: "RoleColorEverywhere", authors: [Devs.KingFish, Devs.lewisakura, Devs.AutumnVN, Devs.Kyuuhachi, Devs.jamesbt365], description: "Adds the top role color anywhere possible", - tags: ["Roles", "Appearance"], settings, patches: [ diff --git a/src/plugins/secretRingTone/index.ts b/src/plugins/secretRingTone/index.ts index 4ebbe3b84..f2913afd1 100644 --- a/src/plugins/secretRingTone/index.ts +++ b/src/plugins/secretRingTone/index.ts @@ -20,7 +20,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SecretRingToneEnabler", description: "Always play the secret version of the discord ringtone (except during special ringtone events)", - tags: ["Notifications", "Fun"], authors: [Devs.AndrewDLO, Devs.FieryFlames, Devs.RamziAH], settings, patches: [ diff --git a/src/plugins/seeSummaries/index.tsx b/src/plugins/seeSummaries/index.tsx index 29dd7d383..faa642fc7 100644 --- a/src/plugins/seeSummaries/index.tsx +++ b/src/plugins/seeSummaries/index.tsx @@ -52,7 +52,6 @@ interface ChannelSummaries { export default definePlugin({ name: "Summaries", description: "Enables Discord's experimental Summaries feature on every server, displaying AI generated summaries of conversations", - tags: ["Chat", "Fun"], authors: [Devs.mantikafasi], settings, patches: [ diff --git a/src/plugins/sendTimestamps/index.tsx b/src/plugins/sendTimestamps/index.tsx index 930bf498e..65c1f11d7 100644 --- a/src/plugins/sendTimestamps/index.tsx +++ b/src/plugins/sendTimestamps/index.tsx @@ -170,8 +170,6 @@ const SendTimestampButton: ChatBarButtonFactory = ({ isAnyChat }) => { export default definePlugin({ name: "SendTimestamps", description: "Send timestamps easily via chat box button & text shortcuts. Read the extended description!", - dependencies: ["ChatInputButtonAPI", "MessagePopoverAPI"], - tags: ["Chat", "Commands"], authors: [Devs.Ven, Devs.Tyler, Devs.Grzesiek11], settings, diff --git a/src/plugins/serverInfo/index.tsx b/src/plugins/serverInfo/index.tsx index e68342efa..22a58ed4d 100644 --- a/src/plugins/serverInfo/index.tsx +++ b/src/plugins/serverInfo/index.tsx @@ -50,10 +50,9 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ServerInfo", description: "Allows you to view info about a server", - tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Nuckyz, EquicordDevs.Z1xus], dependencies: ["DynamicImageModalAPI"], - searchTerms: ["guild", "info", "ServerProfile"], + tags: ["guild", "info", "ServerProfile"], isModified: true, contextMenus: { "guild-context": Patch, diff --git a/src/plugins/serverListIndicators/index.tsx b/src/plugins/serverListIndicators/index.tsx index 0d31102c9..ed71c1f0a 100644 --- a/src/plugins/serverListIndicators/index.tsx +++ b/src/plugins/serverListIndicators/index.tsx @@ -141,7 +141,6 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ServerListIndicators", description: "Add online friend count or server count in the server list", - tags: ["Servers", "Appearance"], authors: [Devs.dzshn, EquicordDevs.Panniku], dependencies: ["ServerListAPI"], settings, diff --git a/src/plugins/shikiCodeblocks.desktop/index.ts b/src/plugins/shikiCodeblocks.desktop/index.ts index d42065c0e..ea333f655 100644 --- a/src/plugins/shikiCodeblocks.desktop/index.ts +++ b/src/plugins/shikiCodeblocks.desktop/index.ts @@ -33,7 +33,6 @@ import { clearStyles } from "./utils/createStyle"; export default definePlugin({ name: "ShikiCodeblocks", description: "Brings vscode-style codeblocks into Discord, powered by Shiki", - tags: ["Appearance", "Chat", "Customisation"], authors: [Devs.Vap], reporterTestable: ReporterTestable.Patches, settings, diff --git a/src/plugins/showAllMessageButtons/index.ts b/src/plugins/showAllMessageButtons/index.ts index bbec944d1..2d1f4bcb1 100644 --- a/src/plugins/showAllMessageButtons/index.ts +++ b/src/plugins/showAllMessageButtons/index.ts @@ -5,7 +5,7 @@ */ import { definePluginSettings } from "@api/Settings"; -import { Devs } from "@utils/constants"; +import { Devs, EquicordDevs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import { MessageActions, PinActions } from "@webpack/common"; @@ -25,8 +25,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "ShowAllMessageButtons", description: "Always show all message buttons no matter if you are holding the shift key or not.", - tags: ["Chat", "Utility"], - authors: [Devs.Nuckyz], + authors: [Devs.Nuckyz, EquicordDevs.mochienya], + settings, patches: [ { diff --git a/src/plugins/showConnections/index.tsx b/src/plugins/showConnections/index.tsx index 4bbd62e08..1c5d3ec5d 100644 --- a/src/plugins/showConnections/index.tsx +++ b/src/plugins/showConnections/index.tsx @@ -161,7 +161,6 @@ function CompactConnectionComponent({ connection, theme }: { connection: Connect export default definePlugin({ name: "ShowConnections", description: "Show connected accounts in user popouts", - tags: ["Friends", "Appearance"], authors: [Devs.TheKodeToad], settings, diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index cad544520..85b9b3ddf 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -82,7 +82,6 @@ function isUncategorized(objChannel: { channel: Channel; comparator: number; }) export default definePlugin({ name: "ShowHiddenChannels", description: "Show channels that you do not have access to view.", - tags: ["Servers", "Utility"], authors: [Devs.BigDuck, Devs.AverageReactEnjoyer, Devs.D3SOX, Devs.Ven, Devs.Nuckyz, Devs.Nickyux, Devs.dzshn, EquicordDevs.Oggetto], isModified: true, settings, diff --git a/src/plugins/showHiddenThings/index.ts b/src/plugins/showHiddenThings/index.ts index 5ef238327..9a329474d 100644 --- a/src/plugins/showHiddenThings/index.ts +++ b/src/plugins/showHiddenThings/index.ts @@ -37,9 +37,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "ShowHiddenThings", - searchTerms: ["ShowTimeouts", "ShowInvitesPaused", "ShowModView", "DisableDiscoveryFilters"], + tags: ["ShowTimeouts", "ShowInvitesPaused", "ShowModView", "DisableDiscoveryFilters"], description: "Displays various hidden & moderator-only things regardless of permissions.", - tags: ["Servers", "Utility"], authors: [Devs.Dolfies], settings, diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx index bda540684..7c8e24582 100644 --- a/src/plugins/showMeYourName/index.tsx +++ b/src/plugins/showMeYourName/index.tsx @@ -1069,8 +1069,7 @@ export default definePlugin({ name: "ShowMeYourName", description: "Display any permutation of custom nicknames, friend nicknames, server nicknames, display names, and usernames in chat.", authors: [EquicordDevs.Etorix, Devs.Rini, Devs.TheKodeToad, Devs.sadan, Devs.prism], - tags: ["Appearance", "Customisation"], - searchTerms: ["SMYN", "Nicknames", "Custom Nicknames"], + tags: ["SMYN", "Nicknames", "Custom Nicknames",], isModified: true, settings, @@ -1139,7 +1138,7 @@ export default definePlugin({ // Attach the group ID to their messages to allow animating gradients within a group. find: "CUSTOM_GIFT?\"\":", replacement: { - match: /(isHovered:(\i).{0,1300})(let \i=\i.id===\i,\i=)/, + match: /(isHovered:(\i).{0,1300}?\(\i,\i,\i\);)(let \i=\i.id===\i)/, replace: "$1arguments[0].message.showMeYourNameGroupId=!!arguments[0].groupId?`g-${arguments[0].groupId}`:null;$self.handleHoveringMessage(arguments[0].message,$2);$3" }, }, diff --git a/src/plugins/showTimeoutDuration/index.tsx b/src/plugins/showTimeoutDuration/index.tsx index 9960b4769..bcc5cd760 100644 --- a/src/plugins/showTimeoutDuration/index.tsx +++ b/src/plugins/showTimeoutDuration/index.tsx @@ -69,7 +69,6 @@ function renderTimeout(message: Message, inline: boolean) { export default definePlugin({ name: "ShowTimeoutDuration", description: "Shows how much longer a user's timeout will last, either in the timeout icon tooltip or next to it", - tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Sqaaakoi], settings, diff --git a/src/plugins/silentMessageToggle/index.tsx b/src/plugins/silentMessageToggle/index.tsx index 9e6eb724c..61f543217 100644 --- a/src/plugins/silentMessageToggle/index.tsx +++ b/src/plugins/silentMessageToggle/index.tsx @@ -110,8 +110,6 @@ export default definePlugin({ name: "SilentMessageToggle", authors: [Devs.Nuckyz, Devs.CatNoir, EquicordDevs.Z1xus], description: "Adds a button to the chat bar to toggle sending a silent message.", - dependencies: ["ChatInputButtonAPI"], - tags: ["Chat", "Utility"], settings, chatBarButton: { diff --git a/src/plugins/silentTyping/index.tsx b/src/plugins/silentTyping/index.tsx index 31cbd60ec..e84edcb85 100644 --- a/src/plugins/silentTyping/index.tsx +++ b/src/plugins/silentTyping/index.tsx @@ -296,9 +296,7 @@ function shouldHideMembersListTypingIndicators(): boolean { export default definePlugin({ name: "SilentTyping", authors: [Devs.Ven, Devs.Rini, Devs.ImBanana, EquicordDevs.Etorix], - description: "Hide that you are typing", - dependencies: ["CommandsAPI", "ChatInputButtonAPI"], - tags: ["Chat", "Privacy"], + description: "Hide your typing indicator from chat.", isModified: true, settings, diff --git a/src/plugins/sortFriendRequests/index.tsx b/src/plugins/sortFriendRequests/index.tsx index b10e0817e..27efd88c6 100644 --- a/src/plugins/sortFriendRequests/index.tsx +++ b/src/plugins/sortFriendRequests/index.tsx @@ -56,7 +56,6 @@ export default definePlugin({ name: "SortFriends", authors: [Devs.Megu, EquicordDevs.CallMeGii], description: "Sorts friend requests by date of receipt", - tags: ["Friends", "Organisation"], isModified: true, settings, diff --git a/src/plugins/spotifyCrack/index.ts b/src/plugins/spotifyCrack/index.ts index d15d1fd86..505e53a12 100644 --- a/src/plugins/spotifyCrack/index.ts +++ b/src/plugins/spotifyCrack/index.ts @@ -38,7 +38,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SpotifyCrack", description: "Free listen along, no auto-pausing in voice chat, and allows activity to continue playing when idling", - tags: ["Media", "Utility"], authors: [Devs.Cyn, Devs.Nuckyz], settings, diff --git a/src/plugins/spotifyShareCommands/index.ts b/src/plugins/spotifyShareCommands/index.ts index b0d5e0fd2..b4a85eb16 100644 --- a/src/plugins/spotifyShareCommands/index.ts +++ b/src/plugins/spotifyShareCommands/index.ts @@ -98,8 +98,6 @@ function makeCommand(name: string, formatUrl: (track: Track) => string): Command export default definePlugin({ name: "SpotifyShareCommands", description: "Share your current Spotify track, album or artist via slash command (/track, /album, /artist)", - dependencies: ["CommandsAPI"], - tags: ["Media", "Commands"], authors: [Devs.katlyn], commands: [ makeCommand("track", track => `https://open.spotify.com/track/${track.id}`), diff --git a/src/plugins/startupTimings/index.tsx b/src/plugins/startupTimings/index.tsx index d61d004eb..4a8c06807 100644 --- a/src/plugins/startupTimings/index.tsx +++ b/src/plugins/startupTimings/index.tsx @@ -27,7 +27,6 @@ import StartupTimingPage from "./StartupTimingPage"; export default definePlugin({ name: "StartupTimings", description: "Adds Startup Timings to the Settings menu", - tags: ["Developers"], authors: [Devs.Megu], start() { SettingsPlugin.customEntries.push({ diff --git a/src/plugins/stickerPaste/index.ts b/src/plugins/stickerPaste/index.ts index 0dd0bd2b3..8a0082073 100644 --- a/src/plugins/stickerPaste/index.ts +++ b/src/plugins/stickerPaste/index.ts @@ -10,7 +10,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "StickerPaste", description: "Makes picking a sticker in the sticker picker insert it into the chatbox instead of instantly sending", - tags: ["Emotes", "Chat"], authors: [Devs.ImBanana], patches: [ diff --git a/src/plugins/streamerModeOnStream/index.ts b/src/plugins/streamerModeOnStream/index.ts index 49609ac61..26b4a279c 100644 --- a/src/plugins/streamerModeOnStream/index.ts +++ b/src/plugins/streamerModeOnStream/index.ts @@ -37,7 +37,6 @@ function toggleStreamerMode({ streamKey }: StreamEvent, value: boolean) { export default definePlugin({ name: "StreamerModeOn", description: "Automatically enables streamer mode when you start streaming in Discord", - tags: ["Privacy", "Utility"], authors: [Devs.IcedMarina], flux: { STREAM_CREATE: d => toggleStreamerMode(d, true), diff --git a/src/plugins/superReactionTweaks/index.ts b/src/plugins/superReactionTweaks/index.ts index 7c0d9a2c0..0ca873efa 100644 --- a/src/plugins/superReactionTweaks/index.ts +++ b/src/plugins/superReactionTweaks/index.ts @@ -37,7 +37,6 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "SuperReactionTweaks", description: "Customize the limit of Super Reactions playing at once, and super react by default", - tags: ["Reactions", "Emotes"], authors: [Devs.FieryFlames, Devs.ant0n], patches: [ { diff --git a/src/plugins/textReplace/index.tsx b/src/plugins/textReplace/index.tsx index 3374bd8fb..289f4ee4f 100644 --- a/src/plugins/textReplace/index.tsx +++ b/src/plugins/textReplace/index.tsx @@ -303,10 +303,9 @@ const TEXT_REPLACE_RULES_EXEMPT_CHANNEL_IDS = [ export default definePlugin({ name: "TextReplace", - description: "Replace text in your messages. You can find pre-made rules in the #textreplace-rules channel in Vencord's Server", - dependencies: ["MessagePopoverAPI"], - tags: ["Chat", "Customisation", "Utility"], + description: "Replace text in your or others' messages. You can find pre-made rules in the #textreplace-rules channel in Vencord's Server.", authors: [Devs.AutumnVN, Devs.TheKodeToad, EquicordDevs.Etorix], + isModified: true, settings, modifyIncomingMessage, diff --git a/src/plugins/themeAttributes/index.ts b/src/plugins/themeAttributes/index.ts index aee5e5018..e71dec0ad 100644 --- a/src/plugins/themeAttributes/index.ts +++ b/src/plugins/themeAttributes/index.ts @@ -13,7 +13,6 @@ import { UserStore } from "@webpack/common"; export default definePlugin({ name: "ThemeAttributes", description: "Adds data attributes to various elements for theming purposes", - tags: ["Appearance", "Customisation"], authors: [Devs.Ven, Devs.Board], patches: [ diff --git a/src/plugins/translate/index.tsx b/src/plugins/translate/index.tsx index caeb5ac62..d5d36c121 100644 --- a/src/plugins/translate/index.tsx +++ b/src/plugins/translate/index.tsx @@ -63,8 +63,6 @@ let tooltipTimeout: any; export default definePlugin({ name: "Translate", description: "Translate messages with Google Translate or DeepL", - dependencies: ["ChatInputButtonAPI", "MessageAccessoriesAPI", "MessagePopoverAPI"], - tags: ["Chat", "Utility"], authors: [Devs.Ven, Devs.AshtonMemer], settings, contextMenus: { diff --git a/src/plugins/typingIndicator/index.tsx b/src/plugins/typingIndicator/index.tsx index 2f78df0c3..ecfb841ee 100644 --- a/src/plugins/typingIndicator/index.tsx +++ b/src/plugins/typingIndicator/index.tsx @@ -166,7 +166,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "TypingIndicator", description: "Adds an indicator if someone is typing on a channel.", - tags: ["Notifications", "Appearance", "Servers"], authors: [Devs.Nuckyz, Devs.fawn, Devs.Sqaaakoi], isModified: true, settings, diff --git a/src/plugins/typingTweaks/index.tsx b/src/plugins/typingTweaks/index.tsx index 4832478bf..1b72581d3 100644 --- a/src/plugins/typingTweaks/index.tsx +++ b/src/plugins/typingTweaks/index.tsx @@ -114,7 +114,6 @@ migratePluginToSettings(true, "TypingTweaks", "AmITyping", "amITyping"); export default definePlugin({ name: "TypingTweaks", description: "Show avatars and role colours in the typing indicator", - tags: ["Appearance", "Customisation"], authors: [Devs.zt, Devs.sadan, EquicordDevs.MrDiamond], settings, isModified: true, diff --git a/src/plugins/unindent/index.ts b/src/plugins/unindent/index.ts index 9ebbf8deb..1a548a68e 100644 --- a/src/plugins/unindent/index.ts +++ b/src/plugins/unindent/index.ts @@ -23,8 +23,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "Unindent", description: "Trims leading indentation from codeblocks", - dependencies: ["MessageEventsAPI"], - tags: ["Chat", "Utility"], authors: [Devs.Ven], patches: [ diff --git a/src/plugins/unlockedAvatarZoom/index.ts b/src/plugins/unlockedAvatarZoom/index.ts index fbab2b734..dc8de74db 100644 --- a/src/plugins/unlockedAvatarZoom/index.ts +++ b/src/plugins/unlockedAvatarZoom/index.ts @@ -20,7 +20,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UnlockedAvatarZoom", description: "Allows you to zoom in further in the image crop tool when changing your avatar", - tags: ["Media", "Utility"], authors: [Devs.nakoyasha], settings, patches: [ diff --git a/src/plugins/unsuppressEmbeds/index.tsx b/src/plugins/unsuppressEmbeds/index.tsx index 6ad1a6850..9f4baeee3 100644 --- a/src/plugins/unsuppressEmbeds/index.tsx +++ b/src/plugins/unsuppressEmbeds/index.tsx @@ -62,7 +62,6 @@ export default definePlugin({ name: "UnsuppressEmbeds", authors: [Devs.rad, Devs.HypedDomi], description: "Allows you to unsuppress embeds in messages", - tags: ["Chat", "Utility"], contextMenus: { "message": messageContextMenuPatch } diff --git a/src/plugins/userMessagesPronouns/index.ts b/src/plugins/userMessagesPronouns/index.ts index 1088e2f20..56721e11f 100644 --- a/src/plugins/userMessagesPronouns/index.ts +++ b/src/plugins/userMessagesPronouns/index.ts @@ -28,7 +28,6 @@ export default definePlugin({ name: "UserMessagesPronouns", authors: [Devs.Tyman, Devs.TheKodeToad, Devs.Ven, Devs.Elvyra], description: "Adds pronouns to chat user messages", - tags: ["Chat", "Appearance"], settings, patches: [ diff --git a/src/plugins/userVoiceShow/index.tsx b/src/plugins/userVoiceShow/index.tsx index fb6f0c8df..ec97530e5 100644 --- a/src/plugins/userVoiceShow/index.tsx +++ b/src/plugins/userVoiceShow/index.tsx @@ -48,8 +48,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UserVoiceShow", description: "Shows an indicator when a user is in a Voice Channel", - tags: ["Voice", "Appearance", "Friends"], - dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI", "NicknameIconsAPI"], authors: [Devs.Nuckyz, Devs.LordElias, EquicordDevs.omaw], settings, renderNicknameIcon({ userId }) { diff --git a/src/plugins/usrbg/index.tsx b/src/plugins/usrbg/index.tsx index 8d1c40d72..b77efb8f7 100644 --- a/src/plugins/usrbg/index.tsx +++ b/src/plugins/usrbg/index.tsx @@ -54,7 +54,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "USRBG", description: "Displays user banners from USRBG, allowing anyone to get a banner without Nitro", - tags: ["Appearance", "Customisation"], authors: [Devs.AutumnVN, Devs.katlyn, Devs.pylix, Devs.TheKodeToad], settings, patches: [ diff --git a/src/plugins/validReply/index.ts b/src/plugins/validReply/index.ts index 988d67cf4..2ca072040 100644 --- a/src/plugins/validReply/index.ts +++ b/src/plugins/validReply/index.ts @@ -33,7 +33,6 @@ const createMessageRecord = findByCodeLazy(".createFromServer(", ".isBlockedForM export default definePlugin({ name: "ValidReply", description: 'Fixes "Message could not be loaded" upon hovering over the reply', - tags: ["Chat", "Utility"], authors: [Devs.newwares], patches: [ { diff --git a/src/plugins/validUser/index.tsx b/src/plugins/validUser/index.tsx index 3fa17ef6f..2ff829a12 100644 --- a/src/plugins/validUser/index.tsx +++ b/src/plugins/validUser/index.tsx @@ -177,9 +177,8 @@ function MentionWrapper({ data, UserMention, RoleMention, parse, props }: Mentio export default definePlugin({ name: "ValidUser", description: "Fix mentions for unknown users showing up as '@unknown-user' (hover over a mention to fix it)", - tags: ["Chat", "Utility"], authors: [Devs.Ven, Devs.Dolfies], - searchTerms: ["MentionCacheFix"], + tags: ["MentionCacheFix"], patches: [ { diff --git a/src/plugins/vcDoubleClick/index.ts b/src/plugins/vcDoubleClick/index.ts index 4eea12da4..d9310f51f 100644 --- a/src/plugins/vcDoubleClick/index.ts +++ b/src/plugins/vcDoubleClick/index.ts @@ -28,7 +28,6 @@ const timers = {} as Record$self.openAvatar($1.src)});$&', + match: /avatarSrc:(\i),eventHandlers:(\i).+?"div",.{0,100}className:\i,/, + replace: "$&style:{cursor:\"pointer\"},onClick:()=>{$self.openAvatar($1)},", } }, // Banners diff --git a/src/plugins/viewRaw/index.tsx b/src/plugins/viewRaw/index.tsx index 212ea4e49..aad99622c 100644 --- a/src/plugins/viewRaw/index.tsx +++ b/src/plugins/viewRaw/index.tsx @@ -176,8 +176,6 @@ const devContextCallback: NavContextMenuPatchCallback = (children, { id }: { id: export default definePlugin({ name: "ViewRaw", description: "Copy and view the raw content/data of any message, channel or guild", - dependencies: ["MessagePopoverAPI"], - tags: ["Chat", "Developers"], authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna], settings, diff --git a/src/plugins/voiceDownload/index.tsx b/src/plugins/voiceDownload/index.tsx index 8dbc9b705..eac912e47 100644 --- a/src/plugins/voiceDownload/index.tsx +++ b/src/plugins/voiceDownload/index.tsx @@ -12,7 +12,6 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "VoiceDownload", description: "Adds a download to voice messages. (Opens a new browser tab)", - tags: ["Voice", "Media"], authors: [Devs.puv], patches: [ { diff --git a/src/plugins/voiceMessages/index.tsx b/src/plugins/voiceMessages/index.tsx index 5214cf62a..acad7fa6f 100644 --- a/src/plugins/voiceMessages/index.tsx +++ b/src/plugins/voiceMessages/index.tsx @@ -26,7 +26,7 @@ import { Microphone } from "@components/Icons"; import { Link } from "@components/Link"; import { Paragraph } from "@components/Paragraph"; import { lastState as silentMessageEnabled } from "@plugins/silentMessageToggle"; -import { Devs } from "@utils/constants"; +import { Devs, EquicordDevs } from "@utils/constants"; import { classNameFactory } from "@utils/css"; import { Margins } from "@utils/margins"; import { ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, openModal } from "@utils/modal"; @@ -271,10 +271,10 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "VoiceMessages", - description: "Allows you to send voice messages like on mobile. To do so, right click the upload button and click Send Voice Message", - tags: ["Voice"], - authors: [Devs.Ven, Devs.Vap, Devs.Nickyux], + description: "Allows you to send voice messages like on mobile. To do so, right click the upload button and click Send Voice Message.", + authors: [Devs.Ven, Devs.Vap, Devs.Nickyux, EquicordDevs.Z1xus, Devs.prism], settings, + contextMenus: { "channel-attach": ctxMenuPatch } diff --git a/src/plugins/volumeBooster/index.ts b/src/plugins/volumeBooster/index.ts index e379686ad..4ab0c332a 100644 --- a/src/plugins/volumeBooster/index.ts +++ b/src/plugins/volumeBooster/index.ts @@ -51,7 +51,6 @@ export default definePlugin({ name: "VolumeBooster", authors: [Devs.Nuckyz, Devs.sadan], description: "Allows you to set the user and stream volume above the default maximum", - tags: ["Voice", "Utility"], settings, patches: [ diff --git a/src/plugins/webContextMenus.web/index.ts b/src/plugins/webContextMenus.web/index.ts index dd86c9652..2076404ab 100644 --- a/src/plugins/webContextMenus.web/index.ts +++ b/src/plugins/webContextMenus.web/index.ts @@ -88,7 +88,6 @@ function fixImageUrl(urlString: string) { export default definePlugin({ name: "WebContextMenus", description: "Re-adds context menus missing in the web version of Discord: Links & Images (Copy/Open Link/Image), Text Area (Copy, Cut, Paste, SpellCheck)", - tags: ["Utility"], authors: [Devs.Ven], enabledByDefault: true, required: requiredByPlatform, diff --git a/src/plugins/webKeybinds.web/index.ts b/src/plugins/webKeybinds.web/index.ts index f8563dc88..b9b49c35c 100644 --- a/src/plugins/webKeybinds.web/index.ts +++ b/src/plugins/webKeybinds.web/index.ts @@ -26,7 +26,6 @@ const KeyBinds = findByPropsLazy("JUMP_TO_GUILD", "SERVER_NEXT"); export default definePlugin({ name: "WebKeybinds", description: "Re-adds keybinds missing in the web version of Discord: ctrl+t, ctrl+shift+t, ctrl+tab, ctrl+shift+tab, ctrl+1-9, ctrl+,. Only works fully on Vesktop/Legcord, not inside your browser", - tags: ["Shortcuts"], authors: [Devs.Ven], enabledByDefault: true, diff --git a/src/plugins/webScreenShareFixes.web/index.ts b/src/plugins/webScreenShareFixes.web/index.ts index ac06a00e2..e7fbc178e 100644 --- a/src/plugins/webScreenShareFixes.web/index.ts +++ b/src/plugins/webScreenShareFixes.web/index.ts @@ -11,7 +11,6 @@ export default definePlugin({ name: "WebScreenShareFixes", authors: [Devs.Kaitlyn], description: "Removes 2500kbps bitrate cap on chromium and vesktop clients.", - tags: ["Voice"], enabledByDefault: true, patches: [ diff --git a/src/plugins/whoReacted/index.tsx b/src/plugins/whoReacted/index.tsx index 79b03baf3..cb2d6f977 100644 --- a/src/plugins/whoReacted/index.tsx +++ b/src/plugins/whoReacted/index.tsx @@ -88,7 +88,6 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhoReacted", description: "Renders the avatars of users who reacted to a message", - tags: ["Reactions", "Chat", "Appearance"], authors: [Devs.Ven, Devs.KannaDev, Devs.newwares], isModified: true, settings, diff --git a/src/plugins/xsOverlay/index.tsx b/src/plugins/xsOverlay/index.tsx index 52d2bc912..ff07da6e7 100644 --- a/src/plugins/xsOverlay/index.tsx +++ b/src/plugins/xsOverlay/index.tsx @@ -188,9 +188,8 @@ const Native = VencordNative.pluginHelpers.XSOverlay as PluginNative string = RegExp.escape ?? function (s: string) { return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }; diff --git a/src/utils/types.ts b/src/utils/types.ts index c33114a5c..ac078d5e5 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -46,32 +46,6 @@ export function makeRange(start: number, end: number, step = 1) { return ranges; } -export const PluginTags = [ - "Accessibility", - "Activity", - "Appearance", - "Chat", - "Commands", - "Console", - "Customisation", - "Developers", - "Emotes", - "Friends", - "Fun", - "Media", - "Notifications", - "Organisation", - "Privacy", - "Reactions", - "Roles", - "Servers", - "Shortcuts", - "Utility", - "Voice" -] as const; - -export type PluginTag = typeof PluginTags[number]; - export type ReplaceFn = (match: string, ...groups: string[]) => string; export interface PatchReplacement { @@ -131,9 +105,6 @@ export type IconProps = { height?: number | string; width?: number | string; cla export interface PluginDef { name: string; description: string; - /** Additional search terms that will bring up your plugin */ - searchTerms?: string[]; - tags?: PluginTag[]; authors: PluginAuthor[]; start?(): void; stop?(): void; @@ -211,6 +182,8 @@ export interface PluginDef { */ toolboxActions?: Record void> | (() => ReactNode); + tags?: string[]; + /** * Managed style to automatically enable and disable when the plugin is enabled or disabled */ diff --git a/src/webpack/common/components.ts b/src/webpack/common/components.ts index 98d453abf..a5723c001 100644 --- a/src/webpack/common/components.ts +++ b/src/webpack/common/components.ts @@ -59,7 +59,7 @@ export const TooltipContainer = TooltipContainerComponent as never; export const TextInput = waitForComponent("TextInput", filters.componentByCode("#{intl::MAXIMUM_LENGTH_ERROR}", '"input"')); export const TextArea = waitForComponent("TextArea", filters.componentByCode("this.getPaddingRight()},id:")); export const Select = waitForComponent("Select", filters.componentByCode('selectionMode:"single",onSelectionChange:', "isSelected:")); -export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('?"multiple":"single",required:')); +export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('?"multiple":"single"')); export const Slider = waitForComponent("Slider", filters.componentByCode("markDash", "this.renderMark(")); export const Popout = waitForComponent("Popout", filters.componentByCode("ref:this.ref,", "renderPopout:this.renderPopout,")); export const Dialog = waitForComponent("Dialog", filters.componentByCode('role:"dialog",tabIndex:-1')); diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index 2b1994f20..fb31cbc23 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -5,14 +5,14 @@ */ import { Settings } from "@api/Settings"; -import { reporterData } from "@debug/reporterData"; -import { traceFunctionWithResults } from "@debug/Tracer"; import { makeLazy } from "@utils/lazy"; import { Logger } from "@utils/Logger"; import { interpolateIfDefined } from "@utils/misc"; import { Patch, PatchReplacement } from "@utils/types"; import { WebpackRequire } from "@vencord/discord-types/webpack"; +import { reporterData } from "debug/reporterData"; +import { traceFunctionWithResults } from "../debug/Tracer"; import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, PatchedModuleFactory } from "./types"; import { _blacklistBadModules, _initWebpack, factoryListeners, findModuleFactory, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index 4060bd45b..5917d9073 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import { traceFunction } from "@debug/Tracer"; import { makeLazy, proxyLazy } from "@utils/lazy"; import { LazyComponent } from "@utils/lazyReact"; import { Logger } from "@utils/Logger"; @@ -25,6 +24,7 @@ import { escapeRegExp } from "@utils/text"; import type { FluxStore } from "@vencord/discord-types"; import type { ModuleExports, ModuleFactory, WebpackRequire } from "@vencord/discord-types/webpack"; +import { traceFunction } from "../debug/Tracer"; import type { AnyModuleFactory, AnyWebpackRequire } from "./types"; const logger = new Logger("Webpack"); diff --git a/tsconfig.json b/tsconfig.json index 0828f0ca1..a3aeb9ce8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,49 +19,48 @@ "noImplicitAny": false, "target": "ESNEXT", "jsx": "preserve", - "baseUrl": "./src/", "paths": { "@main/*": [ - "./main/*" + "./src/main/*" ], "@api/*": [ - "./api/*" + "./sr/capi/*" ], "@components/*": [ - "./components/*" + "./src/components/*" ], "@debug/*": [ - "./debug/*" + "./src/debug/*" ], "@utils/*": [ - "./utils/*" + "./src/utils/*" ], "@plugins/*": [ - "./plugins/*" + "./src/plugins/*" ], "@shared/*": [ - "./shared/*" + "./src/shared/*" ], "@webpack/common": [ - "./webpack/common" + "./src/webpack/common" ], "@webpack/common/*": [ - "./webpack/common/*" + "./src/webpack/common/*" ], "@webpack": [ - "./webpack/webpack" + "./src/webpack/webpack" ], "@webpack/patcher": [ - "./webpack/patchWebpack" + "./src/webpack/patchWebpack" ], "@webpack/wreq.d": [ - "./webpack/wreq.d" + "./src/webpack/wreq.d" ], "@webpack/types": [ - "./webpack/types" + "./src/webpack/types" ], "@equicordplugins/*": [ - "./equicordplugins/*" + "./src/equicordplugins/*" ] }, "plugins": [ From 8bf18c911a7164ab627952d0c299a66138e96728 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:26:44 -0400 Subject: [PATCH 048/247] revert --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index a3aeb9ce8..a569f4f8c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,7 +24,7 @@ "./src/main/*" ], "@api/*": [ - "./sr/capi/*" + "./src/capi/*" ], "@components/*": [ "./src/components/*" From b9dd7cc8d6d9f30d0907ebcab2fd97247ed88afc Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:43:10 -0400 Subject: [PATCH 049/247] bro what --- src/plugins/showAllMessageButtons/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/showAllMessageButtons/index.ts b/src/plugins/showAllMessageButtons/index.ts index bbec944d1..92c1479f8 100644 --- a/src/plugins/showAllMessageButtons/index.ts +++ b/src/plugins/showAllMessageButtons/index.ts @@ -27,6 +27,7 @@ export default definePlugin({ description: "Always show all message buttons no matter if you are holding the shift key or not.", tags: ["Chat", "Utility"], authors: [Devs.Nuckyz], + settings, patches: [ { From a3b2ee48f38043ee7886204198a06057148672ba Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:45:58 -0400 Subject: [PATCH 050/247] fix whatever the fuck happened --- package.json | 54 +- pnpm-lock.yaml | 1857 ++++++++++------- scripts/utils.ts | 11 +- src/api/AudioPlayer.ts | 2 +- src/api/PluginManager.ts | 2 +- src/components/CheckedTextInput.tsx | 12 +- .../components/SettingColorComponent.tsx | 1 + .../settings/tabs/plugins/PluginCard.tsx | 2 +- .../settings/tabs/plugins/PluginModal.css | 22 +- .../settings/tabs/plugins/PluginModal.tsx | 13 +- .../settings/tabs/plugins/index.tsx | 91 +- .../settings/tabs/plugins/styles.css | 7 +- .../settings/tabs/sync/CloudTab.tsx | 2 +- .../settings/tabs/vencord/index.tsx | 2 +- src/debug/loadLazyChunks.ts | 2 +- src/debug/reporterData.ts | 1 + src/equicordplugins/altKrispSwitch/index.tsx | 1 + .../alwaysExpandProfiles/index.ts | 1 + src/equicordplugins/animalese/index.ts | 1 + src/equicordplugins/atSomeone/index.ts | 1 + src/equicordplugins/autoZipper/index.ts | 1 + .../bannersEverywhere/index.tsx | 1 + src/equicordplugins/baseDecoder/index.tsx | 2 + .../betterActivities/index.tsx | 2 +- .../betterAudioPlayer/index.tsx | 1 + .../betterBanReasons/index.tsx | 1 + .../betterBlockedUsers/index.tsx | 1 + src/equicordplugins/betterCommands/index.ts | 2 + src/equicordplugins/betterInvites/index.tsx | 1 + src/equicordplugins/betterPlusReacts/index.ts | 1 + src/equicordplugins/blockKeywords/index.ts | 1 + src/equicordplugins/blockKrisp/index.ts | 1 + src/equicordplugins/bypassPinPrompt/index.ts | 1 + src/equicordplugins/bypassStatus/index.tsx | 1 + src/equicordplugins/channelBadges/index.tsx | 1 + src/equicordplugins/channelTabs/index.tsx | 3 +- src/equicordplugins/cleanChannelName/index.ts | 1 + .../cleanerChannelGroups/index.ts | 1 + src/equicordplugins/clickableRoles/index.tsx | 1 + src/equicordplugins/clientSideBlock/index.tsx | 3 +- .../index.tsx | 1 + src/equicordplugins/collapsibleUi/index.tsx | 4 +- src/equicordplugins/commandPalette/index.tsx | 1 + .../commandPalette/registry.tsx | 3 +- src/equicordplugins/components.dev/index.tsx | 1 + src/equicordplugins/contentWarning/index.tsx | 1 + .../copyProfileColors/index.tsx | 1 + src/equicordplugins/copyStatusUrls/index.ts | 1 + src/equicordplugins/copyUserMention/index.tsx | 1 + src/equicordplugins/cursorBuddy/index.tsx | 3 +- .../customFolderIcons/index.tsx | 1 + src/equicordplugins/customSounds/index.tsx | 2 + .../customStatusTimeouts/index.tsx | 1 + .../customTimestamps/index.tsx | 1 + .../customUserColors/index.tsx | 1 + src/equicordplugins/declutter/index.tsx | 1 + src/equicordplugins/disableCameras/index.tsx | 1 + .../components/makeDevBanner.tsx | 2 +- .../discordDevBanner/index.tsx | 1 + .../dragFavoriteEmotes/index.tsx | 1 + src/equicordplugins/dragify/index.tsx | 1 + .../elementHighlighter.dev/index.tsx | 1 + .../equibopStreamFixes.equibop/index.tsx | 1 + src/equicordplugins/equicordHelper/index.tsx | 2 + src/equicordplugins/equicordToolbox/index.tsx | 3 +- src/equicordplugins/equissant/index.ts | 1 + src/equicordplugins/exitSounds/index.tsx | 1 + src/equicordplugins/exportMessages/index.tsx | 1 + .../fastDeleteChannels/index.tsx | 1 + .../favouriteAnything/index.tsx | 3 +- .../favouriteAnything/polyfills.ts | 2 +- src/equicordplugins/fileUpload/index.tsx | 1 + src/equicordplugins/findReply/index.tsx | 2 + .../fixFileExtensions/index.tsx | 1 + src/equicordplugins/followVoiceUser/index.tsx | 1 + src/equicordplugins/fontLoader/index.tsx | 1 + src/equicordplugins/forwardAnywhere/index.ts | 1 + .../frequentQuickSwitcher/index.tsx | 1 + src/equicordplugins/friendCodes/index.tsx | 1 + src/equicordplugins/friendTags/index.tsx | 1 + src/equicordplugins/friendshipRanks/index.tsx | 1 + src/equicordplugins/fullVcPfp/index.tsx | 1 + src/equicordplugins/ghosted/index.tsx | 1 + src/equicordplugins/gifCollections/index.tsx | 1 + src/equicordplugins/githubRepos/index.tsx | 2 + src/equicordplugins/globalBadges/index.tsx | 1 + src/equicordplugins/googleThat/index.tsx | 4 +- .../guildPickerDumper/index.tsx | 1 + src/equicordplugins/hideChatButtons/index.tsx | 1 + src/equicordplugins/hideMessages/index.tsx | 2 + src/equicordplugins/hideServers/index.tsx | 3 +- src/equicordplugins/holyNotes/index.tsx | 2 + src/equicordplugins/homeTyping/index.tsx | 1 + src/equicordplugins/hopOn/index.tsx | 1 + src/equicordplugins/husk/index.tsx | 2 + src/equicordplugins/iRememberYou/index.tsx | 1 + src/equicordplugins/iconViewer/index.tsx | 1 + src/equicordplugins/idleAutoRestart/index.tsx | 1 + src/equicordplugins/ignoreCalls/index.tsx | 1 + src/equicordplugins/inRole/index.tsx | 3 +- src/equicordplugins/ingtoninator/index.tsx | 2 + .../instantScreenshare/index.tsx | 3 +- .../invisibleChat.desktop/index.tsx | 3 +- src/equicordplugins/inviteDefaults/index.ts | 1 + src/equicordplugins/jumpTo/index.tsx | 1 + src/equicordplugins/jumpscare/index.tsx | 1 + .../keyboardNavigation/index.tsx | 1 + src/equicordplugins/keyboardSounds/index.ts | 1 + src/equicordplugins/keywordNotify/index.tsx | 1 + src/equicordplugins/lastActive/index.tsx | 1 + src/equicordplugins/loginWithQR/index.tsx | 1 + .../mediaPlaybackSpeed/index.tsx | 1 + src/equicordplugins/messageBurst/index.ts | 2 + src/equicordplugins/messageColors/index.tsx | 1 + .../messageFetchTimer/index.tsx | 2 + .../messageLinkTooltip/index.tsx | 1 + .../components/LogsModal.tsx | 2 +- .../messageLoggerEnhanced/index.tsx | 5 +- .../messageLoggerEnhanced/settings.tsx | 3 +- .../utils/settingsUtils.ts | 2 +- src/equicordplugins/messageNotifier/index.ts | 1 + src/equicordplugins/messagePeek/index.tsx | 2 + .../messageTranslate/index.tsx | 1 + .../micLoopbackTester/index.tsx | 1 + .../middleClickTweaks/index.ts | 3 +- src/equicordplugins/moreCommands/index.ts | 2 + .../moreStickers/components/misc.tsx | 2 +- src/equicordplugins/moreStickers/index.tsx | 1 + src/equicordplugins/moreUserTags/index.tsx | 2 + src/equicordplugins/moyai/index.ts | 1 + src/equicordplugins/musicControls/index.tsx | 3 +- .../neverPausePreviews/index.tsx | 1 + .../newPluginsManager/index.tsx | 1 + src/equicordplugins/noNitroUpsell/index.ts | 3 +- src/equicordplugins/noPushToTalk/index.ts | 1 + .../noRPC.discordDesktop/index.ts | 1 + src/equicordplugins/noRoleHeaders/index.ts | 1 + .../normalizeMessageLinks/index.ts | 1 + .../index.tsx | 1 + src/equicordplugins/orbolayBridge/index.tsx | 1 + src/equicordplugins/partyMode/index.ts | 1 + src/equicordplugins/pinIcon/index.tsx | 1 + .../pingNotifications/index.tsx | 1 + src/equicordplugins/platformSpoofer/index.tsx | 1 + src/equicordplugins/polishWording/index.ts | 2 + src/equicordplugins/profileSets/index.tsx | 1 + src/equicordplugins/questify/index.tsx | 1 + .../index.tsx | 1 + src/equicordplugins/quoter/index.tsx | 1 + src/equicordplugins/randomVoice/index.tsx | 2 + .../recentDMSwitcher/index.tsx | 1 + src/equicordplugins/remix/index.tsx | 1 + src/equicordplugins/repeatMessages/index.tsx | 2 + src/equicordplugins/replyPingControl/index.ts | 1 + src/equicordplugins/richMagnetLinks/index.tsx | 1 + src/equicordplugins/richPresence/index.tsx | 115 +- .../rpcEditor/ReplaceSettings.tsx | 4 +- src/equicordplugins/rpcEditor/index.tsx | 1 + src/equicordplugins/rpcStats/index.tsx | 1 + .../saveFavoriteGIFs/index.tsx | 2 + .../scheduledMessages/index.tsx | 2 + .../screenRecorder.equibop/index.tsx | 5 +- src/equicordplugins/searchFix/index.tsx | 1 + src/equicordplugins/sekaiStickers/index.tsx | 2 + src/equicordplugins/selfForward/index.ts | 1 + src/equicordplugins/serverSearch/index.tsx | 4 +- .../showBadgesInChat/index.tsx | 4 +- .../showMessageEmbeds/index.tsx | 1 + .../showResourceChannels/index.ts | 1 + src/equicordplugins/showSongName/index.tsx | 1 + src/equicordplugins/sidebarChat/index.tsx | 1 + src/equicordplugins/signature/index.tsx | 2 + src/equicordplugins/snowfall/index.tsx | 3 +- src/equicordplugins/soggy/index.tsx | 3 +- .../songLink.desktop/index.tsx | 2 + .../songSpotlight.desktop/index.tsx | 2 + .../splitLargeMessages/index.ts | 2 + .../spotifyActivityToggle/index.tsx | 2 + src/equicordplugins/statusPresets/index.tsx | 1 + .../statusWhileActive.desktop/index.ts | 1 + src/equicordplugins/steamStatusSync/index.tsx | 1 + src/equicordplugins/stickerBlocker/index.tsx | 1 + .../streamingCodecDisabler/index.ts | 1 + src/equicordplugins/talkInReverse/index.tsx | 3 +- src/equicordplugins/themeLibrary/index.tsx | 1 + src/equicordplugins/tidalEmbeds/index.tsx | 3 +- src/equicordplugins/tiktokTTS/index.ts | 1 + src/equicordplugins/timezones/index.tsx | 1 + src/equicordplugins/title/index.ts | 1 + .../toastNotifications/index.tsx | 1 + src/equicordplugins/toggleVideoBind/index.ts | 1 + src/equicordplugins/toneIndicators/index.tsx | 1 + src/equicordplugins/translatePlus/index.tsx | 2 + src/equicordplugins/triviaAI/index.tsx | 2 + src/equicordplugins/unitConverter/index.tsx | 2 + .../universalMention/index.tsx | 1 + .../unlimitedAccounts/index.ts | 1 + .../unreadBadgeCount/index.tsx | 1 + src/equicordplugins/urlHighlighter/index.tsx | 1 + src/equicordplugins/userpfp/index.tsx | 1 + .../VariableWithCallbacks.ts | 40 + .../components/SettingsTab.tsx | 340 +++ .../components/UserpluginInstallButton.tsx | 55 + .../userpluginInstaller.dev/index.tsx | 145 ++ .../userpluginInstaller.dev/misc/constants.ts | 28 + .../misc/pluginValidate.txt | 158 ++ .../misc/setGitPath.txt | 118 ++ .../userpluginInstaller.dev/misc/style.css | 78 + .../misc/updateValidate.txt | 129 ++ .../userpluginInstaller.dev/native.ts | 473 +++++ .../vcNarratorCustom/index.tsx | 1 + src/equicordplugins/vcPanelSettings/index.tsx | 1 + src/equicordplugins/viewRawVariant/index.tsx | 1 + src/equicordplugins/voiceButtons/index.tsx | 1 + src/equicordplugins/voiceChannelLog/index.tsx | 3 +- src/equicordplugins/voiceChatUtils/index.tsx | 1 + .../voiceJoinMessages/index.ts | 1 + .../voiceMessageTranscriber.desktop/index.tsx | 1 + src/equicordplugins/voiceRejoin/index.tsx | 1 + src/equicordplugins/waitForSlot/index.tsx | 1 + src/equicordplugins/wallpaperFree/index.tsx | 1 + src/equicordplugins/webpackTarball/index.tsx | 1 + .../whitelistedEmojis/index.tsx | 1 + src/equicordplugins/whosWatching/index.tsx | 1 + src/equicordplugins/wigglyText/index.tsx | 1 + src/equicordplugins/writeUpperCase/index.ts | 1 + src/main/utils/extensions.ts | 2 +- src/plugins/_core/supportHelper.tsx | 2 +- .../accountPanelServerProfile/index.tsx | 3 +- src/plugins/alwaysAnimate/index.ts | 1 + src/plugins/alwaysExpandRoles/index.ts | 1 + src/plugins/alwaysTrust/index.tsx | 1 + src/plugins/anonymiseFileNames/index.tsx | 2 + src/plugins/appleMusic.desktop/index.tsx | 1 + src/plugins/arRPC.web/index.tsx | 1 + .../index.ts | 1 + src/plugins/betterFolders/index.tsx | 2 +- src/plugins/betterGifAltText/index.ts | 1 + src/plugins/betterGifPicker/index.ts | 1 + src/plugins/betterNotes/index.tsx | 1 + src/plugins/betterRoleContext/index.tsx | 1 + src/plugins/betterRoleDot/index.ts | 1 + src/plugins/betterSessions/index.tsx | 2 +- src/plugins/betterSessions/styles.css | 2 - src/plugins/betterSettings/index.tsx | 1 + src/plugins/betterUploadButton/index.ts | 1 + src/plugins/biggerStreamPreview/index.tsx | 1 + src/plugins/blurNsfw/index.ts | 1 + src/plugins/callTimer/index.tsx | 1 + src/plugins/characterCounter/index.tsx | 1 + src/plugins/clearURLs/index.ts | 2 + src/plugins/clientTheme/index.tsx | 1 + src/plugins/colorSighted/index.ts | 1 + src/plugins/consoleJanitor/index.tsx | 1 + src/plugins/consoleShortcuts/index.ts | 3 +- src/plugins/copyEmojiMarkdown/index.tsx | 1 + src/plugins/copyFileContents/index.tsx | 1 + src/plugins/copyStickerLinks/index.tsx | 1 + src/plugins/copyUserURLs/index.tsx | 1 + src/plugins/crashHandler/index.ts | 2 +- src/plugins/ctrlEnterSend/index.ts | 1 + src/plugins/customCommands/index.ts | 4 +- src/plugins/customIdle/index.ts | 1 + src/plugins/customRPC/index.tsx | 1 + src/plugins/dearrow/index.tsx | 1 + src/plugins/decor/index.tsx | 1 + src/plugins/devCompanion.dev/index.tsx | 1 + src/plugins/devCompanion.dev/initWs.tsx | 2 +- src/plugins/devCompanion.dev/types/send.ts | 2 +- src/plugins/devCompanion.dev/util.tsx | 2 +- src/plugins/disableCallIdle/index.ts | 1 + src/plugins/dontRoundMyTimestamps/index.ts | 1 + src/plugins/experiments/index.tsx | 3 + src/plugins/expressionCloner/index.tsx | 5 +- src/plugins/f8break/index.ts | 1 + src/plugins/fakeNitro/index.tsx | 1 + src/plugins/fakeProfileThemes/index.tsx | 1 + src/plugins/favEmojiFirst/index.tsx | 3 +- src/plugins/favGifSearch/index.tsx | 1 + src/plugins/fixCodeblockGap/index.ts | 1 + src/plugins/fixImagesQuality/index.tsx | 1 + .../fixSpotifyEmbeds.desktop/index.tsx | 1 + .../fixYoutubeEmbeds.desktop/index.tsx | 1 + .../fixYoutubeEmbeds.desktop/native.ts | 2 +- src/plugins/forceOwnerCrown/index.ts | 1 + src/plugins/friendInvites/index.ts | 2 + src/plugins/friendsSince/index.tsx | 1 + src/plugins/fullSearchContext/index.tsx | 1 + src/plugins/fullUserInChatbox/index.tsx | 1 + src/plugins/gameActivityToggle/index.tsx | 3 +- src/plugins/gifPaste/index.ts | 1 + src/plugins/greetStickerPicker/index.tsx | 1 + src/plugins/hideAttachments/index.tsx | 3 +- src/plugins/iLoveSpam/index.ts | 1 + src/plugins/ignoreActivities/index.tsx | 1 + src/plugins/imageFilename/index.ts | 1 + src/plugins/imageLink/index.ts | 1 + src/plugins/imageZoom/index.tsx | 3 +- src/plugins/implicitRelationships/index.ts | 27 +- src/plugins/ircColors/index.ts | 1 + src/plugins/keepCurrentChannel/index.ts | 1 + src/plugins/lastfmRichPresence/index.tsx | 1 + src/plugins/loadingQuotes/index.ts | 1 + src/plugins/memberCount/index.tsx | 1 + src/plugins/mentionAvatars/index.tsx | 1 + src/plugins/messageClickActions/index.ts | 1 + src/plugins/messageLatency/index.tsx | 1 + src/plugins/messageLinkEmbeds/index.tsx | 1 + src/plugins/messageLogger/index.tsx | 1 + src/plugins/moreQuickReactions/index.ts | 1 + src/plugins/mutualGroupDMs/index.tsx | 3 +- src/plugins/newGuildSettings/index.tsx | 3 +- src/plugins/noBlockedMessages/index.ts | 1 + src/plugins/noDeepLinks.web/index.ts | 1 + src/plugins/noDevtoolsWarning/index.ts | 1 + src/plugins/noF1/index.ts | 1 + src/plugins/noMaskedUrlPaste/index.ts | 1 + src/plugins/noMosaic/index.ts | 3 +- src/plugins/noOnboardingDelay/index.ts | 1 + src/plugins/noPendingCount/index.ts | 1 + src/plugins/noProfileThemes/index.ts | 1 + src/plugins/noReplyMention/index.tsx | 1 + src/plugins/noServerEmojis/index.ts | 1 + .../noSystemBadge.discordDesktop/index.ts | 1 + src/plugins/noTypingAnimation/index.ts | 1 + src/plugins/noUnblockToJump/index.ts | 1 + src/plugins/notificationVolume/index.ts | 1 + src/plugins/onePingPerDM/index.ts | 3 +- src/plugins/openInApp/index.ts | 1 + src/plugins/overrideForumDefaults/index.tsx | 1 + src/plugins/pauseInvitesForever/index.tsx | 3 +- src/plugins/permissionFreeWill/index.ts | 1 + src/plugins/permissionsViewer/index.tsx | 1 + src/plugins/petpet/index.ts | 2 + src/plugins/pictureInPicture/index.tsx | 1 + src/plugins/pinDms/index.tsx | 1 + src/plugins/plainFolderIcon/index.ts | 1 + src/plugins/platformIndicators/index.tsx | 2 + src/plugins/previewMessage/index.tsx | 2 + src/plugins/quickMention/index.tsx | 2 + src/plugins/quickReply/index.ts | 1 + src/plugins/reactErrorDecoder/index.ts | 3 +- .../readAllNotificationsButton/index.tsx | 1 + src/plugins/relationshipNotifier/index.ts | 1 + src/plugins/replaceGoogleSearch/index.tsx | 1 + src/plugins/replyTimestamp/index.tsx | 1 + src/plugins/revealAllSpoilers/index.ts | 2 +- src/plugins/reverseImageSearch/index.tsx | 3 +- src/plugins/reviewDB/index.tsx | 2 + src/plugins/roleColorEverywhere/index.tsx | 1 + src/plugins/secretRingTone/index.ts | 1 + src/plugins/seeSummaries/index.tsx | 1 + src/plugins/sendTimestamps/index.tsx | 2 + src/plugins/serverInfo/index.tsx | 3 +- src/plugins/serverListIndicators/index.tsx | 1 + src/plugins/shikiCodeblocks.desktop/index.ts | 1 + src/plugins/showConnections/index.tsx | 1 + src/plugins/showHiddenChannels/index.tsx | 1 + src/plugins/showHiddenThings/index.ts | 3 +- src/plugins/showMeYourName/index.tsx | 5 +- src/plugins/showTimeoutDuration/index.tsx | 1 + src/plugins/silentMessageToggle/index.tsx | 2 + src/plugins/silentTyping/index.tsx | 4 +- src/plugins/sortFriendRequests/index.tsx | 1 + src/plugins/spotifyCrack/index.ts | 1 + src/plugins/spotifyShareCommands/index.ts | 2 + src/plugins/startupTimings/index.tsx | 1 + src/plugins/stickerPaste/index.ts | 1 + src/plugins/streamerModeOnStream/index.ts | 1 + src/plugins/superReactionTweaks/index.ts | 1 + src/plugins/textReplace/index.tsx | 5 +- src/plugins/themeAttributes/index.ts | 1 + src/plugins/translate/index.tsx | 2 + src/plugins/typingIndicator/index.tsx | 1 + src/plugins/typingTweaks/index.tsx | 1 + src/plugins/unindent/index.ts | 2 + src/plugins/unlockedAvatarZoom/index.ts | 1 + src/plugins/unsuppressEmbeds/index.tsx | 1 + src/plugins/userMessagesPronouns/index.ts | 1 + src/plugins/userVoiceShow/index.tsx | 2 + src/plugins/usrbg/index.tsx | 1 + src/plugins/validReply/index.ts | 1 + src/plugins/validUser/index.tsx | 3 +- src/plugins/vcDoubleClick/index.ts | 1 + src/plugins/vcNarrator/index.tsx | 1 + src/plugins/viewIcons/index.tsx | 9 +- src/plugins/viewRaw/index.tsx | 2 + src/plugins/voiceDownload/index.tsx | 1 + src/plugins/voiceMessages/index.tsx | 8 +- src/plugins/volumeBooster/index.ts | 1 + src/plugins/webContextMenus.web/index.ts | 1 + src/plugins/webKeybinds.web/index.ts | 1 + src/plugins/webScreenShareFixes.web/index.ts | 1 + src/plugins/whoReacted/index.tsx | 1 + src/plugins/xsOverlay/index.tsx | 3 +- src/plugins/youtubeAdblock.desktop/index.ts | 1 + src/utils/text.ts | 1 - src/utils/types.ts | 31 +- src/webpack/common/components.ts | 2 +- src/webpack/patchWebpack.ts | 4 +- src/webpack/webpack.ts | 2 +- 401 files changed, 3398 insertions(+), 988 deletions(-) create mode 100644 src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts create mode 100644 src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx create mode 100644 src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx create mode 100644 src/equicordplugins/userpluginInstaller.dev/index.tsx create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/constants.ts create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/style.css create mode 100644 src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt create mode 100644 src/equicordplugins/userpluginInstaller.dev/native.ts diff --git a/package.json b/package.json index ba30c00f3..cd9f7f0cc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "equicord", "private": "true", - "version": "1.14.6.2", + "version": "1.14.7.0", "description": "The other cutest Discord client mod", "homepage": "https://github.com/Equicord/Equicord#readme", "bugs": { @@ -54,47 +54,47 @@ "gifenc": "github:mattdesl/gifenc#64842fca317b112a8590f8fef2bf3825da8f6fe3", "idb": "8.0.3", "jsqr": "1.4.0", - "monaco-editor": "^0.54.0", + "monaco-editor": "^0.55.1", "nanoid": "^5.1.6", "native-file-system-adapter": "^3.0.1", "usercss-meta": "^0.12.0", - "virtual-merge": "^1.0.1" + "virtual-merge": "^1.0.1", + "yaml-js": "^0.3.1" }, "devDependencies": { - "@electron/asar": "^4.0.1", - "@stylistic/eslint-plugin": "^5.6.0", - "@types/adm-zip": "^0.5.7", - "@types/chrome": "^0.1.30", - "@types/diff": "^7.0.2", - "@types/lodash": "^4.17.20", - "@types/node": "^24.10.1", + "@electron/asar": "^4.2.0", + "@stylistic/eslint-plugin": "^5.10.0", + "@types/chrome": "^0.1.40", + "@types/lodash": "^4.17.24", + "@types/node": "^25.6.0", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", - "@types/yazl": "^3.3.0", + "@types/yazl": "^3.3.1", "@vencord/discord-types": "link:packages/discord-types", - "diff": "^8.0.2", - "esbuild": "^0.27.0", - "eslint": "9.39.1", + "diff": "^9.0.0", + "esbuild": "^0.28.0", + "eslint": "10.2.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-simple-header": "^1.2.1", - "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-unused-imports": "^4.3.0", + "eslint-plugin-simple-import-sort": "^13.0.0", + "eslint-plugin-unused-imports": "^4.4.1", "highlight.js": "11.11.1", "html-minifier-terser": "^7.2.0", "moment": "^2.22.2", "p-limit": "^7.3.0", - "puppeteer-core": "^24.30.0", - "standalone-electron-types": "^34.2.0", - "stylelint": "^16.25.0", - "stylelint-config-standard": "^39.0.1", + "puppeteer-core": "^24.41.0", + "standalone-electron-types": "^41.2.1", + "stylelint": "^17.8.0", + "stylelint-config-standard": "^40.0.0", + "svgo": "^4.0.1", "ts-patch": "^3.3.0", - "ts-pattern": "^5.6.0", - "tsx": "^4.20.6", - "type-fest": "^5.2.0", - "typescript": "^5.9.3", - "typescript-eslint": "^8.47.0", - "typescript-transform-paths": "^3.5.5", + "ts-pattern": "^5.9.0", + "tsx": "^4.21.0", + "type-fest": "^5.5.0", + "typescript": "^6.0.2", + "typescript-eslint": "^8.58.2", + "typescript-transform-paths": "^3.5.6", "zip-local": "^0.3.5" }, "packageManager": "pnpm@10.33.0", @@ -125,4 +125,4 @@ "engines": { "node": ">=18" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb2eba634..53ca76f94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,7 +27,7 @@ importers: version: 0.1.2 '@song-spotlight/api': specifier: ^2.1.3 - version: 2.1.3(typescript@5.9.3) + version: 2.1.3(typescript@6.0.2) '@streamparser/json': specifier: ^0.0.22 version: 0.0.22 @@ -59,8 +59,8 @@ importers: specifier: 1.4.0 version: 1.4.0 monaco-editor: - specifier: ^0.54.0 - version: 0.54.0 + specifier: ^0.55.1 + version: 0.55.1 nanoid: specifier: ^5.1.6 version: 5.1.6 @@ -73,28 +73,25 @@ importers: virtual-merge: specifier: ^1.0.1 version: 1.0.2 + yaml-js: + specifier: ^0.3.1 + version: 0.3.1 devDependencies: '@electron/asar': - specifier: ^4.0.1 - version: 4.0.1 + specifier: ^4.2.0 + version: 4.2.0 '@stylistic/eslint-plugin': - specifier: ^5.6.0 - version: 5.6.0(eslint@9.39.1) - '@types/adm-zip': - specifier: ^0.5.7 - version: 0.5.7 + specifier: ^5.10.0 + version: 5.10.0(eslint@10.2.0) '@types/chrome': - specifier: ^0.1.30 - version: 0.1.30 - '@types/diff': - specifier: ^7.0.2 - version: 7.0.2 + specifier: ^0.1.40 + version: 0.1.40 '@types/lodash': - specifier: ^4.17.20 - version: 4.17.20 + specifier: ^4.17.24 + version: 4.17.24 '@types/node': - specifier: ^24.10.1 - version: 24.10.1 + specifier: ^25.6.0 + version: 25.6.0 '@types/react': specifier: ^19.0.10 version: 19.0.12 @@ -102,35 +99,35 @@ importers: specifier: ^19.0.4 version: 19.0.4(@types/react@19.0.12) '@types/yazl': - specifier: ^3.3.0 - version: 3.3.0 + specifier: ^3.3.1 + version: 3.3.1 '@vencord/discord-types': specifier: link:packages/discord-types version: link:packages/discord-types diff: - specifier: ^8.0.2 - version: 8.0.2 + specifier: ^9.0.0 + version: 9.0.0 esbuild: - specifier: ^0.27.0 - version: 0.27.0 + specifier: ^0.28.0 + version: 0.28.0 eslint: - specifier: 9.39.1 - version: 9.39.1 + specifier: 10.2.0 + version: 10.2.0 eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)) + version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.1) + version: 7.37.5(eslint@10.2.0) eslint-plugin-simple-header: specifier: ^1.2.1 - version: 1.2.2(eslint@9.39.1) + version: 1.2.2(eslint@10.2.0) eslint-plugin-simple-import-sort: - specifier: ^12.1.1 - version: 12.1.1(eslint@9.39.1) + specifier: ^13.0.0 + version: 13.0.0(eslint@10.2.0) eslint-plugin-unused-imports: - specifier: ^4.3.0 - version: 4.3.0(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + specifier: ^4.4.1 + version: 4.4.1(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -144,38 +141,41 @@ importers: specifier: ^7.3.0 version: 7.3.0 puppeteer-core: - specifier: ^24.30.0 - version: 24.30.0 + specifier: ^24.41.0 + version: 24.41.0 standalone-electron-types: - specifier: ^34.2.0 - version: 34.2.0 + specifier: ^41.2.1 + version: 41.2.1 stylelint: - specifier: ^16.25.0 - version: 16.25.0(typescript@5.9.3) + specifier: ^17.8.0 + version: 17.8.0(typescript@6.0.2) stylelint-config-standard: - specifier: ^39.0.1 - version: 39.0.1(stylelint@16.25.0(typescript@5.9.3)) + specifier: ^40.0.0 + version: 40.0.0(stylelint@17.8.0(typescript@6.0.2)) + svgo: + specifier: ^4.0.1 + version: 4.0.1 ts-patch: specifier: ^3.3.0 version: 3.3.0 ts-pattern: - specifier: ^5.6.0 - version: 5.6.2 + specifier: ^5.9.0 + version: 5.9.0 tsx: - specifier: ^4.20.6 - version: 4.20.6 + specifier: ^4.21.0 + version: 4.21.0 type-fest: - specifier: ^5.2.0 - version: 5.2.0 + specifier: ^5.5.0 + version: 5.5.0 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.2 + version: 6.0.2 typescript-eslint: - specifier: ^8.47.0 - version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) + specifier: ^8.58.2 + version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) typescript-transform-paths: - specifier: ^3.5.5 - version: 3.5.5(typescript@5.9.3) + specifier: ^3.5.6 + version: 3.5.6(typescript@6.0.2) zip-local: specifier: ^0.3.5 version: 0.3.5 @@ -246,40 +246,58 @@ packages: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@cacheable/memory@2.0.5': - resolution: {integrity: sha512-fkiAxCvssEyJZ5fxX4tcdZFRmW9JehSTGvvqmXn6rTzG5cH6V/3C4ad8yb01vOjp2xBydHkHrgpW0qeGtzt6VQ==} + '@cacheable/memory@2.0.8': + resolution: {integrity: sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==} - '@cacheable/utils@2.3.1': - resolution: {integrity: sha512-38NJXjIr4W1Sghun8ju+uYWD8h2c61B4dKwfnQHVDFpAJ9oS28RpfqZQJ6Dgd3RceGkILDY9YT+72HJR3LoeSQ==} + '@cacheable/utils@2.4.1': + resolution: {integrity: sha512-eiFgzCbIneyMlLOmNG4g9xzF7Hv3Mga4LjxjcSC/ues6VYq2+gUbQI8JqNuw/ZM8tJIeIaBGpswAsqV2V7ApgA==} - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} - - '@csstools/media-query-list-parser@4.0.3': - resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} - engines: {node: '>=18'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-tokenizer': ^4.0.0 - '@csstools/selector-specificity@5.0.0': - resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} peerDependencies: - postcss-selector-parser: ^7.0.0 + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@dual-bundle/import-meta-resolve@4.2.1': - resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} - '@electron/asar@4.0.1': - resolution: {integrity: sha512-F4Ykm1jiBGY1WV/o8Q8oFW8Nq0u+S2/vPujzNJtdSJ6C4LHC4CiGLn7c17s7SolZ23gcvCebMncmZtNc+MkxPQ==} + '@csstools/media-query-list-parser@5.0.0': + resolution: {integrity: sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/selector-resolve-nested@4.0.0': + resolution: {integrity: sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 + + '@csstools/selector-specificity@6.0.0': + resolution: {integrity: sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 + + '@electron/asar@4.2.0': + resolution: {integrity: sha512-npW1NW5yy8EB9XY/vEw9sUdgmq0sJEhmSBb6bqyFOAw1CSkrhvAvO6QWlW8CdIMo8VN1lkdF345l/MeW0LrY0Q==} engines: {node: '>=22.12.0'} hasBin: true @@ -295,6 +313,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.1': resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} engines: {node: '>=18'} @@ -307,6 +331,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.1': resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} engines: {node: '>=18'} @@ -319,6 +349,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.1': resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} engines: {node: '>=18'} @@ -331,6 +367,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.1': resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} engines: {node: '>=18'} @@ -343,6 +385,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.1': resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} engines: {node: '>=18'} @@ -355,6 +403,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.1': resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} engines: {node: '>=18'} @@ -367,6 +421,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.1': resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} engines: {node: '>=18'} @@ -379,6 +439,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.1': resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} engines: {node: '>=18'} @@ -391,6 +457,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.1': resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} engines: {node: '>=18'} @@ -403,6 +475,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.1': resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} engines: {node: '>=18'} @@ -415,6 +493,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.1': resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} engines: {node: '>=18'} @@ -427,6 +511,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.1': resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} engines: {node: '>=18'} @@ -439,6 +529,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.1': resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} engines: {node: '>=18'} @@ -451,6 +547,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.1': resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} engines: {node: '>=18'} @@ -463,6 +565,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.1': resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} engines: {node: '>=18'} @@ -475,6 +583,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.1': resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} engines: {node: '>=18'} @@ -487,6 +601,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.1': resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} @@ -499,6 +619,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.1': resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} engines: {node: '>=18'} @@ -511,6 +637,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.1': resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} @@ -523,6 +655,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.1': resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} engines: {node: '>=18'} @@ -535,12 +673,24 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.0': resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.1': resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} engines: {node: '>=18'} @@ -553,6 +703,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.1': resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} engines: {node: '>=18'} @@ -565,6 +721,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.1': resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} engines: {node: '>=18'} @@ -577,6 +739,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.1': resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} engines: {node: '>=18'} @@ -589,43 +757,47 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@ffmpeg/ffmpeg@0.12.10': resolution: {integrity: sha512-lVtk8PW8e+NUzGZhPTWj2P1J4/NyuCrbDD3O9IGpSeLYtUZKBqZO8CNj1WYGghep/MXoM8e1qVY1GztTkf8YYQ==} @@ -662,18 +834,6 @@ packages: '@intrnl/xxhash64@0.1.2': resolution: {integrity: sha512-1+lx7j99fdph+uy3EnjQyr39KQZ7LP56+aWOr6finJWpgYpvb7XrhFUqDwnEk/wpPC98nCjAT6RulpW3crWjlg==} - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -695,11 +855,11 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@keyv/bigmap@1.3.0': - resolution: {integrity: sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} peerDependencies: - keyv: ^5.5.4 + keyv: ^5.6.0 '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} @@ -716,14 +876,18 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@puppeteer/browsers@2.10.13': - resolution: {integrity: sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==} + '@puppeteer/browsers@2.13.0': + resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} engines: {node: '>=18'} hasBin: true '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@song-spotlight/api@2.1.3': resolution: {integrity: sha512-Wai7JHd9lrHtM/lkhfWQIFjIWKtP8iD+zj4Lnwbs/ykELR0MB2k56TDnQaRAelvu8XOygt27wfDBDQSEepPqdA==} peerDependencies: @@ -732,27 +896,27 @@ packages: '@streamparser/json@0.0.22': resolution: {integrity: sha512-b6gTSBjJ8G8SuO3Gbbj+zXbVx8NSs1EbpbMKpzGLWMdkR+98McH9bEjSz3+0mPJf68c5nxa3CrJHp5EQNXM6zQ==} - '@stylistic/eslint-plugin@5.6.0': - resolution: {integrity: sha512-owEc4B8ME+O/xyZOkLVyLqPMsUgJXIM4XzCm5Vt3WvRXpyoOfYxgA+JkEiFqXPCI8+Nc2BzAT+KGAK7QleGs8Q==} + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=9.0.0' + eslint: ^9.0.0 || ^10.0.0 '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/adm-zip@0.5.7': - resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} + '@types/chrome@0.1.40': + resolution: {integrity: sha512-UnfyRAe8ORu9HSuTH0EqyOEUin3JrWW9Nl/gDXezNfTUrfIoxw+WRZgKOxGz0t5BnjbfXBnS2eCYfW2PxH1wcA==} - '@types/chrome@0.1.30': - resolution: {integrity: sha512-rcP14i+ip4s3SLG6JzNOWIDd+0i8Bg+kBslHl8d4g6m/e2kEbWnR90AtlOPUZj9ONVRbKxnQUqsInxFzXyqLdA==} - - '@types/diff@7.0.2': - resolution: {integrity: sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/filesystem@0.0.36': resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} @@ -780,14 +944,14 @@ packages: '@types/lodash@4.17.15': resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} - '@types/lodash@4.17.20': - resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + '@types/lodash@4.17.24': + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} '@types/node@22.13.13': resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@types/react-dom@19.0.4': resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} @@ -803,69 +967,72 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@types/yazl@3.3.0': - resolution: {integrity: sha512-mFL6lGkk2N5u5nIxpNV/K5LW3qVSbxhJrMxYGOOxZndWxMgCamr/iCsq/1t9kd8pEwhuNP91LC5qZm/qS9pOEw==} + '@types/yazl@3.3.1': + resolution: {integrity: sha512-DIWfCKpsTp6hE5BDBHV3+fIL/bLUF9Bv13iDrWnMlmhQpH67buNvI291ZauQ1xcccxK3FqQ9honnXpq4R8NMuQ==} - '@typescript-eslint/eslint-plugin@8.47.0': - resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} + '@typescript-eslint/eslint-plugin@8.58.2': + resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.47.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.58.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.47.0': - resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} + '@typescript-eslint/parser@8.58.2': + resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.47.0': - resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} + '@typescript-eslint/project-service@8.58.2': + resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.47.0': - resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} + '@typescript-eslint/scope-manager@8.58.2': + resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.47.0': - resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} + '@typescript-eslint/tsconfig-utils@8.58.2': + resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.47.0': - resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} + '@typescript-eslint/type-utils@8.58.2': + resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.47.0': - resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} + '@typescript-eslint/types@8.58.2': + resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.47.0': - resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} + '@typescript-eslint/typescript-estree@8.58.2': + resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.47.0': - resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} + '@typescript-eslint/utils@8.58.2': + resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.47.0': - resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} + '@typescript-eslint/visitor-keys@8.58.2': + resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vap/core@0.0.12': @@ -894,12 +1061,17 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -920,10 +1092,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -939,10 +1107,6 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} @@ -996,8 +1160,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@2.0.0: - resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} bare-events@2.5.4: resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} @@ -1032,7 +1197,10 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade + deprecated: Security vulnerability fixed in 5.2.1, please upgrade + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -1040,6 +1208,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1050,8 +1222,8 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - cacheable@2.2.0: - resolution: {integrity: sha512-LEJxRqfeomiiRd2t0uON6hxAtgOoWDfY3fugebbz+J3vDLO+SkdfFChQcOHTZhj9SYa9iwE9MGYNX72dKiOE4w==} + cacheable@2.3.4: + resolution: {integrity: sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -1080,8 +1252,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chromium-bidi@11.0.0: - resolution: {integrity: sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==} + chromium-bidi@14.0.0: + resolution: {integrity: sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==} peerDependencies: devtools-protocol: '*' @@ -1113,6 +1285,10 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -1123,8 +1299,8 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1136,19 +1312,38 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-functions-list@3.2.3: - resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} - engines: {node: '>=12 || >=16'} + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} css-tree@3.1.0: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1176,15 +1371,6 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1209,23 +1395,32 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - devtools-protocol@0.0.1521046: - resolution: {integrity: sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==} + devtools-protocol@0.0.1595872: + resolution: {integrity: sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==} - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dompurify@3.1.7: - resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -1234,15 +1429,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -1303,6 +1492,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -1371,23 +1565,23 @@ packages: peerDependencies: eslint: '>=8.41.0' - eslint-plugin-simple-import-sort@12.1.1: - resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} + eslint-plugin-simple-import-sort@13.0.0: + resolution: {integrity: sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==} peerDependencies: eslint: '>=5.0.0' - eslint-plugin-unused-imports@4.3.0: - resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} + eslint-plugin-unused-imports@4.4.1: + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^9.0.0 || ^8.0.0 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -1397,9 +1591,13 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.2.0: + resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -1411,13 +1609,17 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1469,6 +1671,15 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -1476,8 +1687,8 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@10.1.4: - resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} + file-entry-cache@11.1.2: + resolution: {integrity: sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -1495,20 +1706,19 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.19: - resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} + flat-cache@6.1.22: + resolution: {integrity: sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug==} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - fs-extra@11.3.0: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} @@ -1532,6 +1742,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1567,10 +1781,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@11.0.3: - resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} - engines: {node: 20 || >=22} - hasBin: true + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} @@ -1584,17 +1797,13 @@ packages: resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==} engines: {node: '>=16'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@16.2.0: + resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} + engines: {node: '>=20'} globjoin@0.1.4: resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} @@ -1606,9 +1815,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -1620,6 +1826,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} + has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -1635,8 +1845,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hashery@1.2.0: - resolution: {integrity: sha512-43XJKpwle72Ik5Zpam7MuzRWyNdwwdf6XHlh8wCj2PggvWf+v/Dm5B0dxGZOmddidgeO6Ofu9As/o231Ti/9PA==} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} engines: {node: '>=20'} hasown@2.0.2: @@ -1647,17 +1857,20 @@ packages: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} - hookified@1.13.0: - resolution: {integrity: sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.1.1: + resolution: {integrity: sha512-AHb76R16GB5EsPBE2J7Ko5kiEyXwviB9P5SMrAKcuAu4vJPZttViAbj9+tZeaQE5zjDme+1vcHP78Yj/WoAveA==} html-minifier-terser@7.2.0: resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} + html-tags@5.1.0: + resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} + engines: {node: '>=20.10'} http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} @@ -1674,10 +1887,6 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - ignore@7.0.3: - resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} - engines: {node: '>= 4'} - ignore@7.0.5: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} @@ -1686,6 +1895,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1776,6 +1988,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -1830,10 +2046,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1882,16 +2094,13 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.4: - resolution: {integrity: sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.37.0: - resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1903,9 +2112,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -1916,8 +2122,8 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@11.2.1: - resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} + lru-cache@11.3.5: + resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} lru-cache@7.18.3: @@ -1933,15 +2139,21 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mathml-tag-names@2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + mathml-tag-names@4.0.0: + resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1951,9 +2163,9 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1968,8 +2180,8 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} mitt@3.0.1: @@ -1978,8 +2190,8 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - monaco-editor@0.54.0: - resolution: {integrity: sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==} + monaco-editor@0.55.1: + resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2017,6 +2229,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2080,9 +2295,6 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -2111,13 +2323,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -2133,28 +2341,29 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-resolve-nested-selector@0.1.6: - resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - postcss-safe-parser@7.0.1: resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} engines: {node: '>=18.0'} peerDependencies: postcss: ^8.4.31 - postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2182,8 +2391,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.30.0: - resolution: {integrity: sha512-2S3Smy0t0W4wJnNvDe7W0bE7wDmZjfZ3ljfMgJd6hn2Hq/f0jgN+x9PULZo2U3fu5UUIJ+JP8cNUGllu8P91Pg==} + puppeteer-core@24.41.0: + resolution: {integrity: sha512-rLIUri7E/NQ3APSEYCCozaSJx0u8Tu9wxO6BJwnvXmIgILSK3L0TombaVh3izp1njAGrO6H2ru0hcIrLF+gWLw==} engines: {node: '>=18'} q@1.5.1: @@ -2194,8 +2403,8 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qified@0.5.2: - resolution: {integrity: sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==} + qified@0.9.1: + resolution: {integrity: sha512-n7mar4T0xQ+39dE2vGTAlbxUEpndwPANH0kDef1/MYsB8Bba9wshkybIRx74qgcvKQPEWErf9AqAdYjhzY2Ilg==} engines: {node: '>=20'} queue-microtask@1.2.3: @@ -2228,10 +2437,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -2267,6 +2472,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2276,13 +2485,13 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true @@ -2326,9 +2535,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} @@ -2360,8 +2569,8 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - standalone-electron-types@34.2.0: - resolution: {integrity: sha512-+BIrNe0TdZBBBRS3G/F7cPbuBipSZylSjSrJu9+sjw84+vz36a5oZ7l9NeH7aXgMWmPzPZKsTm+K0nOIvhENJQ==} + standalone-electron-types@41.2.1: + resolution: {integrity: sha512-0NAQpGYvxpqZ87SNaWyJhmgmIZ3vkPkES01j3etqSoRepINU/LpNy9bk4Pyp/4me6rCs11jPoWqzQCEn+e+d6Q==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -2374,9 +2583,9 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} @@ -2409,27 +2618,27 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - stylelint-config-recommended@17.0.0: - resolution: {integrity: sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==} - engines: {node: '>=18.12.0'} + stylelint-config-recommended@18.0.0: + resolution: {integrity: sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==} + engines: {node: '>=20.19.0'} peerDependencies: - stylelint: ^16.23.0 + stylelint: ^17.0.0 - stylelint-config-standard@39.0.1: - resolution: {integrity: sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A==} - engines: {node: '>=18.12.0'} + stylelint-config-standard@40.0.0: + resolution: {integrity: sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==} + engines: {node: '>=20.19.0'} peerDependencies: - stylelint: ^16.23.0 + stylelint: ^17.0.0 - stylelint@16.25.0: - resolution: {integrity: sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==} - engines: {node: '>=18.12.0'} + stylelint@17.8.0: + resolution: {integrity: sha512-oHkld9T60LDSaUQ4CSVc+tlt9eUoDlxhaGWShsUCKyIL14boZfmK5bSphZqx64aiC5tCqX+BsQMTMoSz8D1zIg==} + engines: {node: '>=20.19.0'} hasBin: true + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -2438,9 +2647,9 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-hyperlinks@3.2.0: - resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} - engines: {node: '>=14.18'} + supports-hyperlinks@4.4.0: + resolution: {integrity: sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==} + engines: {node: '>=20'} supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -2449,6 +2658,11 @@ packages: svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} @@ -2471,12 +2685,16 @@ packages: text-decoder@1.1.1: resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2488,6 +2706,9 @@ packages: ts-pattern@5.6.2: resolution: {integrity: sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==} + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2502,8 +2723,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tsx@4.20.6: - resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true @@ -2519,8 +2740,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.2.0: - resolution: {integrity: sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==} + type-fest@5.5.0: + resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} engines: {node: '>=20'} typed-array-buffer@1.0.3: @@ -2539,23 +2760,23 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + typed-query-selector@2.12.1: + resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} - typescript-eslint@8.47.0: - resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} + typescript-eslint@8.58.2: + resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - typescript-transform-paths@3.5.5: - resolution: {integrity: sha512-RMK86wKe/4+ad+3kMT9SKAs3K0tUHLe7hF+MLbD6VpC9VUmFuKorhf3pHz+qO5GdS4mUp2ncNUo14j6ws9UvBQ==} + typescript-transform-paths@3.5.6: + resolution: {integrity: sha512-3eQTG6Ogt+pgPEh45uX2s9OwcfAVjWnyNO+osjYcOqYaWDVMIFUkqW8e0O1cOaVwdMqQFQf6alDT+76xmeS2Ag==} peerDependencies: typescript: '>=3.6.5' - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} engines: {node: '>=14.17'} hasBin: true @@ -2566,8 +2787,12 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -2596,8 +2821,8 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webdriver-bidi-protocol@0.3.8: - resolution: {integrity: sha512-21Yi2GhGntMc671vNBCjiAeEVknXjVRoyu+k+9xOMShu+ZQfpGQwnBqbNz/Sv4GXZ6JmutlPAi2nIJcrymAWuQ==} + webdriver-bidi-protocol@0.4.1: + resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} @@ -2641,19 +2866,15 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2668,6 +2889,10 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yaml-js@0.3.1: + resolution: {integrity: sha512-LjoIFHCtSfkGzPsmYmfDsW+TShtQBcY7lwH1yLQ5brJHXRhjteUnVE2ThCbz1madq8JUZIAjFiavfnIFeTO8CQ==} + engines: {node: '>=8'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -2712,40 +2937,51 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@cacheable/memory@2.0.5': + '@cacheable/memory@2.0.8': dependencies: - '@cacheable/utils': 2.3.1 - '@keyv/bigmap': 1.3.0(keyv@5.5.4) - hookified: 1.13.0 - keyv: 5.5.4 + '@cacheable/utils': 2.4.1 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 - '@cacheable/utils@2.3.1': + '@cacheable/utils@2.4.1': dependencies: - hashery: 1.2.0 - keyv: 5.5.4 + hashery: 1.5.1 + keyv: 5.6.0 - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-tokenizer@3.0.4': {} - - '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-tokenizer': 4.0.0 - '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@csstools/media-query-list-parser@5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - postcss-selector-parser: 7.1.0 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@dual-bundle/import-meta-resolve@4.2.1': {} + '@csstools/selector-resolve-nested@4.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 - '@electron/asar@4.0.1': + '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 + + '@electron/asar@4.2.0': dependencies: commander: 13.1.0 - glob: 11.0.3 - minimatch: 10.0.3 + glob: 13.0.6 + minimatch: 10.2.5 '@esbuild/aix-ppc64@0.25.1': optional: true @@ -2753,197 +2989,264 @@ snapshots: '@esbuild/aix-ppc64@0.27.0': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + '@esbuild/android-arm64@0.25.1': optional: true '@esbuild/android-arm64@0.27.0': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + '@esbuild/android-arm@0.25.1': optional: true '@esbuild/android-arm@0.27.0': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + '@esbuild/android-x64@0.25.1': optional: true '@esbuild/android-x64@0.27.0': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + '@esbuild/darwin-arm64@0.25.1': optional: true '@esbuild/darwin-arm64@0.27.0': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + '@esbuild/darwin-x64@0.25.1': optional: true '@esbuild/darwin-x64@0.27.0': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + '@esbuild/freebsd-arm64@0.25.1': optional: true '@esbuild/freebsd-arm64@0.27.0': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + '@esbuild/freebsd-x64@0.25.1': optional: true '@esbuild/freebsd-x64@0.27.0': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + '@esbuild/linux-arm64@0.25.1': optional: true '@esbuild/linux-arm64@0.27.0': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + '@esbuild/linux-arm@0.25.1': optional: true '@esbuild/linux-arm@0.27.0': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + '@esbuild/linux-ia32@0.25.1': optional: true '@esbuild/linux-ia32@0.27.0': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + '@esbuild/linux-loong64@0.25.1': optional: true '@esbuild/linux-loong64@0.27.0': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + '@esbuild/linux-mips64el@0.25.1': optional: true '@esbuild/linux-mips64el@0.27.0': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + '@esbuild/linux-ppc64@0.25.1': optional: true '@esbuild/linux-ppc64@0.27.0': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + '@esbuild/linux-riscv64@0.25.1': optional: true '@esbuild/linux-riscv64@0.27.0': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + '@esbuild/linux-s390x@0.25.1': optional: true '@esbuild/linux-s390x@0.27.0': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + '@esbuild/linux-x64@0.25.1': optional: true '@esbuild/linux-x64@0.27.0': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.25.1': optional: true '@esbuild/netbsd-arm64@0.27.0': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + '@esbuild/netbsd-x64@0.25.1': optional: true '@esbuild/netbsd-x64@0.27.0': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.25.1': optional: true '@esbuild/openbsd-arm64@0.27.0': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + '@esbuild/openbsd-x64@0.25.1': optional: true '@esbuild/openbsd-x64@0.27.0': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + '@esbuild/openharmony-arm64@0.27.0': optional: true + '@esbuild/openharmony-arm64@0.28.0': + optional: true + '@esbuild/sunos-x64@0.25.1': optional: true '@esbuild/sunos-x64@0.27.0': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + '@esbuild/win32-arm64@0.25.1': optional: true '@esbuild/win32-arm64@0.27.0': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + '@esbuild/win32-ia32@0.25.1': optional: true '@esbuild/win32-ia32@0.27.0': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + '@esbuild/win32-x64@0.25.1': optional: true '@esbuild/win32-x64@0.27.0': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@esbuild/win32-x64@0.28.0': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@10.2.0)': dependencies: - eslint: 9.39.1 + eslint: 10.2.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/config-array@0.21.1': + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': dependencies: - '@eslint/object-schema': 2.1.7 - debug: 4.4.1 - minimatch: 3.1.2 + eslint: 10.2.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': dependencies: - ajv: 6.12.6 - debug: 4.4.1 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.1 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.1': {} - - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@ffmpeg/ffmpeg@0.12.10': @@ -2969,21 +3272,6 @@ snapshots: '@intrnl/xxhash64@0.1.2': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -3006,11 +3294,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@keyv/bigmap@1.3.0(keyv@5.5.4)': + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: - hashery: 1.2.0 - hookified: 1.13.0 - keyv: 5.5.4 + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 '@keyv/serialize@1.1.1': {} @@ -3026,13 +3314,13 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@puppeteer/browsers@2.10.13': + '@puppeteer/browsers@2.13.0': dependencies: debug: 4.4.3 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.3 + semver: 7.7.4 tar-fs: 3.1.1 yargs: 17.7.2 transitivePeerDependencies: @@ -3041,19 +3329,21 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@song-spotlight/api@2.1.3(typescript@5.9.3)': + '@sindresorhus/merge-streams@4.0.0': {} + + '@song-spotlight/api@2.1.3(typescript@6.0.2)': dependencies: - typescript: 5.9.3 + typescript: 6.0.2 optionalDependencies: zod: 4.3.6 '@streamparser/json@0.0.22': {} - '@stylistic/eslint-plugin@5.6.0(eslint@9.39.1)': + '@stylistic/eslint-plugin@5.10.0(eslint@10.2.0)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/types': 8.47.0 - eslint: 9.39.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@typescript-eslint/types': 8.58.2 + eslint: 10.2.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -3061,19 +3351,17 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/adm-zip@0.5.7': - dependencies: - '@types/node': 24.10.1 - - '@types/chrome@0.1.30': + '@types/chrome@0.1.40': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.15 - '@types/diff@7.0.2': {} + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} + '@types/filesystem@0.0.36': dependencies: '@types/filewriter': 0.0.33 @@ -3099,15 +3387,15 @@ snapshots: '@types/lodash@4.17.15': {} - '@types/lodash@4.17.20': {} + '@types/lodash@4.17.24': {} '@types/node@22.13.13': dependencies: undici-types: 6.20.0 - '@types/node@24.10.1': + '@types/node@25.6.0': dependencies: - undici-types: 7.16.0 + undici-types: 7.19.2 '@types/react-dom@19.0.4(@types/react@19.0.12)': dependencies: @@ -3119,111 +3407,112 @@ snapshots: '@types/stylus@0.48.42': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.6.0 '@types/tinycolor2@1.4.6': {} - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 24.10.1 + '@types/trusted-types@2.0.7': optional: true - '@types/yazl@3.3.0': + '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.10.1 + '@types/node': 25.6.0 + optional: true - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@types/yazl@3.3.1': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 - eslint: 9.39.1 - graphemer: 1.4.0 - ignore: 7.0.3 + '@types/node': 25.6.0 + + '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.2 + eslint: 10.2.0 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2)': dependencies: - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 - debug: 4.4.1 - eslint: 9.39.1 - typescript: 5.9.3 + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.2 + debug: 4.4.3 + eslint: 10.2.0 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 - debug: 4.4.1 - typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/types': 8.58.2 + debug: 4.4.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.47.0': + '@typescript-eslint/scope-manager@8.58.2': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 - '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': dependencies: - typescript: 5.9.3 + typescript: 6.0.2 - '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - debug: 4.4.1 - eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + debug: 4.4.3 + eslint: 10.2.0 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.47.0': {} + '@typescript-eslint/types@8.58.2': {} - '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': dependencies: - '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/visitor-keys': 8.58.2 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.3 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - eslint: 9.39.1 - typescript: 5.9.3 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@typescript-eslint/scope-manager': 8.58.2 + '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + eslint: 10.2.0 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.47.0': + '@typescript-eslint/visitor-keys@8.58.2': dependencies: - '@typescript-eslint/types': 8.47.0 - eslint-visitor-keys: 4.2.1 + '@typescript-eslint/types': 8.58.2 + eslint-visitor-keys: 5.0.1 '@vap/core@0.0.12': dependencies: @@ -3245,13 +3534,19 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn@8.14.1: {} acorn@8.15.0: {} + acorn@8.16.0: {} + agent-base@7.1.3: {} - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -3277,8 +3572,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.3: {} - argparse@2.0.1: {} array-buffer-byte-length@1.0.2: @@ -3306,8 +3599,6 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 - array-union@2.1.0: {} - array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 @@ -3384,7 +3675,7 @@ snapshots: balanced-match@1.0.2: {} - balanced-match@2.0.0: {} + balanced-match@4.0.4: {} bare-events@2.5.4: optional: true @@ -3413,6 +3704,8 @@ snapshots: basic-ftp@5.0.5: {} + boolbase@1.0.0: {} + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -3422,6 +3715,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -3430,13 +3727,13 @@ snapshots: buffer-from@1.1.2: {} - cacheable@2.2.0: + cacheable@2.3.4: dependencies: - '@cacheable/memory': 2.0.5 - '@cacheable/utils': 2.3.1 - hookified: 1.13.0 - keyv: 5.5.4 - qified: 0.5.2 + '@cacheable/memory': 2.0.8 + '@cacheable/utils': 2.4.1 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.9.1 call-bind-apply-helpers@1.0.2: dependencies: @@ -3473,9 +3770,9 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chromium-bidi@11.0.0(devtools-protocol@0.0.1521046): + chromium-bidi@14.0.0(devtools-protocol@0.0.1595872): dependencies: - devtools-protocol: 0.0.1521046 + devtools-protocol: 0.0.1595872 mitt: 3.0.1 zod: 3.24.2 @@ -3505,20 +3802,22 @@ snapshots: commander@10.0.1: {} + commander@11.1.0: {} + commander@13.1.0: {} commander@2.20.3: {} concat-map@0.0.1: {} - cosmiconfig@9.0.0(typescript@5.9.3): + cosmiconfig@9.0.1(typescript@6.0.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.2 cross-spawn@7.0.6: dependencies: @@ -3526,15 +3825,39 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-functions-list@3.2.3: {} + css-functions-list@3.3.3: {} + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 css-tree@3.1.0: dependencies: mdn-data: 2.12.2 source-map-js: 1.2.1 + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + cssesc@3.0.0: {} + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + csstype@3.1.3: {} data-uri-to-buffer@6.0.2: {} @@ -3561,10 +3884,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -3589,19 +3908,35 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - devtools-protocol@0.0.1521046: {} + devtools-protocol@0.0.1595872: {} - diff@8.0.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 + diff@9.0.0: {} doctrine@2.1.0: dependencies: esutils: 2.0.3 - dompurify@3.1.7: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 dot-case@3.0.4: dependencies: @@ -3614,12 +3949,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -3844,6 +4175,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.0 '@esbuild/win32-x64': 0.27.0 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escalade@3.1.2: {} escape-string-regexp@1.0.5: {} @@ -3858,9 +4218,9 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) eslint-import-resolver-node@0.3.9: dependencies: @@ -3870,17 +4230,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.9)(eslint@10.2.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + eslint: 10.2.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -3889,9 +4249,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.1 + eslint: 10.2.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.9)(eslint@10.2.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3903,13 +4263,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.1): + eslint-plugin-react@7.37.5(eslint@10.2.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -3917,7 +4277,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.1 + eslint: 10.2.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -3931,22 +4291,24 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-header@1.2.2(eslint@9.39.1): + eslint-plugin-simple-header@1.2.2(eslint@10.2.0): dependencies: - eslint: 9.39.1 + eslint: 10.2.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.1): + eslint-plugin-simple-import-sort@13.0.0(eslint@10.2.0): dependencies: - eslint: 9.39.1 + eslint: 10.2.0 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): dependencies: - eslint: 9.39.1 + eslint: 10.2.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -3954,29 +4316,28 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1: + eslint-visitor-keys@5.0.1: {} + + eslint@10.2.0: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@10.2.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.7 - ajv: 6.12.6 - chalk: 4.1.2 + ajv: 6.14.0 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -3986,8 +4347,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -3999,9 +4359,15 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -4053,6 +4419,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -4061,9 +4431,9 @@ snapshots: fflate@0.8.2: {} - file-entry-cache@10.1.4: + file-entry-cache@11.1.2: dependencies: - flat-cache: 6.1.19 + flat-cache: 6.1.22 file-entry-cache@8.0.0: dependencies: @@ -4083,23 +4453,20 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.19: + flat-cache@6.1.22: dependencies: - cacheable: 2.2.0 - flatted: 3.3.3 - hookified: 1.13.0 + cacheable: 2.3.4 + flatted: 3.4.2 + hookified: 1.15.1 flatted@3.3.3: {} + flatted@3.4.2: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 @@ -4124,6 +4491,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.5.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4175,14 +4544,11 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@11.0.3: + glob@13.0.6: dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.0.3 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 global-modules@2.0.0: dependencies: @@ -4200,21 +4566,19 @@ snapshots: kind-of: 6.0.3 which: 4.0.0 - globals@14.0.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 - globby@11.1.0: + globby@16.2.0: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 + '@sindresorhus/merge-streams': 4.0.0 fast-glob: 3.3.3 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 globjoin@0.1.4: {} @@ -4222,14 +4586,14 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - has-bigints@1.0.2: {} has-flag@3.0.0: {} has-flag@4.0.0: {} + has-flag@5.0.1: {} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -4244,9 +4608,9 @@ snapshots: dependencies: has-symbols: 1.1.0 - hashery@1.2.0: + hashery@1.5.1: dependencies: - hookified: 1.13.0 + hookified: 1.15.1 hasown@2.0.2: dependencies: @@ -4254,7 +4618,9 @@ snapshots: highlight.js@11.11.1: {} - hookified@1.13.0: {} + hookified@1.15.1: {} + + hookified@2.1.1: {} html-minifier-terser@7.2.0: dependencies: @@ -4266,7 +4632,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-tags@3.3.1: {} + html-tags@5.1.0: {} http-proxy-agent@7.0.2: dependencies: @@ -4286,8 +4652,6 @@ snapshots: ignore@5.3.1: {} - ignore@7.0.3: {} - ignore@7.0.5: {} import-fresh@3.3.1: @@ -4295,6 +4659,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} ini@1.3.8: {} @@ -4384,6 +4750,8 @@ snapshots: is-number@7.0.0: {} + is-path-inside@4.0.0: {} + is-plain-object@5.0.0: {} is-regex@1.2.1: @@ -4440,10 +4808,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -4491,14 +4855,12 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.5.4: + keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 kind-of@6.0.3: {} - known-css-properties@0.37.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -4510,8 +4872,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.merge@4.6.2: {} - lodash.truncate@4.4.2: {} loose-envify@1.4.0: @@ -4522,7 +4882,7 @@ snapshots: dependencies: tslib: 2.6.2 - lru-cache@11.2.1: {} + lru-cache@11.3.5: {} lru-cache@7.18.3: {} @@ -4530,11 +4890,15 @@ snapshots: math-intrinsics@1.1.0: {} - mathml-tag-names@2.1.3: {} + mathml-tag-names@4.0.0: {} + + mdn-data@2.0.28: {} mdn-data@2.12.2: {} - meow@13.2.0: {} + mdn-data@2.27.1: {} + + meow@14.1.0: {} merge2@1.4.1: {} @@ -4543,9 +4907,9 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - minimatch@10.0.3: + minimatch@10.2.5: dependencies: - '@isaacs/brace-expansion': 5.0.0 + brace-expansion: 5.0.5 minimatch@3.1.2: dependencies: @@ -4561,15 +4925,15 @@ snapshots: minimist@1.2.8: {} - minipass@7.1.2: {} + minipass@7.1.3: {} mitt@3.0.1: {} moment@2.30.1: {} - monaco-editor@0.54.0: + monaco-editor@0.55.1: dependencies: - dompurify: 3.1.7 + dompurify: 3.2.7 marked: 14.0.0 ms@2.1.3: {} @@ -4596,6 +4960,10 @@ snapshots: normalize-path@3.0.0: {} + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -4687,8 +5055,6 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - package-json-from-dist@1.0.1: {} - pako@1.0.11: {} param-case@3.0.4: @@ -4718,12 +5084,10 @@ snapshots: path-parse@1.0.7: {} - path-scurry@2.0.0: + path-scurry@2.0.2: dependencies: - lru-cache: 11.2.1 - minipass: 7.1.2 - - path-type@4.0.0: {} + lru-cache: 11.3.5 + minipass: 7.1.3 pend@1.2.0: {} @@ -4733,22 +5097,22 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.4: {} + possible-typed-array-names@1.1.0: {} - postcss-resolve-nested-selector@0.1.6: {} - - postcss-safe-parser@7.0.1(postcss@8.5.6): + postcss-safe-parser@7.0.1(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 - postcss-selector-parser@7.1.0: + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -4786,15 +5150,15 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.30.0: + puppeteer-core@24.41.0: dependencies: - '@puppeteer/browsers': 2.10.13 - chromium-bidi: 11.0.0(devtools-protocol@0.0.1521046) + '@puppeteer/browsers': 2.13.0 + chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) debug: 4.4.3 - devtools-protocol: 0.0.1521046 - typed-query-selector: 2.12.0 - webdriver-bidi-protocol: 0.3.8 - ws: 8.18.3 + devtools-protocol: 0.0.1595872 + typed-query-selector: 2.12.1 + webdriver-bidi-protocol: 0.4.1 + ws: 8.20.0 transitivePeerDependencies: - bare-buffer - bufferutil @@ -4803,9 +5167,9 @@ snapshots: q@1.5.1: {} - qified@0.5.2: + qified@0.9.1: dependencies: - hookified: 1.13.0 + hookified: 2.1.1 queue-microtask@1.2.3: {} @@ -4839,8 +5203,6 @@ snapshots: resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} resolve@1.22.11: @@ -4886,14 +5248,16 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + sax@1.6.0: {} + semver@6.3.1: {} semver@7.7.1: {} - semver@7.7.2: {} - semver@7.7.3: {} + semver@7.7.4: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -4952,7 +5316,7 @@ snapshots: signal-exit@4.1.0: {} - slash@3.0.0: {} + slash@5.1.0: {} slice-ansi@4.0.0: dependencies: @@ -4986,7 +5350,7 @@ snapshots: sprintf-js@1.1.3: {} - standalone-electron-types@34.2.0: + standalone-electron-types@41.2.1: dependencies: '@types/node': 22.13.13 @@ -5008,10 +5372,9 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + string-width@8.2.0: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 + get-east-asian-width: 1.5.0 strip-ansi: 7.1.2 string.prototype.matchall@4.0.12: @@ -5068,61 +5431,59 @@ snapshots: strip-bom@3.0.0: {} - strip-json-comments@3.1.1: {} - - stylelint-config-recommended@17.0.0(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-recommended@18.0.0(stylelint@17.8.0(typescript@6.0.2)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) + stylelint: 17.8.0(typescript@6.0.2) - stylelint-config-standard@39.0.1(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-standard@40.0.0(stylelint@17.8.0(typescript@6.0.2)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) - stylelint-config-recommended: 17.0.0(stylelint@16.25.0(typescript@5.9.3)) + stylelint: 17.8.0(typescript@6.0.2) + stylelint-config-recommended: 18.0.0(stylelint@17.8.0(typescript@6.0.2)) - stylelint@16.25.0(typescript@5.9.3): + stylelint@17.8.0(typescript@6.0.2): dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) - '@dual-bundle/import-meta-resolve': 4.2.1 - balanced-match: 2.0.0 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.1) + '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.1) colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.9.3) - css-functions-list: 3.2.3 - css-tree: 3.1.0 + cosmiconfig: 9.0.1(typescript@6.0.2) + css-functions-list: 3.3.3 + css-tree: 3.2.1 debug: 4.4.3 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.4 + file-entry-cache: 11.1.2 global-modules: 2.0.0 - globby: 11.1.0 + globby: 16.2.0 globjoin: 0.1.4 - html-tags: 3.3.1 + html-tags: 5.1.0 ignore: 7.0.5 - imurmurhash: 0.1.4 + import-meta-resolve: 4.2.0 is-plain-object: 5.0.0 - known-css-properties: 0.37.0 - mathml-tag-names: 2.1.3 - meow: 13.2.0 + mathml-tag-names: 4.0.0 + meow: 14.1.0 micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.6 - postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.5.6) - postcss-selector-parser: 7.1.0 + postcss: 8.5.10 + postcss-safe-parser: 7.0.1(postcss@8.5.10) + postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - resolve-from: 5.0.0 - string-width: 4.2.3 - supports-hyperlinks: 3.2.0 + string-width: 8.2.0 + supports-hyperlinks: 4.4.0 svg-tags: 1.0.0 table: 6.9.0 - write-file-atomic: 5.0.1 + write-file-atomic: 7.0.1 transitivePeerDependencies: - supports-color - typescript + supports-color@10.2.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -5131,15 +5492,25 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@3.2.0: + supports-hyperlinks@4.4.0: dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 + has-flag: 5.0.1 + supports-color: 10.2.2 supports-preserve-symlinks-flag@1.0.0: {} svg-tags@1.0.0: {} + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + table@6.9.0: dependencies: ajv: 8.17.1 @@ -5177,13 +5548,18 @@ snapshots: dependencies: b4a: 1.6.6 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - ts-api-utils@2.1.0(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@6.0.2): dependencies: - typescript: 5.9.3 + typescript: 6.0.2 ts-patch@3.3.0: dependencies: @@ -5196,6 +5572,8 @@ snapshots: ts-pattern@5.6.2: {} + ts-pattern@5.9.0: {} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -5214,9 +5592,9 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - tsx@4.20.6: + tsx@4.21.0: dependencies: - esbuild: 0.25.1 + esbuild: 0.27.0 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -5229,7 +5607,7 @@ snapshots: type-fest@4.41.0: {} - type-fest@5.2.0: + type-fest@5.5.0: dependencies: tagged-tag: 1.0.0 @@ -5266,25 +5644,25 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typed-query-selector@2.12.0: {} + typed-query-selector@2.12.1: {} - typescript-eslint@8.47.0(eslint@9.39.1)(typescript@5.9.3): + typescript-eslint@8.58.2(eslint@10.2.0)(typescript@6.0.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - typescript: 5.9.3 + '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + eslint: 10.2.0 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - typescript-transform-paths@3.5.5(typescript@5.9.3): + typescript-transform-paths@3.5.6(typescript@6.0.2): dependencies: minimatch: 9.0.5 - typescript: 5.9.3 + typescript: 6.0.2 - typescript@5.9.3: {} + typescript@6.0.2: {} unbox-primitive@1.1.0: dependencies: @@ -5295,7 +5673,9 @@ snapshots: undici-types@6.20.0: {} - undici-types@7.16.0: {} + undici-types@7.19.2: {} + + unicorn-magic@0.4.0: {} universalify@2.0.1: {} @@ -5316,7 +5696,7 @@ snapshots: web-streams-polyfill@3.3.3: optional: true - webdriver-bidi-protocol@0.3.8: {} + webdriver-bidi-protocol@0.4.1: {} which-boxed-primitive@1.1.1: dependencies: @@ -5389,23 +5769,18 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - wrappy@1.0.2: {} - write-file-atomic@5.0.1: + write-file-atomic@7.0.1: dependencies: - imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.18.3: {} + ws@8.20.0: {} y18n@5.0.8: {} + yaml-js@0.3.1: {} + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/scripts/utils.ts b/scripts/utils.ts index 701919c8a..2727f5447 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -38,6 +38,7 @@ export interface PluginData { name: string; description: string; tags: string[]; + searchTerms: string[]; authors: Dev[]; dependencies: string[]; hasPatches: boolean; @@ -152,7 +153,8 @@ export async function parseFile(fileName: string) { enabledByDefault: false, required: false, isModified: false, - tags: [] as string[] + tags: [] as string[], + searchTerms: [] as string[], } as PluginData; for (const prop of pluginObj.properties) { @@ -208,9 +210,10 @@ export async function parseFile(fileName: string) { }); break; case "tags": - if (!isArrayLiteralExpression(value)) throw fail("tags is not an array literal"); - data.tags = value.elements.map(e => { - if (!isStringLiteral(e)) throw fail("tags array contains non-string literals"); + case "searchTerms": + if (!isArrayLiteralExpression(value)) throw fail(`${key} is not an array literal`); + data[key] = value.elements.map(e => { + if (!isStringLiteral(e)) throw fail(`${key} array contains non-string literals`); return e.text; }); break; diff --git a/src/api/AudioPlayer.ts b/src/api/AudioPlayer.ts index 53d6c0614..d106d26b8 100644 --- a/src/api/AudioPlayer.ts +++ b/src/api/AudioPlayer.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { findByCodeLazy, findLazy } from "webpack"; +import { findByCodeLazy, findLazy } from "@webpack"; let defaultSounds: null | string[] = null; const findDefaultSounds = findLazy(module => module.resolve && module.id && module.keys().some(key => key.endsWith(".mp3")), false); diff --git a/src/api/PluginManager.ts b/src/api/PluginManager.ts index 0721b4d20..8cd514d59 100644 --- a/src/api/PluginManager.ts +++ b/src/api/PluginManager.ts @@ -28,6 +28,7 @@ import { addMessagePopoverButton, removeMessagePopoverButton } from "@api/Messag import { addNicknameIcon, removeNicknameIcon } from "@api/NicknameIcons"; import { Settings, SettingsStore } from "@api/Settings"; import { disableStyle, enableStyle } from "@api/Styles"; +import { traceFunction } from "@debug/Tracer"; import { Logger } from "@utils/Logger"; import { onlyOnce } from "@utils/onlyOnce"; import { canonicalizeFind, canonicalizeReplacement } from "@utils/patches"; @@ -39,7 +40,6 @@ import { patches } from "@webpack/patcher"; import Plugins from "~plugins"; export { Plugins as plugins }; -import { traceFunction } from "../debug/Tracer"; import { addAudioProcessor, removeAudioProcessor } from "./AudioPlayer"; import { addChannelToolbarButton, addHeaderBarButton, removeChannelToolbarButton, removeHeaderBarButton } from "./HeaderBar"; import { addProfileCollection, removeProfileCollection } from "./ProfileCollections"; diff --git a/src/components/CheckedTextInput.tsx b/src/components/CheckedTextInput.tsx index 027dd51fa..cb2015f94 100644 --- a/src/components/CheckedTextInput.tsx +++ b/src/components/CheckedTextInput.tsx @@ -16,13 +16,13 @@ * along with this program. If not, see . */ -import { React, TextInput } from "@webpack/common"; +import { React, TextInput, useState } from "@webpack/common"; interface TextInputProps { /** * WARNING: Changing this between renders will have no effect! */ - value: string; + initialValue: string; /** * This will only be called if the new value passed validate() */ @@ -41,13 +41,15 @@ interface TextInputProps { * A very simple wrapper around Discord's TextInput that validates input and shows * the user an error message and only calls your onChange when the input is valid */ -export function CheckedTextInput({ value: initialValue, onChange, validate, placeholder }: TextInputProps) { - const [value, setValue] = React.useState(initialValue); - const [error, setError] = React.useState(); +export function CheckedTextInput({ initialValue, onChange, validate, placeholder }: TextInputProps) { + const [value, setValue] = useState(initialValue); + const [error, setError] = useState(); function handleChange(v: string) { setValue(v); + const res = validate(v); + if (res === true) { setError(void 0); onChange(v); diff --git a/src/components/ThemeSettings/components/SettingColorComponent.tsx b/src/components/ThemeSettings/components/SettingColorComponent.tsx index e01228c5f..9f3e00fd2 100644 --- a/src/components/ThemeSettings/components/SettingColorComponent.tsx +++ b/src/components/ThemeSettings/components/SettingColorComponent.tsx @@ -9,6 +9,7 @@ import "./colorStyles.css"; import { classNameFactory } from "@utils/css"; import { findByCodeLazy } from "@webpack"; import { ColorPicker, useMemo } from "@webpack/common"; +import type tinycolor from "tinycolor2"; // TinyColor is completely unmangled and it's duplicated in two modules! Fun! const TinyColor: tinycolor.Constructor = findByCodeLazy("this._gradientType="); diff --git a/src/components/settings/tabs/plugins/PluginCard.tsx b/src/components/settings/tabs/plugins/PluginCard.tsx index 140498249..96d1cb788 100644 --- a/src/components/settings/tabs/plugins/PluginCard.tsx +++ b/src/components/settings/tabs/plugins/PluginCard.tsx @@ -6,13 +6,13 @@ import { showNotice } from "@api/Notices"; import { isPluginEnabled, pluginRequiresRestart, startDependenciesRecursive, startPlugin, stopPlugin } from "@api/PluginManager"; +import { Settings } from "@api/Settings"; import { CogWheel, InfoIcon } from "@components/Icons"; import { AddonCard } from "@components/settings/AddonCard"; import { classNameFactory } from "@utils/css"; import { Logger } from "@utils/Logger"; import { OptionType, Plugin } from "@utils/types"; import { React, showToast, Toasts } from "@webpack/common"; -import { Settings } from "Vencord"; import { PluginMeta } from "~plugins"; diff --git a/src/components/settings/tabs/plugins/PluginModal.css b/src/components/settings/tabs/plugins/PluginModal.css index 90620c665..bdd35c80c 100644 --- a/src/components/settings/tabs/plugins/PluginModal.css +++ b/src/components/settings/tabs/plugins/PluginModal.css @@ -60,5 +60,25 @@ } .vc-plugin-modal-info { + display: flex; + gap: 1em; + justify-content: space-between; + align-items: start; +} + +.vc-plugin-modal-tags { + display: flex; + flex-wrap: wrap; + gap: 4px; + margin-block: 8px 16px; +} + +.vc-plugin-modal-tag { align-items: center; -} \ No newline at end of file + border: 1px solid var(--border-normal); + border-radius: 9999px; + display: flex; + justify-content: center; + padding: 6px 12px; + color: var(--text-default); +} diff --git a/src/components/settings/tabs/plugins/PluginModal.tsx b/src/components/settings/tabs/plugins/PluginModal.tsx index cf3379ee9..177fce95d 100644 --- a/src/components/settings/tabs/plugins/PluginModal.tsx +++ b/src/components/settings/tabs/plugins/PluginModal.tsx @@ -32,7 +32,7 @@ import { proxyLazy } from "@utils/lazy"; import { Margins } from "@utils/margins"; import { classes, isObjectEmpty } from "@utils/misc"; import { ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; -import { OptionType, Plugin } from "@utils/types"; +import { OptionType, Plugin, PluginTag } from "@utils/types"; import { User } from "@vencord/discord-types"; import { findComponentByCodeLazy, findCssClassesLazy } from "@webpack"; import { Clickable, FluxDispatcher, React, Toasts, Tooltip, useEffect, useMemo, UserStore, UserSummaryItem, UserUtils, useState } from "@webpack/common"; @@ -74,6 +74,16 @@ export function makeDummyUser(user: { username: string; id?: string; avatar?: st return newUser; } +function PluginTags({ tags }: { tags: PluginTag[]; }) { + return ( +
+ {tags.map(tag => ( +
{tag}
+ ))} +
+ ); +} + export default function PluginModal({ plugin, onRestartNeeded, onClose, transitionState }: PluginModalProps) { const pluginSettings = useSettings([`plugins.${plugin.name}.*`]).plugins[plugin.name]; const hasSettings = Boolean(pluginSettings && plugin.options && !isObjectEmpty(plugin.options)); @@ -167,6 +177,7 @@ export default function PluginModal({ plugin, onRestartNeeded, onClose, transiti
{plugin.name} {plugin.description} + {!!plugin.tags?.length && } {!!plugin.settingsAboutComponent && (
diff --git a/src/components/settings/tabs/plugins/index.tsx b/src/components/settings/tabs/plugins/index.tsx index 66a35a346..022bb9322 100644 --- a/src/components/settings/tabs/plugins/index.tsx +++ b/src/components/settings/tabs/plugins/index.tsx @@ -36,7 +36,8 @@ import { Logger } from "@utils/Logger"; import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; import { useAwaiter, useIntersection } from "@utils/react"; -import { Alerts, lodash, Parser, React, Select, TextInput, Toasts, Tooltip, useCallback, useMemo, useState } from "@webpack/common"; +import { PluginTag, PluginTags } from "@utils/types"; +import { Alerts, lodash, Parser, React, SearchableSelect, Select, TextInput, Toasts, Tooltip, useCallback, useMemo, useRef, useState } from "@webpack/common"; import { JSX } from "react"; import Plugins, { ExcludedPlugins, PluginMeta } from "~plugins"; @@ -143,7 +144,8 @@ function ExcludedPluginsList({ search }: { search: string; }) { export default function PluginSettings() { const settings = useSettings(); - const changes = React.useMemo(() => new ChangeList(), []); + const changeRef = useRef>(null); + const changes = changeRef.current ??= new ChangeList(); React.useEffect(() => { return () => { @@ -194,25 +196,13 @@ export default function PluginSettings() { const hasUserPlugins = useMemo(() => !IS_STANDALONE && Object.values(PluginMeta).some(m => m.userPlugin), []); - const [searchValue, setSearchValue] = useState({ value: "", status: SearchStatus.ALL }); - const [searchInput, setSearchInput] = useState(""); - - const debouncedSetSearch = useMemo( - () => debounce((query: string) => setSearchValue(prev => ({ ...prev, value: query })), 150), - [] - ); + const [searchValue, setSearchValue] = useState({ value: "", tags: [] as PluginTag[], status: SearchStatus.ALL }); const search = searchValue.value.toLowerCase(); - const onSearch = useCallback((query: string) => { - setSearchInput(query); - debouncedSetSearch(query); - }, [debouncedSetSearch]); - const onStatusChange = useCallback((status: SearchStatus) => { - setSearchValue(prev => ({ ...prev, status })); - }, []); + const onSearch = (query: string) => setSearchValue(prev => ({ ...prev, value: query })); const pluginFilter = useCallback((plugin: typeof Plugins[keyof typeof Plugins], newPluginsSet: Set | null) => { - const { status } = searchValue; + const { status, tags } = searchValue; const enabled = isPluginEnabled(plugin.name); switch (status) { @@ -239,12 +229,14 @@ export default function PluginSettings() { break; } + if (tags.length && tags.some(t => !plugin.tags?.includes(t))) return false; + if (!search.length) return true; return ( plugin.name.toLowerCase().includes(search.replace(/\s+/g, "")) || plugin.description.toLowerCase().includes(search) || - plugin.tags?.some(t => t.toLowerCase().includes(search)) + plugin.searchTerms?.some(t => t.toLowerCase().includes(search)) ); }, [searchValue, search]); @@ -406,31 +398,45 @@ export default function PluginSettings() { Filters -
- - - -
- - setSearchValue(prev => ({ ...prev, status }))} + isSelected={v => v === searchValue.status} + closeOnSelect={true} + placeholder="Filter by Type" + /> + ({ label: tag, value: tag }))} + value={searchValue.tags} + onChange={tags => setSearchValue(prev => ({ ...prev, tags }))} + closeOnSelect={false} + placeholder="Filter by Tags" + multi + />
-
+
Plugins @@ -456,6 +462,7 @@ export default function PluginSettings() { Required Plugins +
{requiredPlugins.length ? requiredPlugins diff --git a/src/components/settings/tabs/plugins/styles.css b/src/components/settings/tabs/plugins/styles.css index 27e512395..0f531b126 100644 --- a/src/components/settings/tabs/plugins/styles.css +++ b/src/components/settings/tabs/plugins/styles.css @@ -45,7 +45,12 @@ display: grid; height: 40px; gap: 10px; - grid-template-columns: 1fr 150px; + grid-template-columns: 1fr 1fr; + align-items: center; +} + +.vc-plugins-filter-control { + height: 40px; } .vc-plugins-dep-name { diff --git a/src/components/settings/tabs/sync/CloudTab.tsx b/src/components/settings/tabs/sync/CloudTab.tsx index e848106c8..c66fde69a 100644 --- a/src/components/settings/tabs/sync/CloudTab.tsx +++ b/src/components/settings/tabs/sync/CloudTab.tsx @@ -137,7 +137,7 @@ function CloudTab() {
{ cloud.url = v; cloud.authenticated = false; diff --git a/src/components/settings/tabs/vencord/index.tsx b/src/components/settings/tabs/vencord/index.tsx index 37901be6d..c2f0aacea 100644 --- a/src/components/settings/tabs/vencord/index.tsx +++ b/src/components/settings/tabs/vencord/index.tsx @@ -20,6 +20,7 @@ import { Paragraph } from "@components/Paragraph"; import { openContributorModal, openPluginModal, SettingsTab, wrapTab } from "@components/settings"; import { QuickAction, QuickActionCard } from "@components/settings/QuickAction"; import { SpecialCard } from "@components/settings/SpecialCard"; +import BadgeAPI from "@plugins/_api/badges"; import { gitRemote } from "@shared/vencordUserAgent"; import { DONOR_ROLE_ID, GUILD_ID, IS_MAC, IS_WINDOWS, VC_DONOR_ROLE_ID, VC_GUILD_ID } from "@utils/constants"; import { classNameFactory } from "@utils/css"; @@ -27,7 +28,6 @@ import { Margins } from "@utils/margins"; import { identity, isAnyPluginDev } from "@utils/misc"; import { relaunch } from "@utils/native"; import { GuildMemberStore, React, Select, UserStore } from "@webpack/common"; -import BadgeAPI from "plugins/_api/badges"; import { DonateButtonComponent } from "./DonateButton"; import { openNotificationSettingsModal } from "./NotificationSettings"; diff --git a/src/debug/loadLazyChunks.ts b/src/debug/loadLazyChunks.ts index 44e483faf..997e69fa2 100644 --- a/src/debug/loadLazyChunks.ts +++ b/src/debug/loadLazyChunks.ts @@ -9,8 +9,8 @@ import { canonicalizeMatch } from "@utils/patches"; import { ModuleFactory } from "@vencord/discord-types/webpack"; import * as Webpack from "@webpack"; import { wreq } from "@webpack"; +import { AnyModuleFactory } from "@webpack/types"; import pLimit from "p-limit"; -import { AnyModuleFactory } from "webpack"; function getWebpackChunkMap() { const sym = Symbol(); diff --git a/src/debug/reporterData.ts b/src/debug/reporterData.ts index 0fd261c0f..e713521e5 100644 --- a/src/debug/reporterData.ts +++ b/src/debug/reporterData.ts @@ -26,6 +26,7 @@ export interface ReporterData { }; failedWebpack: Record; } + export const reporterData: ReporterData = { failedPatches: { foundNoModule: [], diff --git a/src/equicordplugins/altKrispSwitch/index.tsx b/src/equicordplugins/altKrispSwitch/index.tsx index a55216aa3..8f05a8e43 100644 --- a/src/equicordplugins/altKrispSwitch/index.tsx +++ b/src/equicordplugins/altKrispSwitch/index.tsx @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "AltKrispSwitch", description: "Makes the Noise Suppression Popout switch between None and Krisp instead of Krisp and Standard", + tags: ["Customisation", "Voice"], authors: [Devs.newwares], patches: [ { diff --git a/src/equicordplugins/alwaysExpandProfiles/index.ts b/src/equicordplugins/alwaysExpandProfiles/index.ts index c78baea4f..3a448288b 100644 --- a/src/equicordplugins/alwaysExpandProfiles/index.ts +++ b/src/equicordplugins/alwaysExpandProfiles/index.ts @@ -11,6 +11,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "AlwaysExpandProfiles", description: "Always expands profile popouts to the full modal", + tags: ["Appearance", "Utility"], authors: [Devs.thororen], patches: [ { diff --git a/src/equicordplugins/animalese/index.ts b/src/equicordplugins/animalese/index.ts index 1f8ccb568..a63bc44dc 100644 --- a/src/equicordplugins/animalese/index.ts +++ b/src/equicordplugins/animalese/index.ts @@ -193,6 +193,7 @@ async function playSound(buffer: AudioBuffer, volume: number) { export default definePlugin({ name: "Animalese", description: "Plays animal crossing animalese for every message sent (they yap a lot)", + tags: ["Customisation", "Fun"], authors: [EquicordDevs.ryanamay, EquicordDevs.Mocha], settings, diff --git a/src/equicordplugins/atSomeone/index.ts b/src/equicordplugins/atSomeone/index.ts index 40902e6c4..15a094059 100644 --- a/src/equicordplugins/atSomeone/index.ts +++ b/src/equicordplugins/atSomeone/index.ts @@ -13,6 +13,7 @@ export default definePlugin({ name: "AtSomeone", authors: [Devs.Joona], description: "Mention someone randomly", + tags: ["Chat", "Fun"], patches: [ { find: ".LAUNCHABLE_APPLICATIONS;", diff --git a/src/equicordplugins/autoZipper/index.ts b/src/equicordplugins/autoZipper/index.ts index ab0f2335f..a2b0a1d24 100644 --- a/src/equicordplugins/autoZipper/index.ts +++ b/src/equicordplugins/autoZipper/index.ts @@ -209,6 +209,7 @@ function handlePaste(event: ClipboardEvent) { export default definePlugin({ name: "AutoZipper", description: "Automatically zips specified file types and folders before uploading to Discord", + tags: ["Chat", "Organisation"], authors: [EquicordDevs.SSnowly], settings, diff --git a/src/equicordplugins/bannersEverywhere/index.tsx b/src/equicordplugins/bannersEverywhere/index.tsx index 5959a4022..6aea3cfe6 100644 --- a/src/equicordplugins/bannersEverywhere/index.tsx +++ b/src/equicordplugins/bannersEverywhere/index.tsx @@ -44,6 +44,7 @@ const DATASTORE_KEY = "bannersEverywhere"; export default definePlugin({ name: "BannersEverywhere", description: "Displays banners in the member list ", + tags: ["Appearance", "Customisation"], authors: [Devs.ImLvna, Devs.AutumnVN], settings, patches: [ diff --git a/src/equicordplugins/baseDecoder/index.tsx b/src/equicordplugins/baseDecoder/index.tsx index 35ba3d701..9ecb51a9e 100644 --- a/src/equicordplugins/baseDecoder/index.tsx +++ b/src/equicordplugins/baseDecoder/index.tsx @@ -107,6 +107,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "DecodeBase64", description: "Decode base64 content of any message and copy the decoded content.", + dependencies: ["MessagePopoverAPI"], + tags: ["Appearance", "Customisation", "Chat"], authors: [EquicordDevs.ThePirateStoner], settings, messagePopoverButton: { diff --git a/src/equicordplugins/betterActivities/index.tsx b/src/equicordplugins/betterActivities/index.tsx index edb29a7c8..97e97a918 100644 --- a/src/equicordplugins/betterActivities/index.tsx +++ b/src/equicordplugins/betterActivities/index.tsx @@ -20,7 +20,7 @@ export default definePlugin({ name: "BetterActivities", description: "Shows activity icons in the member list and allows showing all activities", authors: [Devs.D3SOX, Devs.Arjix, Devs.AutumnVN, Devs.thororen], - tags: ["activity"], + tags: ["Activity"], settings, patchActivityList, showAllActivitiesComponent, diff --git a/src/equicordplugins/betterAudioPlayer/index.tsx b/src/equicordplugins/betterAudioPlayer/index.tsx index 1692b2d85..94c3d9770 100644 --- a/src/equicordplugins/betterAudioPlayer/index.tsx +++ b/src/equicordplugins/betterAudioPlayer/index.tsx @@ -274,6 +274,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterAudioPlayer", description: "Adds a spectrograph and oscilloscope visualizer to audio attachment players.", + tags: ["Appearance", "Media", "Voice"], authors: [EquicordDevs.creations], settings, diff --git a/src/equicordplugins/betterBanReasons/index.tsx b/src/equicordplugins/betterBanReasons/index.tsx index 68e849e1c..86d0b6dfe 100644 --- a/src/equicordplugins/betterBanReasons/index.tsx +++ b/src/equicordplugins/betterBanReasons/index.tsx @@ -74,6 +74,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterBanReasons", description: "Create custom reasons to use in the Discord ban modal, and/or show a text input by default instead of the options.", + tags: ["Appearance", "Customisation"], authors: [Devs.Inbestigator], patches: [ { diff --git a/src/equicordplugins/betterBlockedUsers/index.tsx b/src/equicordplugins/betterBlockedUsers/index.tsx index ce936edb0..995a7af10 100644 --- a/src/equicordplugins/betterBlockedUsers/index.tsx +++ b/src/equicordplugins/betterBlockedUsers/index.tsx @@ -17,6 +17,7 @@ let updateFunc = (v: any) => { }; export default definePlugin({ name: "BetterBlockedUsers", description: "Allows you to search in blocked users list and makes names selectable in settings.", + tags: ["Appearance", "Shortcuts"], authors: [EquicordDevs.TheArmagan], patches: [ { diff --git a/src/equicordplugins/betterCommands/index.ts b/src/equicordplugins/betterCommands/index.ts index 6c7df169f..b405fdd52 100644 --- a/src/equicordplugins/betterCommands/index.ts +++ b/src/equicordplugins/betterCommands/index.ts @@ -33,6 +33,8 @@ function fetchIndex(target: object) { export default definePlugin({ name: "BetterCommands", description: "Enhances the command system with miscellaneous improvements.", + dependencies: ["CommandsAPI"], + tags: ["Appearance", "Commands", "Shortcuts"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/betterInvites/index.tsx b/src/equicordplugins/betterInvites/index.tsx index 76b2facfa..1676df307 100644 --- a/src/equicordplugins/betterInvites/index.tsx +++ b/src/equicordplugins/betterInvites/index.tsx @@ -34,6 +34,7 @@ function lurk(id: string) { export default definePlugin({ name: "BetterInvites", description: "See invites expiration date, view inviter profile and preview servers before joining by clicking the name", + tags: ["Appearance", "Customisation", "Chat", "Servers"], authors: [EquicordDevs.iamme, Devs.thororen], patches: [ { diff --git a/src/equicordplugins/betterPlusReacts/index.ts b/src/equicordplugins/betterPlusReacts/index.ts index 2e3f84d2b..995a759a5 100644 --- a/src/equicordplugins/betterPlusReacts/index.ts +++ b/src/equicordplugins/betterPlusReacts/index.ts @@ -12,6 +12,7 @@ export default definePlugin({ name: "BetterPlusReacts", authors: [Devs.Joona], description: "The amount of plus before :emoji: is the message to add it to", + tags: ["Chat", "Emotes"], patches: [ { find: ".SLASH_COMMAND_USED,", diff --git a/src/equicordplugins/blockKeywords/index.ts b/src/equicordplugins/blockKeywords/index.ts index 3f7504373..13b44744c 100644 --- a/src/equicordplugins/blockKeywords/index.ts +++ b/src/equicordplugins/blockKeywords/index.ts @@ -70,6 +70,7 @@ export function containsBlockedKeywords(message: Message) { export default definePlugin({ name: "BlockKeywords", description: "Blocks messages containing specific user-defined keywords, as if the user sending them was blocked.", + tags: ["Appearance", "Customisation", "Privacy"], authors: [EquicordDevs.catcraft], patches: [ { diff --git a/src/equicordplugins/blockKrisp/index.ts b/src/equicordplugins/blockKrisp/index.ts index 28f6791ea..9b80b65e8 100644 --- a/src/equicordplugins/blockKrisp/index.ts +++ b/src/equicordplugins/blockKrisp/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "BlockKrisp", description: "Prevent Krisp from loading", + tags: ["Privacy", "Utility", "Voice"], authors: [Devs.D3SOX], patches: [ // Block loading modules on Desktop diff --git a/src/equicordplugins/bypassPinPrompt/index.ts b/src/equicordplugins/bypassPinPrompt/index.ts index 6c1503cd2..c90c44b93 100644 --- a/src/equicordplugins/bypassPinPrompt/index.ts +++ b/src/equicordplugins/bypassPinPrompt/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "BypassPinPrompt", description: "Bypass the pin prompt when using the pin functions", + tags: ["Shortcuts"], authors: [Devs.thororen], patches: [ ...[ diff --git a/src/equicordplugins/bypassStatus/index.tsx b/src/equicordplugins/bypassStatus/index.tsx index ac9d635d0..04d6861a2 100644 --- a/src/equicordplugins/bypassStatus/index.tsx +++ b/src/equicordplugins/bypassStatus/index.tsx @@ -157,6 +157,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BypassStatus", description: "Still get notifications from specific sources when in do not disturb mode. Right-click on users/channels/guilds to set them to bypass do not disturb mode.", + tags: ["Activity", "Customisation", "Notifications", "Servers"], authors: [Devs.Inbestigator], dependencies: ["AudioPlayerAPI"], flux: { diff --git a/src/equicordplugins/channelBadges/index.tsx b/src/equicordplugins/channelBadges/index.tsx index 25096a123..ba65fc47a 100644 --- a/src/equicordplugins/channelBadges/index.tsx +++ b/src/equicordplugins/channelBadges/index.tsx @@ -32,6 +32,7 @@ function renderBadge(id: number, title: string) { export default definePlugin({ name: "ChannelBadges", description: "Adds badges to channels based on their type", + tags: ["Appearance", "Customisation", "Servers"], authors: [EquicordDevs.creations, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/channelTabs/index.tsx b/src/equicordplugins/channelTabs/index.tsx index 35e6888a3..9cfa461ed 100644 --- a/src/equicordplugins/channelTabs/index.tsx +++ b/src/equicordplugins/channelTabs/index.tsx @@ -15,8 +15,8 @@ import { ChannelStore, Menu } from "@webpack/common"; import { JSX } from "react"; import ChannelsTabsContainer from "./components/ChannelTabsContainer"; -import { BasicChannelTabsProps, createTab, handleChannelSwitch, settings } from "./util"; import * as ChannelTabsUtils from "./util"; +import { BasicChannelTabsProps, createTab, handleChannelSwitch, settings } from "./util"; const contextMenuPatch: NavContextMenuPatchCallback = (children, props: { channel: Channel, messageId?: string; }) => { const { channel, messageId } = props; @@ -47,6 +47,7 @@ const contextMenuPatch: NavContextMenuPatchCallback = (children, props: { channe export default definePlugin({ name: "ChannelTabs", description: "Group your commonly visited channels in tabs, like a browser", + tags: ["Appearance", "Customisation", "Organisation", "Servers"], authors: [Devs.TheSun, Devs.TheKodeToad, EquicordDevs.keifufu, Devs.Nickyux, EquicordDevs.DiabeloDEV, EquicordDevs.justjxke], dependencies: ["ContextMenuAPI"], contextMenus: { diff --git a/src/equicordplugins/cleanChannelName/index.ts b/src/equicordplugins/cleanChannelName/index.ts index 822d5b5d2..9193ac648 100644 --- a/src/equicordplugins/cleanChannelName/index.ts +++ b/src/equicordplugins/cleanChannelName/index.ts @@ -12,6 +12,7 @@ export default definePlugin({ name: "CleanChannelName", authors: [Devs.AutumnVN], description: "remove all emoji and decor shit from channel names", + tags: ["Appearance", "Customisation", "Chat", "Emotes", "Servers"], patches: [ { find: "loadAllGuildAndPrivateChannelsFromDisk(){", diff --git a/src/equicordplugins/cleanerChannelGroups/index.ts b/src/equicordplugins/cleanerChannelGroups/index.ts index 73f5ba4ce..05c80840c 100644 --- a/src/equicordplugins/cleanerChannelGroups/index.ts +++ b/src/equicordplugins/cleanerChannelGroups/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "CleanerChannelGroups", description: "Hides all channels in collapsed categories, even if they have unread messages.", + tags: ["Appearance", "Customisation", "Chat", "Organisation", "Servers"], authors: [EquicordDevs.justjxke], patches: [ { diff --git a/src/equicordplugins/clickableRoles/index.tsx b/src/equicordplugins/clickableRoles/index.tsx index 6f4005e58..c23359ffc 100644 --- a/src/equicordplugins/clickableRoles/index.tsx +++ b/src/equicordplugins/clickableRoles/index.tsx @@ -146,6 +146,7 @@ const WrappedClickableRole = ErrorBoundary.wrap(ClickableRole, { noop: true }); export default definePlugin({ name: "ClickableRoles", description: "Click on roles in user profiles and the member list to see which members have them.", + tags: ["Appearance", "Roles"], authors: [Devs.prism], patches: [ diff --git a/src/equicordplugins/clientSideBlock/index.tsx b/src/equicordplugins/clientSideBlock/index.tsx index 19c971c96..1aa51a646 100644 --- a/src/equicordplugins/clientSideBlock/index.tsx +++ b/src/equicordplugins/clientSideBlock/index.tsx @@ -142,7 +142,8 @@ function activeNowView(cards) { export default definePlugin({ name: "ClientSideBlock", description: "Allows you to locally hide almost all content from any user", - tags: ["blocked", "block", "hide", "hidden", "noblockedmessages"], + tags: ["Utility"], + searchTerms: ["blocked", "block", "hide", "hidden", "noblockedmessages"], authors: [Devs.Samwich, EquicordDevs.KamiRu], settings, activeNowView, diff --git a/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx b/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx index 91320746e..5d4039046 100644 --- a/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx +++ b/src/equicordplugins/clipsEnhancements.discordDesktop/index.tsx @@ -72,6 +72,7 @@ migratePluginSettings("ClipsEnhancements", "TimelessClips"); export default definePlugin({ name: "ClipsEnhancements", description: "Add more Clip FPS and duration options, custom clip length, RPC tagging and more", + tags: ["Activity", "Media", "Utility"], authors: [Devs.niko, Devs.Joona, EquicordDevs.keircn], settings, patches: [ diff --git a/src/equicordplugins/collapsibleUi/index.tsx b/src/equicordplugins/collapsibleUi/index.tsx index d72033893..d6c7d709c 100644 --- a/src/equicordplugins/collapsibleUi/index.tsx +++ b/src/equicordplugins/collapsibleUi/index.tsx @@ -108,8 +108,10 @@ const ChatButtonsRow = ErrorBoundary.wrap(({ buttons }: { buttons: ReactNode[]; export default definePlugin({ name: "CollapsibleUI", description: "Native collapsible channel, member, chat button, and user area surfaces.", + tags: ["Appearance", "Customisation", "Chat", "Servers"], + dependencies: ["HeaderBarAPI"], authors: [EquicordDevs.benjii], - tags: ["ui", "sidebar", "layout"], + searchTerms: ["ui", "sidebar", "layout"], managedStyle, settings, diff --git a/src/equicordplugins/commandPalette/index.tsx b/src/equicordplugins/commandPalette/index.tsx index c11d44a83..6d3199c1a 100644 --- a/src/equicordplugins/commandPalette/index.tsx +++ b/src/equicordplugins/commandPalette/index.tsx @@ -201,6 +201,7 @@ function hotkeyUsesModifiers() { export default definePlugin({ name: "CommandPalette", description: "Quickly run actions through a searchable command palette", + tags: ["Appearance", "Customisation", "Commands", "Shortcuts"], authors: [EquicordDevs.justjxke], settings, patches: [ diff --git a/src/equicordplugins/commandPalette/registry.tsx b/src/equicordplugins/commandPalette/registry.tsx index ea1616940..8c7c87cf9 100644 --- a/src/equicordplugins/commandPalette/registry.tsx +++ b/src/equicordplugins/commandPalette/registry.tsx @@ -6,7 +6,7 @@ import { DataStore } from "@api/index"; import { isPluginEnabled, plugins, startPlugin, stopPlugin } from "@api/PluginManager"; -import { SettingsStore } from "@api/Settings"; +import { Settings, SettingsStore } from "@api/Settings"; import { getUserSettingLazy } from "@api/UserSettings"; import { openPluginModal } from "@components/settings/tabs"; import { toggleEnabled } from "@equicordplugins/equicordHelper/utils"; @@ -18,7 +18,6 @@ import { Guild } from "@vencord/discord-types"; import { findByPropsLazy, findExportedComponentLazy, findStoreLazy } from "@webpack"; import { Alerts, ChannelActionCreators, ChannelRouter, ChannelStore, ComponentDispatch, FluxDispatcher, GuildStore, IconUtils, MediaEngineStore, MessageStore, NavigationRouter, React, ReadStateStore, ReadStateUtils, SelectedChannelStore, SelectedGuildStore, SettingsRouter, StreamerModeStore, Toasts, useEffect, UserStore, VoiceActions } from "@webpack/common"; import type { FC, ReactElement, ReactNode } from "react"; -import { Settings } from "Vencord"; import commandPalette from "."; import { diff --git a/src/equicordplugins/components.dev/index.tsx b/src/equicordplugins/components.dev/index.tsx index b740b2403..539ca46bb 100644 --- a/src/equicordplugins/components.dev/index.tsx +++ b/src/equicordplugins/components.dev/index.tsx @@ -18,6 +18,7 @@ import ComponentsTab from "./components/ComponentsTab"; export default definePlugin({ name: "Components", description: "Adds a new tab to settings to browse Discord components.", + tags: ["Appearance", "Customisation", "Console", "Developers", "Organisation"], authors: [Devs.prism], dependencies: ["Settings"], startAt: StartAt.WebpackReady, diff --git a/src/equicordplugins/contentWarning/index.tsx b/src/equicordplugins/contentWarning/index.tsx index cb2283c19..0c6982df5 100644 --- a/src/equicordplugins/contentWarning/index.tsx +++ b/src/equicordplugins/contentWarning/index.tsx @@ -152,6 +152,7 @@ export default definePlugin({ name: "ContentWarning", authors: [EquicordDevs.camila314], description: "Allows you to specify certain trigger words that will be blurred by default. Hovering/Clicking on the blurred content will reveal it.", + tags: ["Appearance", "Utility"], settings, patches: [ { diff --git a/src/equicordplugins/copyProfileColors/index.tsx b/src/equicordplugins/copyProfileColors/index.tsx index 256e86994..fb175839c 100644 --- a/src/equicordplugins/copyProfileColors/index.tsx +++ b/src/equicordplugins/copyProfileColors/index.tsx @@ -90,6 +90,7 @@ const userContextMenuPatch: NavContextMenuPatchCallback = (children, { user }) = export default definePlugin({ name: "CopyProfileColors", description: "A plugin to copy people's profile gradient colors to clipboard.", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.Crxa, EquicordDevs.Cortex], contextMenus: { "user-context": userContextMenuPatch, diff --git a/src/equicordplugins/copyStatusUrls/index.ts b/src/equicordplugins/copyStatusUrls/index.ts index c05692269..ff17bb6f0 100644 --- a/src/equicordplugins/copyStatusUrls/index.ts +++ b/src/equicordplugins/copyStatusUrls/index.ts @@ -23,6 +23,7 @@ const getMetadataFromApi: (activity: any, userId: string) => Promise = find export default definePlugin({ name: "CopyStatusUrls", description: "Copy the users status url when you right-click it", + tags: ["Activity", "Utility"], authors: [Devs.sadan], patches: [ diff --git a/src/equicordplugins/copyUserMention/index.tsx b/src/equicordplugins/copyUserMention/index.tsx index e11eda7e0..afcdaa55f 100644 --- a/src/equicordplugins/copyUserMention/index.tsx +++ b/src/equicordplugins/copyUserMention/index.tsx @@ -48,6 +48,7 @@ export default definePlugin({ name: "CopyUserMention", authors: [EquicordDevs.Cortex, Devs.castdrian], description: "Adds a button to copy user's mention on the user context menu, works best with ValidUser.", + tags: ["Chat", "Utility"], contextMenus: { "user-context": UserContextMenuPatch } diff --git a/src/equicordplugins/cursorBuddy/index.tsx b/src/equicordplugins/cursorBuddy/index.tsx index 478d41cb8..1bfb47a5c 100644 --- a/src/equicordplugins/cursorBuddy/index.tsx +++ b/src/equicordplugins/cursorBuddy/index.tsx @@ -235,8 +235,9 @@ migratePluginSettings("CursorBuddy", "Oneko", "oneko"); export default definePlugin({ name: "CursorBuddy", description: "Adds a sprite that follows your cursor.", + tags: ["Appearance", "Customisation", "Fun"], authors: [Devs.Ven, Devs.adryd, EquicordDevs.nexpid, EquicordDevs.ZcraftElite], - tags: ["Oneko", "FatassHorse", "Pet"], + searchTerms: ["Oneko", "FatassHorse", "Pet"], settings, isModified: true, diff --git a/src/equicordplugins/customFolderIcons/index.tsx b/src/equicordplugins/customFolderIcons/index.tsx index eecc37762..7c860d5f5 100644 --- a/src/equicordplugins/customFolderIcons/index.tsx +++ b/src/equicordplugins/customFolderIcons/index.tsx @@ -14,6 +14,7 @@ import { folderProp, int2rgba } from "./util"; export default definePlugin({ name: "CustomFolderIcons", description: "Customize folder icons with any png", + tags: ["Appearance", "Customisation", "Organisation"], authors: [EquicordDevs.sadan], settings, patches: [ diff --git a/src/equicordplugins/customSounds/index.tsx b/src/equicordplugins/customSounds/index.tsx index 7af13bd02..5a99fe1c5 100644 --- a/src/equicordplugins/customSounds/index.tsx +++ b/src/equicordplugins/customSounds/index.tsx @@ -393,6 +393,8 @@ export function findOverride(id: string): SoundOverride | null { export default definePlugin({ name: "CustomSounds", description: "Customize Discord's sounds.", + dependencies: ["AudioPlayerAPI"], + tags: ["Customisation", "Notifications", "Voice"], authors: [Devs.ScattrdBlade, Devs.TheKodeToad], settings, startAt: StartAt.Init, diff --git a/src/equicordplugins/customStatusTimeouts/index.tsx b/src/equicordplugins/customStatusTimeouts/index.tsx index 90b8eed4b..d76f258a1 100644 --- a/src/equicordplugins/customStatusTimeouts/index.tsx +++ b/src/equicordplugins/customStatusTimeouts/index.tsx @@ -54,6 +54,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomStatusTimeouts", description: "Adds configurable timeout presets to the status (presence) menu.", + tags: ["Activity", "Utility"], authors: [EquicordDevs.Kiri, EquicordDevs.thororen], settings, patches: [ diff --git a/src/equicordplugins/customTimestamps/index.tsx b/src/equicordplugins/customTimestamps/index.tsx index 9aa55258a..3db95fdf3 100644 --- a/src/equicordplugins/customTimestamps/index.tsx +++ b/src/equicordplugins/customTimestamps/index.tsx @@ -125,6 +125,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomTimestamps", description: "Custom timestamps on messages and tooltips", + tags: ["Appearance", "Customisation"], authors: [Devs.Rini, EquicordDevs.nvhhr, EquicordDevs.Suffocate, Devs.Obsidian], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/customUserColors/index.tsx b/src/equicordplugins/customUserColors/index.tsx index db4db60e5..55f92cf3f 100644 --- a/src/equicordplugins/customUserColors/index.tsx +++ b/src/equicordplugins/customUserColors/index.tsx @@ -100,6 +100,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomUserColors", description: "Lets you add a custom color to any user, anywhere! Highly recommend to use with typingTweaks and roleColorEverywhere", + tags: ["Appearance", "Customisation", "Chat"], authors: [EquicordDevs.mochienya], contextMenus: { "user-context": userContextMenuPatch, diff --git a/src/equicordplugins/declutter/index.tsx b/src/equicordplugins/declutter/index.tsx index e816d9159..ea2e628b6 100644 --- a/src/equicordplugins/declutter/index.tsx +++ b/src/equicordplugins/declutter/index.tsx @@ -141,6 +141,7 @@ function SectionSeparator(title: string) { export default definePlugin({ name: "Declutter", description: "Cleans up Discord by removing non-essential UI elements like profile effects, shop tabs, boosts, and more.", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.Leon135, Devs.prism, Devs.Kyuuhachi], settings, patches: [ diff --git a/src/equicordplugins/disableCameras/index.tsx b/src/equicordplugins/disableCameras/index.tsx index aa928134b..0acdfeb5a 100644 --- a/src/equicordplugins/disableCameras/index.tsx +++ b/src/equicordplugins/disableCameras/index.tsx @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableCameras", description: "Disables cameras in a call by default", + tags: ["Appearance", "Customisation", "Media", "Privacy"], authors: [Devs.Joona], patches: [ { diff --git a/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx b/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx index 48ef55064..10642d7e0 100644 --- a/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx +++ b/src/equicordplugins/discordDevBanner/components/makeDevBanner.tsx @@ -4,10 +4,10 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import SettingsPlugin from "@plugins/_core/settings"; import { detectClient } from "@plugins/_core/supportHelper"; import { gitHashShort } from "@shared/vencordUserAgent"; import { React } from "@webpack/common"; -import SettingsPlugin from "plugins/_core/settings"; import { JSX } from "react"; import { ChromiumIcon, ClientIcon, DevBannerIcon, DiscordIcon, ElectronIcon, EquicordIcon, names, settings } from "."; diff --git a/src/equicordplugins/discordDevBanner/index.tsx b/src/equicordplugins/discordDevBanner/index.tsx index 4e56bd288..febc2eb2a 100644 --- a/src/equicordplugins/discordDevBanner/index.tsx +++ b/src/equicordplugins/discordDevBanner/index.tsx @@ -14,6 +14,7 @@ import { makeDevBanner, settings } from "./components"; export default definePlugin({ name: "DiscordDevBanner", description: "Enables the Discord developer banner, in which displays the build-ID", + tags: ["Appearance", "Console", "Developers"], authors: [EquicordDevs.KrystalSkull, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/dragFavoriteEmotes/index.tsx b/src/equicordplugins/dragFavoriteEmotes/index.tsx index 2b8e6b096..f727028ae 100644 --- a/src/equicordplugins/dragFavoriteEmotes/index.tsx +++ b/src/equicordplugins/dragFavoriteEmotes/index.tsx @@ -45,6 +45,7 @@ export default definePlugin({ name: "DragFavoriteEmotes", authors: [EquicordDevs.PWall], description: "Adds the ability to change the order of your favourite emotes", + tags: ["Customisation", "Chat", "Emotes"], patches: [ { find: "#{intl::EMOJI_FAVORITE_TOOLTIP}", diff --git a/src/equicordplugins/dragify/index.tsx b/src/equicordplugins/dragify/index.tsx index d076ea7a7..bb1f3d63d 100644 --- a/src/equicordplugins/dragify/index.tsx +++ b/src/equicordplugins/dragify/index.tsx @@ -149,6 +149,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Dragify", description: "Drop users, channels, or servers into chat to insert mentions or invites.", + tags: ["Chat", "Servers", "Utility", "Voice"], authors: [EquicordDevs.justjxke], settings, diff --git a/src/equicordplugins/elementHighlighter.dev/index.tsx b/src/equicordplugins/elementHighlighter.dev/index.tsx index edbda06bb..c466b1449 100644 --- a/src/equicordplugins/elementHighlighter.dev/index.tsx +++ b/src/equicordplugins/elementHighlighter.dev/index.tsx @@ -449,6 +449,7 @@ function onToggle(e: KeyboardEvent) { export default definePlugin({ name: "ElementHighlighter", description: "Highlight and inspect elements easily.", + tags: ["Developers"], authors: [Devs.prism], settings, diff --git a/src/equicordplugins/equibopStreamFixes.equibop/index.tsx b/src/equicordplugins/equibopStreamFixes.equibop/index.tsx index fb9a99b3f..2f6341ca1 100644 --- a/src/equicordplugins/equibopStreamFixes.equibop/index.tsx +++ b/src/equicordplugins/equibopStreamFixes.equibop/index.tsx @@ -89,6 +89,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "EquibopStreamFixes", description: "Tries to fix stream quality on Equibop by patching Discord's encoder and quality restrictions.", + tags: ["Voice"], authors: [EquicordDevs.creations], settings, diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx index d7d082bb9..a73639e7f 100644 --- a/src/equicordplugins/equicordHelper/index.tsx +++ b/src/equicordplugins/equicordHelper/index.tsx @@ -133,6 +133,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "EquicordHelper", description: "Used to provide support, fix discord caused crashes, and other misc features.", + tags: ["Appearance", "Commands", "Utility"], + dependencies: ["CommandsAPI", "HeaderBarAPI", "MessageAccessoriesAPI"], authors: [ Devs.thororen, EquicordDevs.nyx, diff --git a/src/equicordplugins/equicordToolbox/index.tsx b/src/equicordplugins/equicordToolbox/index.tsx index 5a6b32394..f2e9542f7 100644 --- a/src/equicordplugins/equicordToolbox/index.tsx +++ b/src/equicordplugins/equicordToolbox/index.tsx @@ -77,11 +77,10 @@ migratePluginSettings("EquicordToolbox", "VencordToolbox"); export default definePlugin({ name: "EquicordToolbox", description: "Adds a button next to the inbox button in the channel header that houses Equicord quick actions", + tags: ["Voice", "Accessibility"], authors: [Devs.Ven, Devs.AutumnVN], dependencies: ["HeaderBarAPI"], - settings, - headerBarButton: { icon: Icon, render: VencordPopoutButton, diff --git a/src/equicordplugins/equissant/index.ts b/src/equicordplugins/equissant/index.ts index 188316213..b5b4ad4bd 100644 --- a/src/equicordplugins/equissant/index.ts +++ b/src/equicordplugins/equissant/index.ts @@ -33,6 +33,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Equissant", description: "Crossant every specified amount of clicks :trolley:", + tags: ["Fun"], authors: [EquicordDevs.SomeAspy, Devs.thororen], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/exitSounds/index.tsx b/src/equicordplugins/exitSounds/index.tsx index db67fe6ed..4273c32e0 100644 --- a/src/equicordplugins/exitSounds/index.tsx +++ b/src/equicordplugins/exitSounds/index.tsx @@ -104,6 +104,7 @@ let original: typeof ChannelActions.selectVoiceChannel; export default definePlugin({ name: "ExitSounds", description: "Play soundboard sounds when you disconnect from voice.", + tags: ["Fun", "Voice"], authors: [Devs.prism], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/exportMessages/index.tsx b/src/equicordplugins/exportMessages/index.tsx index d2d3d68f5..ec3accf62 100644 --- a/src/equicordplugins/exportMessages/index.tsx +++ b/src/equicordplugins/exportMessages/index.tsx @@ -129,6 +129,7 @@ function getUsernames(contacts: ContactsList[], type: number): string[] { export default definePlugin({ name: "ExportMessages", description: "Allows you to export any message to a file", + tags: ["Chat", "Utility"], authors: [EquicordDevs.veygax, EquicordDevs.dat_insanity], settings, contextMenus: { diff --git a/src/equicordplugins/fastDeleteChannels/index.tsx b/src/equicordplugins/fastDeleteChannels/index.tsx index e4b20c200..adff9bea7 100644 --- a/src/equicordplugins/fastDeleteChannels/index.tsx +++ b/src/equicordplugins/fastDeleteChannels/index.tsx @@ -74,6 +74,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FastDeleteChannels", description: "Adds a trash icon to delete channels", + tags: ["Servers", "Utility"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/favouriteAnything/index.tsx b/src/equicordplugins/favouriteAnything/index.tsx index b9d094962..9aaa3c214 100644 --- a/src/equicordplugins/favouriteAnything/index.tsx +++ b/src/equicordplugins/favouriteAnything/index.tsx @@ -25,8 +25,9 @@ export const AttachmentContext = proxyLazyWebpack(() => React.createContext; } -function supportsToBase64(array: Uint8Array): array is Uint8ArrayExtended { +function supportsToBase64(array: Uint8Array): boolean { return "toBase64" in array && typeof array.toBase64 === "function"; } diff --git a/src/equicordplugins/fileUpload/index.tsx b/src/equicordplugins/fileUpload/index.tsx index e06d504a8..959b56949 100644 --- a/src/equicordplugins/fileUpload/index.tsx +++ b/src/equicordplugins/fileUpload/index.tsx @@ -216,6 +216,7 @@ const channelAttachMenuPatch: NavContextMenuPatchCallback = (children, props) => export default definePlugin({ name: "FileUpload", description: "Upload images and videos to file hosting services like Zipline and Nest", + tags: ["Media"], authors: [EquicordDevs.creations, EquicordDevs.keircn, Devs.ScattrdBlade], settings, patches: [ diff --git a/src/equicordplugins/findReply/index.tsx b/src/equicordplugins/findReply/index.tsx index e76cf8f69..33c28ba8f 100644 --- a/src/equicordplugins/findReply/index.tsx +++ b/src/equicordplugins/findReply/index.tsx @@ -89,6 +89,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FindReply", description: "Jumps to the earliest reply to a message in a channel (lets you follow past conversations more easily).", + dependencies: ["MessagePopoverAPI"], + tags: ["Chat", "Shortcuts"], authors: [Devs.newwares], settings, messagePopoverButton: { diff --git a/src/equicordplugins/fixFileExtensions/index.tsx b/src/equicordplugins/fixFileExtensions/index.tsx index 489f4d5e5..0c2f3a2d7 100644 --- a/src/equicordplugins/fixFileExtensions/index.tsx +++ b/src/equicordplugins/fixFileExtensions/index.tsx @@ -29,6 +29,7 @@ export default definePlugin({ name: "FixFileExtensions", authors: [Devs.thororen], description: "Fixes file extensions by renaming them to a compatible supported format if possible", + tags: ["Media", "Utility"], reporterTestable: ReporterTestable.None, patches: [ // Taken from AnonymiseFileNames diff --git a/src/equicordplugins/followVoiceUser/index.tsx b/src/equicordplugins/followVoiceUser/index.tsx index 18ef15244..56f242166 100644 --- a/src/equicordplugins/followVoiceUser/index.tsx +++ b/src/equicordplugins/followVoiceUser/index.tsx @@ -74,6 +74,7 @@ const UserContextMenuPatch: NavContextMenuPatchCallback = (children, { channel, export default definePlugin({ name: "FollowVoiceUser", description: "Follow a friend in voice chat.", + tags: ["Voice"], authors: [EquicordDevs.TheArmagan], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/fontLoader/index.tsx b/src/equicordplugins/fontLoader/index.tsx index f81c1d9a5..aab6f31f3 100644 --- a/src/equicordplugins/fontLoader/index.tsx +++ b/src/equicordplugins/fontLoader/index.tsx @@ -200,6 +200,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FontLoader", description: "Loads any font from Google Fonts", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.vmohammad], settings, diff --git a/src/equicordplugins/forwardAnywhere/index.ts b/src/equicordplugins/forwardAnywhere/index.ts index 4b1a4dd4e..0404c4acf 100644 --- a/src/equicordplugins/forwardAnywhere/index.ts +++ b/src/equicordplugins/forwardAnywhere/index.ts @@ -25,6 +25,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "ForwardAnywhere", description: "If a forward fails send it as a normal message also allows nsfw forwards", + tags: ["Chat", "Utility"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/frequentQuickSwitcher/index.tsx b/src/equicordplugins/frequentQuickSwitcher/index.tsx index c2d61a11e..f6c2a3770 100644 --- a/src/equicordplugins/frequentQuickSwitcher/index.tsx +++ b/src/equicordplugins/frequentQuickSwitcher/index.tsx @@ -37,6 +37,7 @@ function generateSearchResults(query) { export default definePlugin({ name: "FrequentQuickSwitcher", description: "Rewrites and filters the quick switcher results to be your most frequent channels", + tags: ["Shortcuts", "Servers"], authors: [Devs.Samwich], generateSearchResults: generateSearchResults, patches: [ diff --git a/src/equicordplugins/friendCodes/index.tsx b/src/equicordplugins/friendCodes/index.tsx index 8168cfe04..9997a8347 100644 --- a/src/equicordplugins/friendCodes/index.tsx +++ b/src/equicordplugins/friendCodes/index.tsx @@ -12,6 +12,7 @@ import FriendCodesPanel from "./FriendCodesPanel"; export default definePlugin({ name: "FriendCodes", description: "Generate FriendCodes to easily add friends", + tags: ["Friends", "Utility"], authors: [Devs.HypedDomi], patches: [ { diff --git a/src/equicordplugins/friendTags/index.tsx b/src/equicordplugins/friendTags/index.tsx index 0f893cdb8..520fafda4 100644 --- a/src/equicordplugins/friendTags/index.tsx +++ b/src/equicordplugins/friendTags/index.tsx @@ -209,6 +209,7 @@ const userPatch: NavContextMenuPatchCallback = (children, { user }) => { export default definePlugin({ name: "FriendTags", description: "Allows you to filter by custom tags in the quick switcher by starting a search with &", + tags: ["Shortcuts"], authors: [Devs.Samwich], settings, contextMenus: { diff --git a/src/equicordplugins/friendshipRanks/index.tsx b/src/equicordplugins/friendshipRanks/index.tsx index 9294c9f61..ff91f1cbd 100644 --- a/src/equicordplugins/friendshipRanks/index.tsx +++ b/src/equicordplugins/friendshipRanks/index.tsx @@ -143,6 +143,7 @@ function getBadgesToApply() { export default definePlugin({ name: "FriendshipRanks", description: "Adds badges showcasing how long you have been friends with a user for", + tags: ["Friends"], authors: [Devs.Samwich], start() { getBadgesToApply().forEach(b => Badges.addProfileBadge(b)); diff --git a/src/equicordplugins/fullVcPfp/index.tsx b/src/equicordplugins/fullVcPfp/index.tsx index f1664da80..09c9fec27 100644 --- a/src/equicordplugins/fullVcPfp/index.tsx +++ b/src/equicordplugins/fullVcPfp/index.tsx @@ -14,6 +14,7 @@ import style from "./style.css?managed"; export default definePlugin({ name: "FullVCPFP", description: "Makes avatars take up the entire vc tile", + tags: ["Appearance", "Voice"], authors: [EquicordDevs.mochienya], patches: [ { diff --git a/src/equicordplugins/ghosted/index.tsx b/src/equicordplugins/ghosted/index.tsx index 921970696..ca2b504d9 100644 --- a/src/equicordplugins/ghosted/index.tsx +++ b/src/equicordplugins/ghosted/index.tsx @@ -147,6 +147,7 @@ function makeContextItem(props) { export default definePlugin({ name: "Ghosted", description: "A cute ghost will appear if you don't answer their DMs", + tags: ["Chat", "Utility"], authors: [EquicordDevs.vei, Devs.sadan, EquicordDevs.justjxke, EquicordDevs.iamme], settings, dependencies: ["AudioPlayerAPI", "ServerListAPI"], diff --git a/src/equicordplugins/gifCollections/index.tsx b/src/equicordplugins/gifCollections/index.tsx index 8bfc180d7..92c3ac962 100644 --- a/src/equicordplugins/gifCollections/index.tsx +++ b/src/equicordplugins/gifCollections/index.tsx @@ -26,6 +26,7 @@ let oldTrendingCat: Category[] | null = null; export default definePlugin({ name: "GifCollections", description: "Allows you to create collections of gifs.", + tags: ["Chat", "Emotes"], authors: [EquicordDevs.creations], settings, contextMenus: { diff --git a/src/equicordplugins/githubRepos/index.tsx b/src/equicordplugins/githubRepos/index.tsx index 75f566a82..cb2b3d58b 100644 --- a/src/equicordplugins/githubRepos/index.tsx +++ b/src/equicordplugins/githubRepos/index.tsx @@ -38,6 +38,8 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "GitHubRepos", description: "Displays a user's public GitHub repositories in their profile", + dependencies: ["ProfileCollectionsAPI"], + tags: ["Appearance"], authors: [EquicordDevs.talhakf, EquicordDevs.Panniku, EquicordDevs.benjii], settings, diff --git a/src/equicordplugins/globalBadges/index.tsx b/src/equicordplugins/globalBadges/index.tsx index 24802395a..53e772f9a 100644 --- a/src/equicordplugins/globalBadges/index.tsx +++ b/src/equicordplugins/globalBadges/index.tsx @@ -25,6 +25,7 @@ migratePluginSetting("GlobalBadges", "showRaincord", "showRa1ncord"); export default definePlugin({ name: "GlobalBadges", description: "Adds global badges from other client mods", + tags: ["Appearance"], authors: [Devs.HypedDomi, EquicordDevs.Wolfie, Devs.thororen], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/googleThat/index.tsx b/src/equicordplugins/googleThat/index.tsx index 18f6753c3..3f924d419 100644 --- a/src/equicordplugins/googleThat/index.tsx +++ b/src/equicordplugins/googleThat/index.tsx @@ -75,8 +75,10 @@ const settings = definePluginSettings({ export default definePlugin({ name: "GoogleThat", description: "Adds a command to send a internet search link", + dependencies: ["CommandsAPI"], + tags: ["Commands", "Utility"], authors: [Devs.Samwich, EquicordDevs.KrystalSkull], - tags: ["search", "google", "query", "duckduckgo", "command"], + searchTerms: ["search", "google", "query", "duckduckgo", "command"], settings, commands: [ { diff --git a/src/equicordplugins/guildPickerDumper/index.tsx b/src/equicordplugins/guildPickerDumper/index.tsx index 58892bf73..fe9e86b39 100644 --- a/src/equicordplugins/guildPickerDumper/index.tsx +++ b/src/equicordplugins/guildPickerDumper/index.tsx @@ -95,6 +95,7 @@ async function zipGuildAssets(guild: Guild, type: "emojis" | "stickers") { export default definePlugin({ name: "GuildPickerDumper", description: "Context menu to dump and download a server's emojis and stickers.", + tags: ["Emotes", "Servers", "Utility"], authors: [EquicordDevs.Cortex, Devs.Samwich, EquicordDevs.Synth, Devs.thororen], contextMenus: { "guild-context": Patch, diff --git a/src/equicordplugins/hideChatButtons/index.tsx b/src/equicordplugins/hideChatButtons/index.tsx index 2a942ecd5..7d8d5f989 100644 --- a/src/equicordplugins/hideChatButtons/index.tsx +++ b/src/equicordplugins/hideChatButtons/index.tsx @@ -81,6 +81,7 @@ function ButtonsInnerComponent({ buttons }: { buttons: ReactNode; }) { export default definePlugin({ name: "HideChatButtons", description: "Able to hide the chat buttons", + tags: ["Chat", "Utility"], settings: settings, authors: [EquicordDevs.iamme], patches: [ diff --git a/src/equicordplugins/hideMessages/index.tsx b/src/equicordplugins/hideMessages/index.tsx index ca5feb6bd..dd7bf8538 100644 --- a/src/equicordplugins/hideMessages/index.tsx +++ b/src/equicordplugins/hideMessages/index.tsx @@ -49,6 +49,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "HideMessages", description: "A plugin to temporarily hide messages until you restart.", + dependencies: ["MessagePopoverAPI"], + tags: ["Chat", "Utility"], authors: [EquicordDevs.yash], contextMenus: { "message": messageCtxPatch diff --git a/src/equicordplugins/hideServers/index.tsx b/src/equicordplugins/hideServers/index.tsx index 054c9ecac..8de222d2f 100644 --- a/src/equicordplugins/hideServers/index.tsx +++ b/src/equicordplugins/hideServers/index.tsx @@ -76,8 +76,9 @@ export function removeIndicator() { export default definePlugin({ name: "HideServers", description: "Allows you to hide servers from the guild list and quick switcher by right clicking them", + tags: ["Servers", "Utility"], authors: [EquicordDevs.bep], - tags: ["guild", "server", "hide", "folder"], + searchTerms: ["guild", "server", "hide", "folder"], dependencies: ["ServerListAPI"], contextMenus: { diff --git a/src/equicordplugins/holyNotes/index.tsx b/src/equicordplugins/holyNotes/index.tsx index f98001b74..e4a57e819 100644 --- a/src/equicordplugins/holyNotes/index.tsx +++ b/src/equicordplugins/holyNotes/index.tsx @@ -72,6 +72,8 @@ function ToolBarHeader() { export default definePlugin({ name: "HolyNotes", description: "Save messages as notes to revisit later", + dependencies: ["MessagePopoverAPI", "HeaderBarAPI"], + tags: ["Chat", "Organisation"], authors: [EquicordDevs.Wolfie], toolboxActions: { diff --git a/src/equicordplugins/homeTyping/index.tsx b/src/equicordplugins/homeTyping/index.tsx index 83fa1c0b9..0d652c337 100644 --- a/src/equicordplugins/homeTyping/index.tsx +++ b/src/equicordplugins/homeTyping/index.tsx @@ -18,6 +18,7 @@ const PrivateChannelSortStore = findStoreLazy("PrivateChannelSortStore") as { ge export default definePlugin({ name: "HomeTyping", description: "Changes the home button to a typing indicator if someone in your dms is typing", + tags: ["Chat"], authors: [Devs.Samwich], TypingIcon() { return ; diff --git a/src/equicordplugins/hopOn/index.tsx b/src/equicordplugins/hopOn/index.tsx index cd0de30ed..a9a2b15a6 100644 --- a/src/equicordplugins/hopOn/index.tsx +++ b/src/equicordplugins/hopOn/index.tsx @@ -32,6 +32,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "HopOn", description: "Hop on! Opens a configurable URL when a message matches a custom regex in the current channel.", + tags: ["Fun"], authors: [Devs.ImLvna], settings, flux: { diff --git a/src/equicordplugins/husk/index.tsx b/src/equicordplugins/husk/index.tsx index 25aad8e37..2596bb8a8 100644 --- a/src/equicordplugins/husk/index.tsx +++ b/src/equicordplugins/husk/index.tsx @@ -99,6 +99,8 @@ function getEmojiIdThatShouldBeUsed(guildId: string) { export default definePlugin({ name: "Husk", description: "Adds Husk button (check settings to change used emoji)", + dependencies: ["MessagePopoverAPI"], + tags: ["Emotes", "Fun"], authors: [Devs.nin0dev], settings, messagePopoverButton: { diff --git a/src/equicordplugins/iRememberYou/index.tsx b/src/equicordplugins/iRememberYou/index.tsx index dc9f62b57..2a469c2e2 100644 --- a/src/equicordplugins/iRememberYou/index.tsx +++ b/src/equicordplugins/iRememberYou/index.tsx @@ -19,6 +19,7 @@ import DataUI from "./components/ui"; export default definePlugin({ name: "IRememberYou", description: "Locally saves everyone you've been communicating with (including servers), in case of lose", + tags: ["Chat", "Servers"], authors: [EquicordDevs.zoodogood, EquicordDevs.keircn], dependencies: ["MessageEventsAPI"], diff --git a/src/equicordplugins/iconViewer/index.tsx b/src/equicordplugins/iconViewer/index.tsx index 1f364adf5..6df0d72f1 100644 --- a/src/equicordplugins/iconViewer/index.tsx +++ b/src/equicordplugins/iconViewer/index.tsx @@ -19,6 +19,7 @@ import { SettingsAbout } from "./components/Modals"; export default definePlugin({ name: "IconViewer", description: "Adds a new tab to settings to preview all icons.", + tags: ["Developers"], authors: [EquicordDevs.iamme], dependencies: ["Settings"], startAt: StartAt.WebpackReady, diff --git a/src/equicordplugins/idleAutoRestart/index.tsx b/src/equicordplugins/idleAutoRestart/index.tsx index 2112f671f..33d11e2eb 100644 --- a/src/equicordplugins/idleAutoRestart/index.tsx +++ b/src/equicordplugins/idleAutoRestart/index.tsx @@ -36,6 +36,7 @@ function onActivity() { export default definePlugin({ name: "IdleAutoRestart", description: "Automatically restarts the client after being idle for a configurable amount of time, but avoids restarting while you are in VC.", + tags: ["Utility"], authors: [EquicordDevs.SteelTech], settings, diff --git a/src/equicordplugins/ignoreCalls/index.tsx b/src/equicordplugins/ignoreCalls/index.tsx index 2505ce860..1a448fb7b 100644 --- a/src/equicordplugins/ignoreCalls/index.tsx +++ b/src/equicordplugins/ignoreCalls/index.tsx @@ -93,6 +93,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "IgnoreCalls", description: "Allows you to ignore calls from specific users or dm groups.", + tags: ["Voice"], authors: [EquicordDevs.TheArmagan, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/inRole/index.tsx b/src/equicordplugins/inRole/index.tsx index 755f9219c..847688f73 100644 --- a/src/equicordplugins/inRole/index.tsx +++ b/src/equicordplugins/inRole/index.tsx @@ -34,8 +34,9 @@ function getMembersInRole(roleId: string, guildId: string) { export default definePlugin({ name: "InRole", description: "Know who is in a role with the role context menu or /inrole command (read plugin info!)", + tags: ["Commands", "Roles"], authors: [Devs.nin0dev], - dependencies: ["UserSettingsAPI"], + dependencies: ["UserSettingsAPI", "CommandsAPI"], start() { // DeveloperMode needs to be enabled for the context menu to be shown DeveloperMode.updateSetting(true); diff --git a/src/equicordplugins/ingtoninator/index.tsx b/src/equicordplugins/ingtoninator/index.tsx index 43013fc4f..00a4909b0 100644 --- a/src/equicordplugins/ingtoninator/index.tsx +++ b/src/equicordplugins/ingtoninator/index.tsx @@ -146,6 +146,8 @@ function disabledIcon() { export default definePlugin({ name: "Ingtoninator", description: "Suffixes 'ington' to a random word in your message", + dependencies: ["ChatInputButtonAPI"], + tags: ["Fun"], authors: [EquicordDevs.zyqunix, EquicordDevs.BioTomateDE], settings, chatBarButton: { diff --git a/src/equicordplugins/instantScreenshare/index.tsx b/src/equicordplugins/instantScreenshare/index.tsx index 1d0160048..b947da3c1 100644 --- a/src/equicordplugins/instantScreenshare/index.tsx +++ b/src/equicordplugins/instantScreenshare/index.tsx @@ -62,9 +62,10 @@ async function autoStartStream(instant = true) { export default definePlugin({ name: "InstantScreenshare", description: "Instantly screenshare when joining a voice channel with support for desktop sources, windows, and video input devices (cameras, capture cards)", + tags: ["Media", "Voice"], authors: [Devs.HAHALOSAH, Devs.thororen, EquicordDevs.mart], dependencies: ["EquicordToolbox"], - tags: ["ScreenshareKeybind"], + searchTerms: ["ScreenshareKeybind"], autoStartStream, settings, diff --git a/src/equicordplugins/invisibleChat.desktop/index.tsx b/src/equicordplugins/invisibleChat.desktop/index.tsx index 5589f8dec..c45149141 100644 --- a/src/equicordplugins/invisibleChat.desktop/index.tsx +++ b/src/equicordplugins/invisibleChat.desktop/index.tsx @@ -149,8 +149,9 @@ export async function buildEmbed(message: any, revealed: string): Promise export default definePlugin({ name: "InvisibleChat", description: "Encrypt your Messages in a non-suspicious way!", + tags: ["Chat"], authors: [Devs.SammCheese], - dependencies: ["MessageUpdaterAPI"], + dependencies: ["MessageUpdaterAPI", "ChatInputButtonAPI", "MessagePopoverAPI"], reporterTestable: ReporterTestable.Patches, settings, diff --git a/src/equicordplugins/inviteDefaults/index.ts b/src/equicordplugins/inviteDefaults/index.ts index 597c96fec..476651731 100644 --- a/src/equicordplugins/inviteDefaults/index.ts +++ b/src/equicordplugins/inviteDefaults/index.ts @@ -45,6 +45,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "InviteDefaults", description: "Allows you to edit the default values when creating server invites.", + tags: ["Servers"], authors: [EquicordDevs.VillainsRule], settings, patches: [ diff --git a/src/equicordplugins/jumpTo/index.tsx b/src/equicordplugins/jumpTo/index.tsx index 537d9c19f..791b2a93b 100644 --- a/src/equicordplugins/jumpTo/index.tsx +++ b/src/equicordplugins/jumpTo/index.tsx @@ -121,6 +121,7 @@ const MessageMenuPatch: NavContextMenuPatchCallback = (children, { message }: { export default definePlugin({ name: "JumpTo", description: "Adds context menu options to jump to the start or bottom of a channel/DM.", + tags: ["Chat", "Utility"], authors: [Devs.Samwich, Devs.thororen], contextMenus: { "channel-context": ChannelMenuPatch, diff --git a/src/equicordplugins/jumpscare/index.tsx b/src/equicordplugins/jumpscare/index.tsx index 5a8e4d531..8070cfd13 100644 --- a/src/equicordplugins/jumpscare/index.tsx +++ b/src/equicordplugins/jumpscare/index.tsx @@ -48,6 +48,7 @@ function getJumpscareRoot(): Root { export default definePlugin({ name: "Jumpscare", description: "Adds a configurable chance of jumpscaring you whenever you open a channel. Inspired by Geometry Dash Mega Hack", + tags: ["Fun"], authors: [Devs.surgedevs], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/keyboardNavigation/index.tsx b/src/equicordplugins/keyboardNavigation/index.tsx index f0c6e8d2a..852edafa6 100644 --- a/src/equicordplugins/keyboardNavigation/index.tsx +++ b/src/equicordplugins/keyboardNavigation/index.tsx @@ -87,6 +87,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "KeyboardNavigation", description: "Allows you to navigate the UI with a keyboard.", + tags: ["Accessibility", "Shortcuts"], authors: [Devs.Ethan], settings, diff --git a/src/equicordplugins/keyboardSounds/index.ts b/src/equicordplugins/keyboardSounds/index.ts index 14c8018ff..e85262bdd 100644 --- a/src/equicordplugins/keyboardSounds/index.ts +++ b/src/equicordplugins/keyboardSounds/index.ts @@ -126,6 +126,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "KeyboardSounds", description: "Adds OperaGX or osu! sound effects when typing on your keyboard.", + tags: ["Fun"], authors: [Devs.HypedDomi, EquicordDevs.Etorix], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/keywordNotify/index.tsx b/src/equicordplugins/keywordNotify/index.tsx index 10b08dddb..5b7664e03 100644 --- a/src/equicordplugins/keywordNotify/index.tsx +++ b/src/equicordplugins/keywordNotify/index.tsx @@ -318,6 +318,7 @@ export default definePlugin({ name: "KeywordNotify", authors: [EquicordDevs.camila314, EquicordDevs.x3rt], description: "Sends a notification if a given message matches certain keywords or regexes", + tags: ["Chat", "Notifications"], settings, patches: [ { diff --git a/src/equicordplugins/lastActive/index.tsx b/src/equicordplugins/lastActive/index.tsx index 9e8333a5e..9ca7a035c 100644 --- a/src/equicordplugins/lastActive/index.tsx +++ b/src/equicordplugins/lastActive/index.tsx @@ -135,6 +135,7 @@ export function LastActiveIcon() { export default definePlugin({ name: "LastActive", description: "A plugin to jump to last active message from yourself or another user in a channel/server.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.Crxa], contextMenus: { "channel-context": ChannelContextMenuPatch, diff --git a/src/equicordplugins/loginWithQR/index.tsx b/src/equicordplugins/loginWithQR/index.tsx index 21f1c7c9d..e1f076aa2 100644 --- a/src/equicordplugins/loginWithQR/index.tsx +++ b/src/equicordplugins/loginWithQR/index.tsx @@ -42,6 +42,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LoginWithQR", description: "Allows you to login to another device by scanning a login QR code, just like on mobile!", + tags: ["Utility"], authors: [EquicordDevs.nexpid], settings, diff --git a/src/equicordplugins/mediaPlaybackSpeed/index.tsx b/src/equicordplugins/mediaPlaybackSpeed/index.tsx index 42edab6e7..086f2f1e2 100644 --- a/src/equicordplugins/mediaPlaybackSpeed/index.tsx +++ b/src/equicordplugins/mediaPlaybackSpeed/index.tsx @@ -48,6 +48,7 @@ type MediaRef = RefObject | undefined; export default definePlugin({ name: "MediaPlaybackSpeed", description: "Allows changing the (default) playback speed of media embeds", + tags: ["Chat", "Media"], authors: [Devs.D3SOX], settings, patches: [ diff --git a/src/equicordplugins/messageBurst/index.ts b/src/equicordplugins/messageBurst/index.ts index 0d60216c8..18f8d6060 100644 --- a/src/equicordplugins/messageBurst/index.ts +++ b/src/equicordplugins/messageBurst/index.ts @@ -66,6 +66,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "MessageBurst", description: "Merges messages sent within a time period with your previous sent message if no one else sends a message before you.", + dependencies: ["MessagePopoverAPI"], + tags: ["Chat"], authors: [EquicordDevs.port22exposed], settings, onBeforeMessageSend(channelId, message) { diff --git a/src/equicordplugins/messageColors/index.tsx b/src/equicordplugins/messageColors/index.tsx index 568718102..5217971a8 100644 --- a/src/equicordplugins/messageColors/index.tsx +++ b/src/equicordplugins/messageColors/index.tsx @@ -27,6 +27,7 @@ export default definePlugin({ authors: [EquicordDevs.Hen], name: "MessageColors", description: "Displays color codes like #FF0042 inside of messages", + tags: ["Appearance", "Chat"], settings, patches: [ // Create a new markdown rule, so it parses just like any other features diff --git a/src/equicordplugins/messageFetchTimer/index.tsx b/src/equicordplugins/messageFetchTimer/index.tsx index 139a35209..a0622668d 100644 --- a/src/equicordplugins/messageFetchTimer/index.tsx +++ b/src/equicordplugins/messageFetchTimer/index.tsx @@ -147,6 +147,8 @@ function handleMessageLoad(data: any) { export default definePlugin({ name: "MessageFetchTimer", description: "Shows how long it took to fetch messages for the current channel", + dependencies: ["ChatInputButtonAPI"], + tags: ["Chat", "Utility"], authors: [EquicordDevs.GroupXyz], settings, diff --git a/src/equicordplugins/messageLinkTooltip/index.tsx b/src/equicordplugins/messageLinkTooltip/index.tsx index 87f97581a..8e0d053f7 100644 --- a/src/equicordplugins/messageLinkTooltip/index.tsx +++ b/src/equicordplugins/messageLinkTooltip/index.tsx @@ -62,6 +62,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "MessageLinkTooltip", description: "Adds a tooltip with a message preview when hovering over message links, replies, and forwarded messages.", + tags: ["Appearance", "Chat"], authors: [Devs.Kyuuhachi], settings, diff --git a/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx b/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx index 1d28a6348..3fa47d67b 100644 --- a/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/components/LogsModal.tsx @@ -17,7 +17,7 @@ import { find, findByCode, findByCodeLazy } from "@webpack"; import { Alerts, ChannelStore, ContextMenuApi, FluxDispatcher, GuildStore, Menu, NavigationRouter, React, TabBar, TextInput, Tooltip, useMemo, useRef, useState } from "@webpack/common"; import { DBMessageRecord, deleteMessageIDB, deleteMessagesBulkIDB } from "../db"; -import { clearLogs, cl, settings } from "../index"; +import { cl, clearLogs, settings } from "../index"; import { LoggedMessage, LoggedMessageJSON } from "../types"; import { messageJsonToMessageClass } from "../utils"; import { importLogs } from "../utils/settingsUtils"; diff --git a/src/equicordplugins/messageLoggerEnhanced/index.tsx b/src/equicordplugins/messageLoggerEnhanced/index.tsx index e8b3cdab9..2abe5c7df 100644 --- a/src/equicordplugins/messageLoggerEnhanced/index.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/index.tsx @@ -18,8 +18,8 @@ import { FluxDispatcher, MessageStore, SelectedChannelStore, UserStore } from "@ import { LogsIcon, OpenLogsButton } from "./components/LogsButton"; import { openLogModal } from "./components/LogsModal"; import * as idb from "./db"; -import { addMessage } from "./LoggedMessageManager"; import * as LoggedMessageManager from "./LoggedMessageManager"; +import { addMessage } from "./LoggedMessageManager"; import { settings } from "./settings"; import { FetchMessagesResponse, LoadMessagePayload, LoggedMessage, LoggedMessageJSON, MessageCreatePayload, MessageDeleteBulkPayload, MessageDeletePayload, MessageUpdatePayload } from "./types"; import { cleanUpCachedMessage, cleanupUserObject, getNative, isGhostPinged, mapTimestamp, messageJsonToMessageClass, reAddDeletedMessages } from "./utils"; @@ -258,7 +258,8 @@ export default definePlugin({ name: "MessageLoggerEnhanced", authors: [Devs.Aria, EquicordDevs.keircn], description: "Improves MessageLogger with edited message history, ghost ping detection and more", - dependencies: ["MessageLogger"], + tags: ["Chat", "Servers"], + dependencies: ["MessageLogger", "HeaderBarAPI"], patches: [ { diff --git a/src/equicordplugins/messageLoggerEnhanced/settings.tsx b/src/equicordplugins/messageLoggerEnhanced/settings.tsx index fce7de8b8..1c39df9e4 100644 --- a/src/equicordplugins/messageLoggerEnhanced/settings.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/settings.tsx @@ -4,12 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { definePluginSettings } from "@api/Settings"; +import { definePluginSettings, Settings } from "@api/Settings"; import { Button } from "@components/Button"; import ErrorBoundary from "@components/ErrorBoundary"; import { OptionType } from "@utils/types"; import { Alerts, useState } from "@webpack/common"; -import { Settings } from "Vencord"; import { clearLogs, Native } from "."; import { ImageCacheDir, LogsDir } from "./components/FolderSelectInput"; diff --git a/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts b/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts index 64c6d9d03..0d59e56ab 100644 --- a/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts +++ b/src/equicordplugins/messageLoggerEnhanced/utils/settingsUtils.ts @@ -21,7 +21,7 @@ import { chooseFile as chooseFileWeb } from "@utils/web"; import { Toasts } from "@webpack/common"; import { showSaveFilePicker } from "native-file-system-adapter"; -import { Native, clearLogs } from ".."; +import { clearLogs,Native } from ".."; import { addMessagesBulkIDB, iterateAllMessagesIDB } from "../db"; import { LoggedMessageJSON } from "../types"; diff --git a/src/equicordplugins/messageNotifier/index.ts b/src/equicordplugins/messageNotifier/index.ts index 7a41158d0..af9cee4b6 100644 --- a/src/equicordplugins/messageNotifier/index.ts +++ b/src/equicordplugins/messageNotifier/index.ts @@ -38,6 +38,7 @@ export default definePlugin({ authors: [EquicordDevs.cassie, EquicordDevs.mochienya], name: "MessageNotifier", description: "Get toasts for when chosen users send a message", + tags: ["Chat", "Notifications"], settings, flux: { MESSAGE_CREATE({ message, channelId, guildId }: MessageCreatePayload) { diff --git a/src/equicordplugins/messagePeek/index.tsx b/src/equicordplugins/messagePeek/index.tsx index 340552eac..564838146 100644 --- a/src/equicordplugins/messagePeek/index.tsx +++ b/src/equicordplugins/messagePeek/index.tsx @@ -239,6 +239,8 @@ function shouldShowActivity(lastMessage: Message | undefined, hasActivity: boole export default definePlugin({ name: "MessagePeek", description: "Shows the last message preview and timestamp in the Direct Messages list.", + dependencies: ["MemberListDecoratorsAPI"], + tags: ["Appearance", "Chat"], authors: [Devs.prism, EquicordDevs.justjxke], settings, patches: [ diff --git a/src/equicordplugins/messageTranslate/index.tsx b/src/equicordplugins/messageTranslate/index.tsx index 68adbbd0b..64b7f50d2 100644 --- a/src/equicordplugins/messageTranslate/index.tsx +++ b/src/equicordplugins/messageTranslate/index.tsx @@ -51,6 +51,7 @@ function triggerReRender(message: MessageWithContent) { export default definePlugin({ name: "MessageTranslate", description: "Auto translate messages to your language with caching, per-channel toggles, and more options.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.creations], settings, diff --git a/src/equicordplugins/micLoopbackTester/index.tsx b/src/equicordplugins/micLoopbackTester/index.tsx index f0f249fd6..8e0a27a60 100644 --- a/src/equicordplugins/micLoopbackTester/index.tsx +++ b/src/equicordplugins/micLoopbackTester/index.tsx @@ -115,6 +115,7 @@ const MicLoopbackUserAreaButton: UserAreaButtonFactory = props => { flexGrow: 1 }}> { try { diff --git a/src/equicordplugins/moreStickers/index.tsx b/src/equicordplugins/moreStickers/index.tsx index 97bfbdaee..5a1114ba3 100644 --- a/src/equicordplugins/moreStickers/index.tsx +++ b/src/equicordplugins/moreStickers/index.tsx @@ -34,6 +34,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "MoreStickers", description: "Adds sticker packs from other social media platforms. (e.g. LINE)", + tags: ["Chat", "Emotes", "Media"], authors: [EquicordDevs.Leko, Devs.Arjix], settings, diff --git a/src/equicordplugins/moreUserTags/index.tsx b/src/equicordplugins/moreUserTags/index.tsx index d7852ba5f..395144257 100644 --- a/src/equicordplugins/moreUserTags/index.tsx +++ b/src/equicordplugins/moreUserTags/index.tsx @@ -37,6 +37,8 @@ migratePluginToSettings(true, "MoreUserTags", "NoAppsAllowed", "noAppsAllowed"); export default definePlugin({ name: "MoreUserTags", description: "Adds tags for webhooks and moderative roles (owner, admin, etc.)", + dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI", "NicknameIconsAPI"], + tags: ["Appearance", "Chat"], authors: [Devs.Cyn, Devs.TheSun, Devs.RyanCaoDev, Devs.LordElias, Devs.AutumnVN, EquicordDevs.Hen, EquicordDevs.meowabyte], settings, patches: [ diff --git a/src/equicordplugins/moyai/index.ts b/src/equicordplugins/moyai/index.ts index 4c6d79391..0d0b40c1b 100644 --- a/src/equicordplugins/moyai/index.ts +++ b/src/equicordplugins/moyai/index.ts @@ -91,6 +91,7 @@ export default definePlugin({ name: "Moyai", authors: [Devs.Megu, Devs.Nuckyz], description: "Plays a 🗿 sound effect whenever a moyai emoji is sent, reacted, or used as a voice effect in your current channel.", + tags: ["Fun"], settings, flux: { diff --git a/src/equicordplugins/musicControls/index.tsx b/src/equicordplugins/musicControls/index.tsx index 3fb672401..dae172841 100644 --- a/src/equicordplugins/musicControls/index.tsx +++ b/src/equicordplugins/musicControls/index.tsx @@ -34,7 +34,8 @@ export default definePlugin({ description: "Music Controls and Lyrics for multiple services ", authors: [Devs.Ven, Devs.afn, Devs.KraXen72, Devs.Av32000, Devs.nin0dev, Devs.thororen, EquicordDevs.vmohammad, Devs.Joona], settings, - tags: [ + tags: ["Media", "Activity"], + searchTerms: [ // Spotify "Spotify", "SpotifyControls", diff --git a/src/equicordplugins/neverPausePreviews/index.tsx b/src/equicordplugins/neverPausePreviews/index.tsx index 3c237c788..d31b02048 100644 --- a/src/equicordplugins/neverPausePreviews/index.tsx +++ b/src/equicordplugins/neverPausePreviews/index.tsx @@ -23,6 +23,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NeverPausePreviews", description: "Prevents in-call/PiP previews (screenshare, streams, etc) from pausing even if the client loses focus", + tags: ["Media"], authors: [EquicordDevs.vappstar], settingsAboutComponent: () => ( diff --git a/src/equicordplugins/newPluginsManager/index.tsx b/src/equicordplugins/newPluginsManager/index.tsx index 683d9de74..d4a340fc1 100644 --- a/src/equicordplugins/newPluginsManager/index.tsx +++ b/src/equicordplugins/newPluginsManager/index.tsx @@ -14,6 +14,7 @@ import { openNewPluginsModal } from "./NewPluginsModal"; export default definePlugin({ name: "NewPluginsManager", description: "Utility that notifies you when new plugins are added to Equicord", + tags: ["Utility"], authors: [Devs.Sqaaakoi], enabledByDefault: true, flux: { diff --git a/src/equicordplugins/noNitroUpsell/index.ts b/src/equicordplugins/noNitroUpsell/index.ts index d7b2eaf5d..cd3c2a665 100644 --- a/src/equicordplugins/noNitroUpsell/index.ts +++ b/src/equicordplugins/noNitroUpsell/index.ts @@ -10,7 +10,8 @@ import { OverridePremiumTypeStore } from "@webpack/common"; export default definePlugin({ name: "NoNitroUpsell", - description: "Removes ALL of Discord's nitro upsells by tricking the client into thinking you have nitro.", + description: "Removes all of Discord's nitro upsells by tricking the client into thinking you have nitro.", + tags: ["Utility"], authors: [Devs.thororen], flux: { CONNECTION_OPEN() { diff --git a/src/equicordplugins/noPushToTalk/index.ts b/src/equicordplugins/noPushToTalk/index.ts index ff5ee8682..fb2d922e8 100644 --- a/src/equicordplugins/noPushToTalk/index.ts +++ b/src/equicordplugins/noPushToTalk/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoPushToTalk", description: "Bypasses the push-to-talk requirement for voice activity in channels that enforce it.", + tags: ["Servers", "Voice"], authors: [EquicordDevs.omaw], patches: [ { diff --git a/src/equicordplugins/noRPC.discordDesktop/index.ts b/src/equicordplugins/noRPC.discordDesktop/index.ts index 51ed1f962..df2d409de 100644 --- a/src/equicordplugins/noRPC.discordDesktop/index.ts +++ b/src/equicordplugins/noRPC.discordDesktop/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoRPC", description: "Disables Discord's RPC server.", + tags: ["Privacy", "Servers"], authors: [Devs.Cyn], patches: [ { diff --git a/src/equicordplugins/noRoleHeaders/index.ts b/src/equicordplugins/noRoleHeaders/index.ts index 6b4a7d3a0..c008e9273 100644 --- a/src/equicordplugins/noRoleHeaders/index.ts +++ b/src/equicordplugins/noRoleHeaders/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoRoleHeaders", description: "We are all equal!! Removes the role headers in the member list.", + tags: ["Appearance", "Fun", "Roles"], authors: [Devs.Samwich], patches: [ { diff --git a/src/equicordplugins/normalizeMessageLinks/index.ts b/src/equicordplugins/normalizeMessageLinks/index.ts index 062f1ee44..6ee61a440 100644 --- a/src/equicordplugins/normalizeMessageLinks/index.ts +++ b/src/equicordplugins/normalizeMessageLinks/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NormalizeMessageLinks", description: "Strip canary/ptb from message links", + tags: ["Chat"], authors: [Devs.bb010g], patches: [ { diff --git a/src/equicordplugins/notificationTitle.discordDesktop/index.tsx b/src/equicordplugins/notificationTitle.discordDesktop/index.tsx index 56d8b3fef..f2db23cac 100644 --- a/src/equicordplugins/notificationTitle.discordDesktop/index.tsx +++ b/src/equicordplugins/notificationTitle.discordDesktop/index.tsx @@ -20,6 +20,7 @@ const MessageTypes = findByPropsLazy("REPLY", "STAGE_RAISE_HAND", "CHANNEL_NAME_ export default definePlugin({ name: "NotificationTitle", description: "Makes desktop notifications more informative", + tags: ["Appearance", "Notifications"], authors: [Devs.Kyuuhachi], patches: [ diff --git a/src/equicordplugins/orbolayBridge/index.tsx b/src/equicordplugins/orbolayBridge/index.tsx index 6c9863ee4..36d1a6ad5 100644 --- a/src/equicordplugins/orbolayBridge/index.tsx +++ b/src/equicordplugins/orbolayBridge/index.tsx @@ -314,6 +314,7 @@ const createWebsocket = () => { export default definePlugin({ name: "OrbolayBridge", description: "Bridge plugin to connect Orbolay to Discord", + tags: ["Utility", "Voice"], authors: [EquicordDevs.SpikeHD], settings, flux: { diff --git a/src/equicordplugins/partyMode/index.ts b/src/equicordplugins/partyMode/index.ts index f7cddbf97..8641257ad 100644 --- a/src/equicordplugins/partyMode/index.ts +++ b/src/equicordplugins/partyMode/index.ts @@ -44,6 +44,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PartyMode", description: "Allows you to use party mode cause the party never ends ✨", + tags: ["Fun"], authors: [Devs.UwUDev], reporterTestable: ReporterTestable.None, settings, diff --git a/src/equicordplugins/pinIcon/index.tsx b/src/equicordplugins/pinIcon/index.tsx index 1e6f5987f..d44edfe8f 100644 --- a/src/equicordplugins/pinIcon/index.tsx +++ b/src/equicordplugins/pinIcon/index.tsx @@ -25,6 +25,7 @@ const PinIcon = findComponentByCodeLazy("1-.06-.63L6.16"); export default definePlugin({ name: "PinIcon", description: "Adds a pin icon to pinned messages", + tags: ["Appearance", "Chat"], authors: [EquicordDevs.iamme], patches: [ { diff --git a/src/equicordplugins/pingNotifications/index.tsx b/src/equicordplugins/pingNotifications/index.tsx index e6b0e45e2..1d96249b5 100644 --- a/src/equicordplugins/pingNotifications/index.tsx +++ b/src/equicordplugins/pingNotifications/index.tsx @@ -92,6 +92,7 @@ function isUserBlocked(userId) { export default definePlugin({ name: "PingNotifications", description: "Customizable notifications with improved mention formatting", + tags: ["Chat", "Friends", "Notifications", "Servers"], authors: [EquicordDevs.smuki], settings, diff --git a/src/equicordplugins/platformSpoofer/index.tsx b/src/equicordplugins/platformSpoofer/index.tsx index e15a5df17..b8e574f3b 100644 --- a/src/equicordplugins/platformSpoofer/index.tsx +++ b/src/equicordplugins/platformSpoofer/index.tsx @@ -52,6 +52,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PlatformSpoofer", description: "Spoof what platform or device you're on", + tags: ["Utility"], authors: [EquicordDevs.Drag, EquicordDevs.neoarz], settingsAboutComponent: () => ( diff --git a/src/equicordplugins/polishWording/index.ts b/src/equicordplugins/polishWording/index.ts index 57f925901..2f8f6d33c 100644 --- a/src/equicordplugins/polishWording/index.ts +++ b/src/equicordplugins/polishWording/index.ts @@ -64,6 +64,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "PolishWording", description: "Tweaks your messages to make them look nicer and have better grammar. See settings", + dependencies: ["MessageEventsAPI"], + tags: ["Chat"], authors: [Devs.Samwich, EquicordDevs.WKoA], onBeforeMessageSend: presendObject, settings, diff --git a/src/equicordplugins/profileSets/index.tsx b/src/equicordplugins/profileSets/index.tsx index a2db97aa4..c9828017f 100644 --- a/src/equicordplugins/profileSets/index.tsx +++ b/src/equicordplugins/profileSets/index.tsx @@ -29,6 +29,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ProfileSets", description: "Allows you to save and load different profile presets, via the Profile Section in Settings.", + tags: ["Appearance", "Customisation", "Utility"], authors: [EquicordDevs.omaw, EquicordDevs.justjxke], settings, patches: [ diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index cf0d1c4ab..c85e0be53 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -1360,6 +1360,7 @@ migratePluginToSettings(true, "Questify", "QuestCompleter", "completeVideoQuests export default definePlugin({ name: "Questify", description: "Enhance your Quest experience with a suite of features, or disable them entirely if they're not your thing.", + tags: ["Appearance", "Customisation", "Privacy", "Utility"], authors: [EquicordDevs.Etorix], dependencies: ["AudioPlayerAPI", "ServerListAPI"], startAt: StartAt.Init, // Needed in order to beat Read All Messages to inserting above the server list. diff --git a/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx b/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx index 449e35239..82e9af31c 100644 --- a/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx +++ b/src/equicordplugins/quickThemeSwitcher.discordDesktop/index.tsx @@ -244,6 +244,7 @@ const handleThemeNamesChange = () => settings.store.autoRefresh && debouncedRefr export default definePlugin({ name: "QuickThemeSwitcher", description: "Quickly switch between themes using keyboard shortcuts.", + tags: ["Appearance", "Utility"], authors: [Devs.prism], settings, startAt: StartAt.DOMContentLoaded, diff --git a/src/equicordplugins/quoter/index.tsx b/src/equicordplugins/quoter/index.tsx index 95825e3c1..d41104617 100644 --- a/src/equicordplugins/quoter/index.tsx +++ b/src/equicordplugins/quoter/index.tsx @@ -58,6 +58,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Quoter", description: "Adds the ability to create an inspirational quote image from a message.", + tags: ["Chat"], authors: [Devs.Samwich, Devs.thororen, EquicordDevs.neoarz, Devs.prism], settings, diff --git a/src/equicordplugins/randomVoice/index.tsx b/src/equicordplugins/randomVoice/index.tsx index 6017aad6b..9d78149d2 100644 --- a/src/equicordplugins/randomVoice/index.tsx +++ b/src/equicordplugins/randomVoice/index.tsx @@ -671,6 +671,8 @@ function renderOperationGroup({ export default definePlugin({ name: "RandomVoice", description: "Adds a button near mute to join a random voice channel.", + dependencies: ["UserAreaAPI"], + tags: ["Fun", "Voice"], authors: [EquicordDevs.xijexo, EquicordDevs.omaw, Devs.thororen], settings, diff --git a/src/equicordplugins/recentDMSwitcher/index.tsx b/src/equicordplugins/recentDMSwitcher/index.tsx index 96a271861..48e5977fa 100644 --- a/src/equicordplugins/recentDMSwitcher/index.tsx +++ b/src/equicordplugins/recentDMSwitcher/index.tsx @@ -332,6 +332,7 @@ function showCycleToast() { export default definePlugin({ name: "RecentDMSwitcher", description: "Ctrl+Tab between most recently used DMs (Ctrl+Shift+Tab reverse)", + tags: ["Chat", "Utility"], authors: [EquicordDevs.mmeta], settings, diff --git a/src/equicordplugins/remix/index.tsx b/src/equicordplugins/remix/index.tsx index 19595a5ef..a03d89d09 100644 --- a/src/equicordplugins/remix/index.tsx +++ b/src/equicordplugins/remix/index.tsx @@ -71,6 +71,7 @@ export function sendRemix(blob: Blob) { export default definePlugin({ name: "RemixRevived", description: "Revives Remix and breings it to Desktop", + tags: ["Customisation", "Fun"], authors: [EquicordDevs.MrDiamond, EquicordDevs.meowabyte], contextMenus: { "channel-attach": UploadContextMenuPatch, diff --git a/src/equicordplugins/repeatMessages/index.tsx b/src/equicordplugins/repeatMessages/index.tsx index 6ca6bc494..5bbcf3f2b 100644 --- a/src/equicordplugins/repeatMessages/index.tsx +++ b/src/equicordplugins/repeatMessages/index.tsx @@ -132,6 +132,8 @@ migratePluginSettings("RepeatMessages", "RepeatMessage"); export default definePlugin({ name: "RepeatMessages", description: "Allows you to repeat messages quickly. If you hold shift while clicking the Repeat option, it will reply to the message.", + dependencies: ["MessagePopoverAPI"], + tags: ["Chat"], authors: [EquicordDevs.Tolgchu, Devs.thororen], contextMenus: { "message": messageCtxPatch diff --git a/src/equicordplugins/replyPingControl/index.ts b/src/equicordplugins/replyPingControl/index.ts index aa877cfb6..0db11f68a 100644 --- a/src/equicordplugins/replyPingControl/index.ts +++ b/src/equicordplugins/replyPingControl/index.ts @@ -27,6 +27,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ReplyPingControl", description: "Control whether to always or never get pinged on message replies, with a whitelist feature", + tags: ["Chat", "Notifications"], authors: [Devs.ant0n, EquicordDevs.MrDiamond], settings, diff --git a/src/equicordplugins/richMagnetLinks/index.tsx b/src/equicordplugins/richMagnetLinks/index.tsx index 33a42efbb..4cfb0275f 100644 --- a/src/equicordplugins/richMagnetLinks/index.tsx +++ b/src/equicordplugins/richMagnetLinks/index.tsx @@ -13,6 +13,7 @@ export default definePlugin({ authors: [EquicordDevs.cassie, EquicordDevs.mochienya, EquicordDevs.secp192k1], name: "RichMagnetLinks", description: "Renders magnet links like message links", + tags: ["Appearance", "Chat"], patches: [ { find: "AUTO_MODERATION_SYSTEM_MESSAGE_RULES:", diff --git a/src/equicordplugins/richPresence/index.tsx b/src/equicordplugins/richPresence/index.tsx index 8c0d4874e..d5d90f5bb 100644 --- a/src/equicordplugins/richPresence/index.tsx +++ b/src/equicordplugins/richPresence/index.tsx @@ -22,80 +22,81 @@ type SettingsKey = keyof SettingsStore; const logger = new Logger("RichPresence"); -const services: Record = { - [ServiceTab.AudioBookShelf]: abs, - [ServiceTab.Tosu]: tosu, - [ServiceTab.StatsFm]: statsfm, - [ServiceTab.Jellyfin]: jellyfin, - [ServiceTab.ListenBrainz]: listenbrainz, - [ServiceTab.GensokyoRadio]: gensokyoRadio, +const services: Record = { + [ServiceTab.AudioBookShelf]: abs, + [ServiceTab.Tosu]: tosu, + [ServiceTab.StatsFm]: statsfm, + [ServiceTab.Jellyfin]: jellyfin, + [ServiceTab.ListenBrainz]: listenbrainz, + [ServiceTab.GensokyoRadio]: gensokyoRadio, }; const enableKeys: Record = { - [ServiceTab.AudioBookShelf]: "abs_enabled", - [ServiceTab.Tosu]: "tosu_enabled", - [ServiceTab.StatsFm]: "sfm_enabled", - [ServiceTab.Jellyfin]: "jf_enabled", - [ServiceTab.ListenBrainz]: "lb_enabled", - [ServiceTab.GensokyoRadio]: "gr_enabled", + [ServiceTab.AudioBookShelf]: "abs_enabled", + [ServiceTab.Tosu]: "tosu_enabled", + [ServiceTab.StatsFm]: "sfm_enabled", + [ServiceTab.Jellyfin]: "jf_enabled", + [ServiceTab.ListenBrainz]: "lb_enabled", + [ServiceTab.GensokyoRadio]: "gr_enabled", }; const activeServices = new Set(); function syncServices() { - const globalEnabled = settings.store.enabled; + const globalEnabled = settings.store.enabled; - for (const [id, service] of Object.entries(services)) { - const shouldRun = - globalEnabled && !!settings.store[enableKeys[id]]; - const isRunning = activeServices.has(id); + for (const [id, service] of Object.entries(services)) { + const shouldRun = + globalEnabled && !!settings.store[enableKeys[id]]; + const isRunning = activeServices.has(id); - if (shouldRun && !isRunning) { - logger.info(`Starting ${id} service`); - service.start(); - activeServices.add(id); - } else if (!shouldRun && isRunning) { - logger.info(`Stopping ${id} service`); - service.stop(); - activeServices.delete(id); - } - } + if (shouldRun && !isRunning) { + logger.info(`Starting ${id} service`); + service.start(); + activeServices.add(id); + } else if (!shouldRun && isRunning) { + logger.info(`Stopping ${id} service`); + service.stop(); + activeServices.delete(id); + } + } } function stopAllServices() { - for (const id of activeServices) { - logger.info(`Stopping ${id} service`); - services[id].stop(); - } - activeServices.clear(); + for (const id of activeServices) { + logger.info(`Stopping ${id} service`); + services[id].stop(); + } + activeServices.clear(); } export default definePlugin({ - name: "RichPresence", - description: "Unified rich presence hub for AudioBookShelf, osu!, stats.fm, Jellyfin, ListenBrainz, and Gensokyo Radio.", - authors: [ - EquicordDevs.vmohammad, - Devs.AutumnVN, - EquicordDevs.Crxa, - Devs.SerStars, - EquicordDevs.ZcraftElite, - EquicordDevs.qouesm, - Devs.RyanCaoDev, - EquicordDevs.Prince527, - EquicordDevs.creations, - ], - reporterTestable: ReporterTestable.None, + name: "RichPresence", + description: "Unified rich presence hub for AudioBookShelf, osu!, stats.fm, Jellyfin, ListenBrainz, and Gensokyo Radio.", + tags: ["Activity"], + authors: [ + EquicordDevs.vmohammad, + Devs.AutumnVN, + EquicordDevs.Crxa, + Devs.SerStars, + EquicordDevs.ZcraftElite, + EquicordDevs.qouesm, + Devs.RyanCaoDev, + EquicordDevs.Prince527, + EquicordDevs.creations, + ], + reporterTestable: ReporterTestable.None, - settings, + settings, - start() { - migrateOldSettings(); - syncServices(); - setOnServiceChange(syncServices); - }, + start() { + migrateOldSettings(); + syncServices(); + setOnServiceChange(syncServices); + }, - stop() { - stopAllServices(); - setOnServiceChange(null); - }, + stop() { + stopAllServices(); + setOnServiceChange(null); + }, }); diff --git a/src/equicordplugins/rpcEditor/ReplaceSettings.tsx b/src/equicordplugins/rpcEditor/ReplaceSettings.tsx index b85b0f7c1..81d541bf5 100644 --- a/src/equicordplugins/rpcEditor/ReplaceSettings.tsx +++ b/src/equicordplugins/rpcEditor/ReplaceSettings.tsx @@ -94,7 +94,7 @@ export function ReplaceSettings({ appIds, update, save }: SettingsProps) { } Application ID { onChange(v, i, "appId"); }} @@ -125,7 +125,7 @@ export function ReplaceSettings({ appIds, update, save }: SettingsProps) { <> Stream URL (must be YouTube or Twitch) { onChange(v, i, "newStreamUrl"); }} diff --git a/src/equicordplugins/rpcEditor/index.tsx b/src/equicordplugins/rpcEditor/index.tsx index e60d6627f..b40009418 100644 --- a/src/equicordplugins/rpcEditor/index.tsx +++ b/src/equicordplugins/rpcEditor/index.tsx @@ -73,6 +73,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "RPCEditor", description: "Edit the type and content of any Rich Presence", + tags: ["Customisation"], authors: [Devs.Nyako, Devs.nin0dev], patches: [ { diff --git a/src/equicordplugins/rpcStats/index.tsx b/src/equicordplugins/rpcStats/index.tsx index 76f07a44a..0d0bc5f5c 100644 --- a/src/equicordplugins/rpcStats/index.tsx +++ b/src/equicordplugins/rpcStats/index.tsx @@ -172,6 +172,7 @@ async function updateData() { export default definePlugin({ name: "RPCStats", description: "Displays stats about your activity as an rpc", + tags: ["Utility"], authors: [Devs.Samwich], async start() { updateData(); diff --git a/src/equicordplugins/saveFavoriteGIFs/index.tsx b/src/equicordplugins/saveFavoriteGIFs/index.tsx index e5af23613..268be6571 100644 --- a/src/equicordplugins/saveFavoriteGIFs/index.tsx +++ b/src/equicordplugins/saveFavoriteGIFs/index.tsx @@ -115,6 +115,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SaveFavoriteGIFs", description: "Export favorited GIF urls", + dependencies: ["CommandsAPI"], + tags: ["Emotes", "Utility"], authors: [Devs.thororen], settings, commands: [ diff --git a/src/equicordplugins/scheduledMessages/index.tsx b/src/equicordplugins/scheduledMessages/index.tsx index 7fee1cbd2..d79402226 100644 --- a/src/equicordplugins/scheduledMessages/index.tsx +++ b/src/equicordplugins/scheduledMessages/index.tsx @@ -86,6 +86,8 @@ function handleReactionEvent(event: FluxReactionEvent): void { export default definePlugin({ name: "ScheduledMessages", description: "Schedule messages to be sent at a specific time or after a delay.", + tags: ["Chat", "Utility"], + dependencies: ["ChatInputButtonAPI", "MessageAccessoriesAPI", "MessageEventsAPI"], authors: [EquicordDevs.mmeta, Devs.prism], settings, diff --git a/src/equicordplugins/screenRecorder.equibop/index.tsx b/src/equicordplugins/screenRecorder.equibop/index.tsx index a24ef052b..b9446995c 100644 --- a/src/equicordplugins/screenRecorder.equibop/index.tsx +++ b/src/equicordplugins/screenRecorder.equibop/index.tsx @@ -14,7 +14,8 @@ let recoder: MediaRecorder; export default definePlugin({ name: "ScreenRecorder", - description: "epic screen recorder lol", + description: "Adds an option to record your screen and upload the recording to the channel", + tags: ["Chat"], authors: [Devs.AutumnVN], contextMenus: { "channel-attach": startRecording @@ -54,7 +55,7 @@ function stopRecording(children, props) { } action={() => { recoder.addEventListener("dataavailable", e => { - const file = new File([e.data], "watch if cute.webm", { type: "video/webm" }); + const file = new File([e.data], "recording.webm", { type: "video/webm" }); UploadHandler.promptToUpload([file], props.channel, 0); }); recoder.stop(); diff --git a/src/equicordplugins/searchFix/index.tsx b/src/equicordplugins/searchFix/index.tsx index e45e4cd16..f331c021b 100644 --- a/src/equicordplugins/searchFix/index.tsx +++ b/src/equicordplugins/searchFix/index.tsx @@ -39,6 +39,7 @@ function settingsComponent() { export default definePlugin({ name: "SearchFix", description: 'Fixes the annoying "We dropped the magnifying glass!" error.', + tags: ["Utility"], settingsAboutComponent: () => settingsComponent(), authors: [EquicordDevs.Jaxx], patches: [ diff --git a/src/equicordplugins/sekaiStickers/index.tsx b/src/equicordplugins/sekaiStickers/index.tsx index af1d6c1af..aa6188e1a 100644 --- a/src/equicordplugins/sekaiStickers/index.tsx +++ b/src/equicordplugins/sekaiStickers/index.tsx @@ -33,6 +33,8 @@ let IS_FONTS_LOADED = false; export default definePlugin({ name: "SekaiStickers", description: "Sekai Stickers built in discord originally from github.com/TheOriginalAyaka", + dependencies: ["ChatInputButtonAPI"], + tags: ["Chat", "Emotes"], authors: [Devs.MaiKokain], settings, chatBarButton: { diff --git a/src/equicordplugins/selfForward/index.ts b/src/equicordplugins/selfForward/index.ts index 74c9902bc..09672018c 100644 --- a/src/equicordplugins/selfForward/index.ts +++ b/src/equicordplugins/selfForward/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "SelfForward", description: "Adds the current channel to the forward list popup", + tags: ["Utility"], authors: [EquicordDevs.VillainsRule], patches: [ { diff --git a/src/equicordplugins/serverSearch/index.tsx b/src/equicordplugins/serverSearch/index.tsx index 48cbe348f..101650afc 100644 --- a/src/equicordplugins/serverSearch/index.tsx +++ b/src/equicordplugins/serverSearch/index.tsx @@ -10,8 +10,7 @@ import { addServerListElement, removeServerListElement, ServerListRenderPosition import ErrorBoundary from "@components/ErrorBoundary"; import { EquicordDevs } from "@utils/constants"; import definePlugin from "@utils/types"; -import { FluxDispatcher } from "@webpack/common"; -import { Tooltip } from "webpack/common/components"; +import { FluxDispatcher, Tooltip } from "@webpack/common"; function SearchIcon() { return ( @@ -29,6 +28,7 @@ export default definePlugin({ name: "ServerSearch", authors: [EquicordDevs.camila314], description: "Navigate your servers better with a quick search button", + tags: ["Shortcuts", "Servers"], renderButton() { return diff --git a/src/equicordplugins/showBadgesInChat/index.tsx b/src/equicordplugins/showBadgesInChat/index.tsx index 60066cc52..5e05ba431 100644 --- a/src/equicordplugins/showBadgesInChat/index.tsx +++ b/src/equicordplugins/showBadgesInChat/index.tsx @@ -6,11 +6,11 @@ import "./styles.css"; +import badges from "@plugins/_api/badges"; import { Devs, EquicordDevs } from "@utils/constants"; import { isEquicordPluginDev, isPluginDev } from "@utils/misc"; import definePlugin from "@utils/types"; import { findComponentByCodeLazy, findCssClassesLazy } from "@webpack"; -import badges from "plugins/_api/badges"; const { roleIcon } = findCssClassesLazy("roleIcon", "separator"); const RoleIconComponent = findComponentByCodeLazy("#{intl::ROLE_ICON_ALT_TEXT}"); @@ -142,6 +142,8 @@ export default definePlugin({ name: "ShowBadgesInChat", authors: [Devs.Inbestigator, EquicordDevs.KrystalSkull], description: "Shows the message author's badges beside their name in chat.", + dependencies: ["MessageDecorationsAPI"], + tags: ["Appearance", "Chat"], settings, renderMessageDecoration(props) { return props.message?.author ? : null; diff --git a/src/equicordplugins/showMessageEmbeds/index.tsx b/src/equicordplugins/showMessageEmbeds/index.tsx index d224923d3..d503c2f77 100644 --- a/src/equicordplugins/showMessageEmbeds/index.tsx +++ b/src/equicordplugins/showMessageEmbeds/index.tsx @@ -193,6 +193,7 @@ function showFailureToast(message: string) { export default definePlugin({ name: "ShowMessageEmbeds", description: "Adds a context menu option to show embeds for links that don't have one", + tags: ["Appearance", "Chat"], authors: [EquicordDevs.Suffocate], patches: [ diff --git a/src/equicordplugins/showResourceChannels/index.ts b/src/equicordplugins/showResourceChannels/index.ts index d3ca76589..ecf2132f1 100644 --- a/src/equicordplugins/showResourceChannels/index.ts +++ b/src/equicordplugins/showResourceChannels/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ShowResourceChannels", description: "shows the channels hidden behind the server resources in the channel list", + tags: ["Servers"], authors: [EquicordDevs.VillainsRule], patches: [ { diff --git a/src/equicordplugins/showSongName/index.tsx b/src/equicordplugins/showSongName/index.tsx index 96cdd5ae7..29716e129 100644 --- a/src/equicordplugins/showSongName/index.tsx +++ b/src/equicordplugins/showSongName/index.tsx @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ShowSongName", description: "Shows song name instead of artist for Spotify activity", + tags: ["Activity"], authors: [Devs.prism], patches: [ diff --git a/src/equicordplugins/sidebarChat/index.tsx b/src/equicordplugins/sidebarChat/index.tsx index 7b88e2603..2958acea9 100644 --- a/src/equicordplugins/sidebarChat/index.tsx +++ b/src/equicordplugins/sidebarChat/index.tsx @@ -130,6 +130,7 @@ export default definePlugin({ name: "SidebarChat", authors: [Devs.Joona], description: "Open a another channel or a DM as a sidebar or as a popout", + tags: ["Appearance", "Chat", "Servers"], patches: [ { find: 'case"pendingFriends":', diff --git a/src/equicordplugins/signature/index.tsx b/src/equicordplugins/signature/index.tsx index 1a7d28605..e09edf3e5 100644 --- a/src/equicordplugins/signature/index.tsx +++ b/src/equicordplugins/signature/index.tsx @@ -100,6 +100,8 @@ const ChatBarContextCheckbox: NavContextMenuPatchCallback = children => { export default definePlugin({ name: "Signature", description: "Automated fingerprint/end text", + dependencies: ["CommandsAPI", "ChatInputButtonAPI", "MessagePopoverAPI"], + tags: ["Appearance", "Chat"], authors: [Devs.Ven, Devs.Rini, Devs.ImBanana, EquicordDevs.KrystalSkull], onBeforeMessageSend(channelId, msg) { if (!settings.store.isEnabled) { diff --git a/src/equicordplugins/snowfall/index.tsx b/src/equicordplugins/snowfall/index.tsx index 7f103e9f4..abba96ae3 100644 --- a/src/equicordplugins/snowfall/index.tsx +++ b/src/equicordplugins/snowfall/index.tsx @@ -450,7 +450,8 @@ let container: HTMLDivElement | null = null; export default definePlugin({ name: "Snowfall", - description: "Let it snow on Discord! Ported from the BetterDiscord plugin by square.", + description: "Let it snow on Discord", + tags: ["Appearance"], authors: [EquicordDevs.ZcraftElite, EquicordDevs.square], settingsAboutComponent: () => ( diff --git a/src/equicordplugins/soggy/index.tsx b/src/equicordplugins/soggy/index.tsx index a622197d9..099e94792 100644 --- a/src/equicordplugins/soggy/index.tsx +++ b/src/equicordplugins/soggy/index.tsx @@ -137,9 +137,10 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Soggy", description: "Adds a soggy button to the toolbox", + tags: ["Fun"], authors: [EquicordDevs.sliwka], settings, - dependencies: ["AudioPlayerAPI"], + dependencies: ["AudioPlayerAPI", "HeaderBarAPI"], headerBarButton: { icon: () => ( diff --git a/src/equicordplugins/songLink.desktop/index.tsx b/src/equicordplugins/songLink.desktop/index.tsx index 2961f1bd7..0834d639a 100644 --- a/src/equicordplugins/songLink.desktop/index.tsx +++ b/src/equicordplugins/songLink.desktop/index.tsx @@ -51,6 +51,8 @@ export const Native = VencordNative.pluginHelpers.SongLink as PluginNative { export default definePlugin({ name: "StatusPresets", description: "Allows you to remember your statuses and set them later", + tags: ["Activity", "Utility"], authors: [EquicordDevs.iamme], settings: settings, dependencies: ["UserSettingsAPI"], diff --git a/src/equicordplugins/statusWhileActive.desktop/index.ts b/src/equicordplugins/statusWhileActive.desktop/index.ts index 9d950e4b7..efb79ef53 100644 --- a/src/equicordplugins/statusWhileActive.desktop/index.ts +++ b/src/equicordplugins/statusWhileActive.desktop/index.ts @@ -56,6 +56,7 @@ function setStatus(preq, status) { export default definePlugin({ name: "StatusWhileActive", description: "Automatically updates your online status when in a voice channel.", + tags: ["Activity", "Customisation", "Voice"], authors: [EquicordDevs.smuki], settings, flux: { diff --git a/src/equicordplugins/steamStatusSync/index.tsx b/src/equicordplugins/steamStatusSync/index.tsx index 7a20e9035..0ca190e11 100644 --- a/src/equicordplugins/steamStatusSync/index.tsx +++ b/src/equicordplugins/steamStatusSync/index.tsx @@ -85,6 +85,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "SteamStatusSync", description: "Sync your status to Steam! (Online, Away, Invisible, or Offline.)", + tags: ["Activity", "Appearance", "Customisation"], authors: [EquicordDevs.niko], settings, diff --git a/src/equicordplugins/stickerBlocker/index.tsx b/src/equicordplugins/stickerBlocker/index.tsx index 1993ebabb..7b2f59101 100644 --- a/src/equicordplugins/stickerBlocker/index.tsx +++ b/src/equicordplugins/stickerBlocker/index.tsx @@ -130,6 +130,7 @@ function isStickerBlocked(name) { export default definePlugin({ name: "StickerBlocker", description: "Allows you to block stickers from being displayed.", + tags: ["Chat", "Emotes", "Utility"], authors: [Devs.Samwich], patches: [ { diff --git a/src/equicordplugins/streamingCodecDisabler/index.ts b/src/equicordplugins/streamingCodecDisabler/index.ts index 24e3ece83..61d68d710 100644 --- a/src/equicordplugins/streamingCodecDisabler/index.ts +++ b/src/equicordplugins/streamingCodecDisabler/index.ts @@ -56,6 +56,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "StreamingCodecDisabler", description: "Disable codecs for streaming of your choice", + tags: ["Utility", "Voice"], authors: [EquicordDevs.davidkra230], settings, diff --git a/src/equicordplugins/talkInReverse/index.tsx b/src/equicordplugins/talkInReverse/index.tsx index c469c9b31..ac4cd1a64 100644 --- a/src/equicordplugins/talkInReverse/index.tsx +++ b/src/equicordplugins/talkInReverse/index.tsx @@ -66,7 +66,8 @@ export default definePlugin({ name: "TalkInReverse", authors: [EquicordDevs.Tolgchu], description: "Reverses the message content before sending it.", - dependencies: ["MessageEventsAPI"], + tags: ["Chat", "Fun"], + dependencies: ["MessageEventsAPI", "ChatInputButtonAPI"], chatBarButton: { icon: ReverseMessageIcon, render: ReverseMessageToggle diff --git a/src/equicordplugins/themeLibrary/index.tsx b/src/equicordplugins/themeLibrary/index.tsx index 084ce9650..6a2fe0955 100644 --- a/src/equicordplugins/themeLibrary/index.tsx +++ b/src/equicordplugins/themeLibrary/index.tsx @@ -16,6 +16,7 @@ import { settings } from "./utils/settings"; export default definePlugin({ name: "ThemeLibrary", description: "A library of themes for Vencord.", + tags: ["Appearance", "Customisation"], authors: [EquicordDevs.Fafa], settings, toolboxActions: { diff --git a/src/equicordplugins/tidalEmbeds/index.tsx b/src/equicordplugins/tidalEmbeds/index.tsx index 1e9269859..f819da7c1 100644 --- a/src/equicordplugins/tidalEmbeds/index.tsx +++ b/src/equicordplugins/tidalEmbeds/index.tsx @@ -10,8 +10,9 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "TidalEmbeds", description: "Embeds TIDAL songs to make them playable in Discord.", + tags: ["Appearance", "Chat", "Media"], authors: [EquicordDevs.vmohammad], - dependencies: ["MessageUpdaterAPI"], + dependencies: ["MessageUpdaterAPI", "MessageAccessoriesAPI"], patches: [ { find: "renderEmbeds(", diff --git a/src/equicordplugins/tiktokTTS/index.ts b/src/equicordplugins/tiktokTTS/index.ts index da5d8c24c..0e2ddf9f4 100644 --- a/src/equicordplugins/tiktokTTS/index.ts +++ b/src/equicordplugins/tiktokTTS/index.ts @@ -211,6 +211,7 @@ async function processQueue() { export default definePlugin({ name: "TiktokTTS", description: "Adds a context menu option to read out chat messages with the good ol' Tiktok TTS voice :sob:", + tags: ["Accessibility", "Chat", "Voice"], authors: [EquicordDevs.VillainsRule, EquicordDevs.examplegit], dependencies: ["AudioPlayerAPI"], settings, diff --git a/src/equicordplugins/timezones/index.tsx b/src/equicordplugins/timezones/index.tsx index b40c3a515..9901e3b8b 100644 --- a/src/equicordplugins/timezones/index.tsx +++ b/src/equicordplugins/timezones/index.tsx @@ -257,6 +257,7 @@ export default definePlugin({ name: "Timezones", authors: [Devs.Aria, EquicordDevs.creations], description: "Shows the local time of users in profiles and message headers", + tags: ["Appearance", "Chat", "Utility"], contextMenus: { "user-context": userContextMenuPatch }, diff --git a/src/equicordplugins/title/index.ts b/src/equicordplugins/title/index.ts index 9e67a72a0..a9c9138ed 100644 --- a/src/equicordplugins/title/index.ts +++ b/src/equicordplugins/title/index.ts @@ -29,6 +29,7 @@ function setTitle(v: string) { export default definePlugin({ name: "Title", description: "Replaces the window title prefix", + tags: ["Customisation"], authors: [Devs.Kyuuhachi], settings, diff --git a/src/equicordplugins/toastNotifications/index.tsx b/src/equicordplugins/toastNotifications/index.tsx index cd1be8023..dfa961176 100644 --- a/src/equicordplugins/toastNotifications/index.tsx +++ b/src/equicordplugins/toastNotifications/index.tsx @@ -210,6 +210,7 @@ const addMention = (id: string, type: string, guildId?: string): ReactNode => { export default definePlugin({ name: "ToastNotifications", description: "Show a toast notification whenever you receive a direct message.", + tags: ["Appearance", "Customisation", "Notifications"], authors: [EquicordDevs.Skully, EquicordDevs.Ethan, EquicordDevs.Buzzy], settings, flux: { diff --git a/src/equicordplugins/toggleVideoBind/index.ts b/src/equicordplugins/toggleVideoBind/index.ts index 3a56c4e8f..323a1e771 100644 --- a/src/equicordplugins/toggleVideoBind/index.ts +++ b/src/equicordplugins/toggleVideoBind/index.ts @@ -59,6 +59,7 @@ function handleKeydown({ code, ctrlKey, shiftKey, altKey }: KeyboardEvent) { export default definePlugin({ name: "ToggleVideoBind", description: "Adds a customizable bind to toggle webcam.", + tags: ["Utility", "Voice"], authors: [EquicordDevs.mochienya], settings, start() { diff --git a/src/equicordplugins/toneIndicators/index.tsx b/src/equicordplugins/toneIndicators/index.tsx index 6dc0ba1a0..cf70719f5 100644 --- a/src/equicordplugins/toneIndicators/index.tsx +++ b/src/equicordplugins/toneIndicators/index.tsx @@ -163,6 +163,7 @@ function patchChildrenTree(children: any): any { export default definePlugin({ name: "ToneIndicators", description: "Show tooltips for tone indicators like /srs, /gen, etc. in sent messages.", + tags: ["Chat", "Utility"], authors: [EquicordDevs.justjxke], settings, diff --git a/src/equicordplugins/translatePlus/index.tsx b/src/equicordplugins/translatePlus/index.tsx index 78e48b120..2473644b0 100644 --- a/src/equicordplugins/translatePlus/index.tsx +++ b/src/equicordplugins/translatePlus/index.tsx @@ -46,6 +46,8 @@ const messageCtxPatch: NavContextMenuPatchCallback = (children, { message }) => export default definePlugin({ name: "Translate+", description: "Vencord's translate plugin but with support for artistic languages!", + dependencies: ["MessageAccessoriesAPI", "MessagePopoverAPI"], + tags: ["Chat", "Utility"], authors: [Devs.Ven, EquicordDevs.Prince527], settings, contextMenus: { diff --git a/src/equicordplugins/triviaAI/index.tsx b/src/equicordplugins/triviaAI/index.tsx index f4c860347..afa941109 100644 --- a/src/equicordplugins/triviaAI/index.tsx +++ b/src/equicordplugins/triviaAI/index.tsx @@ -40,6 +40,8 @@ const messageCtxPatch: NavContextMenuPatchCallback = (children, { message }: { m export default definePlugin({ name: "TriviaAI", description: "A plugin that helps you answer trivia questions using AI.", + dependencies: ["MessagePopoverAPI"], + tags: ["Appearance", "Customisation", "Fun"], authors: [EquicordDevs.yash], settings, contextMenus: { diff --git a/src/equicordplugins/unitConverter/index.tsx b/src/equicordplugins/unitConverter/index.tsx index 36d83568e..c8c67aa1e 100644 --- a/src/equicordplugins/unitConverter/index.tsx +++ b/src/equicordplugins/unitConverter/index.tsx @@ -48,6 +48,8 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "UnitConverter", description: "Converts metric units to Imperal units and vice versa", + dependencies: ["MessagePopoverAPI"], + tags: ["Utility"], authors: [Devs.sadan], messagePopoverButton: { icon: ConvertIcon, diff --git a/src/equicordplugins/universalMention/index.tsx b/src/equicordplugins/universalMention/index.tsx index 2d8a977bb..f6f8b6998 100644 --- a/src/equicordplugins/universalMention/index.tsx +++ b/src/equicordplugins/universalMention/index.tsx @@ -39,6 +39,7 @@ export default definePlugin({ name: "UniversalMention", authors: [EquicordDevs.justjxke], description: "Mention any user, regardless of channel access.", + tags: ["Chat", "Servers", "Utility"], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/unlimitedAccounts/index.ts b/src/equicordplugins/unlimitedAccounts/index.ts index cbf77811d..eeb41a955 100644 --- a/src/equicordplugins/unlimitedAccounts/index.ts +++ b/src/equicordplugins/unlimitedAccounts/index.ts @@ -32,6 +32,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UnlimitedAccounts", description: "Increases the amount of accounts you can add.", + tags: ["Utility"], authors: [Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/unreadBadgeCount/index.tsx b/src/equicordplugins/unreadBadgeCount/index.tsx index 0f08d06cd..a9135df54 100644 --- a/src/equicordplugins/unreadBadgeCount/index.tsx +++ b/src/equicordplugins/unreadBadgeCount/index.tsx @@ -33,6 +33,7 @@ export default definePlugin({ name: "UnreadCountBadge", authors: [Devs.Joona], description: "Shows unread message count badges on channels in the channel list", + tags: ["Appearance", "Customisation", "Servers"], settings, patches: [ diff --git a/src/equicordplugins/urlHighlighter/index.tsx b/src/equicordplugins/urlHighlighter/index.tsx index 6fbe9ba77..6a52b9495 100644 --- a/src/equicordplugins/urlHighlighter/index.tsx +++ b/src/equicordplugins/urlHighlighter/index.tsx @@ -121,6 +121,7 @@ function getMatchingPattern(url: string): PatternEntry | null { export default definePlugin({ name: "UrlHighlighter", description: "Highlights URLs in messages that match your patterns.", + tags: ["Appearance", "Customisation"], authors: [Devs.prism], settings, diff --git a/src/equicordplugins/userpfp/index.tsx b/src/equicordplugins/userpfp/index.tsx index 777fb40c5..d884dd59d 100644 --- a/src/equicordplugins/userpfp/index.tsx +++ b/src/equicordplugins/userpfp/index.tsx @@ -65,6 +65,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UserPFP", description: "Allows you to use an animated avatar without Nitro", + tags: ["Appearance", "Customisation", "Servers"], authors: [EquicordDevs.nexpid, Devs.thororen, EquicordDevs.soapphia], settings, data, diff --git a/src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts b/src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts new file mode 100644 index 000000000..b87476fe2 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/VariableWithCallbacks.ts @@ -0,0 +1,40 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +export class VariableWithCallbacks { + #value: T; + #callbacks: { + id: number; + callback: (value: T, id: number) => void; + }[] = []; + + constructor(value: T) { + this.#value = value; + } + + value(newValue?: T): T { + if (newValue !== undefined) { + this.#value = newValue; + this.#callbacks.forEach(c => c.callback(this.#value, c.id)); + } + return this.#value; + } + + registerCallback(callback: (value: T, id: number) => void): number { + const id = Date.now(); + this.#callbacks.push({ + id, + callback + }); + return id; + } + + deregisterCallback(id: number) { + const possibleFallback = this.#callbacks.find(cb => cb.id === id); + if (!possibleFallback) return; + this.#callbacks.splice(this.#callbacks.indexOf(possibleFallback), 1); + } +} diff --git a/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx b/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx new file mode 100644 index 000000000..0bc5a1c53 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/components/SettingsTab.tsx @@ -0,0 +1,340 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { pluginRequiresRestart, startPlugin, stopPlugin } from "@api/PluginManager"; +import { useSettings } from "@api/Settings"; +import { BaseText } from "@components/BaseText"; +import { Button } from "@components/Button"; +import { Card } from "@components/Card"; +import { CheckedTextInput } from "@components/CheckedTextInput"; +import { HeadingTertiary } from "@components/Heading"; +import { DeleteIcon } from "@components/Icons"; +import { Paragraph } from "@components/Paragraph"; +import { AddonCard } from "@components/settings"; +import { + SettingsTab as STab, + wrapTab, +} from "@components/settings/tabs/BaseTab"; +import { classes, isObjectEmpty } from "@utils/misc"; +import { closeAllModals } from "@utils/modal"; +import { relaunch } from "@utils/native"; +import { Alerts, NavigationRouter, Toasts, useEffect, useState } from "@webpack/common"; + +import userpluginInstaller, { Native } from ".."; +import { + cl, + CLONE_LINK_REGEX, + showInstallFinishedAlert, +} from "../misc/constants"; + +function UserPluginsTab() { + const rs = useSettings(["plugins.*"]); + const [pluginsLoaded, loadPlugins] = useState(false); + const [plugins, setPlugins] = useState< + { + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; + directory?: string; + remote: string; + supportChannelID?: string; + }[] + >([]); + const [url, setUrl] = useState(""); + const [valid, setValid] = useState(false); + const [pluginsWithUpdates, setPluginsWithUpdates] = useState< + Record + >({}); + const [updatesLoaded, loadUpdates] = useState(false); + + useEffect(() => { + const { plugins: plgobj, pluginsWithUpdates: pwug } = + userpluginInstaller; + setPlugins(plgobj.value()); + loadPlugins(true); + const cid2 = plgobj.registerCallback(value => setPlugins(value)); + + const setPWU = value => { + const pwu = value.plugins.map(pg => ({ + [pg]: plgobj.value().find(pfjh => pfjh.directory === pg) + ?.name, + })); + setPluginsWithUpdates(Object.assign({}, ...pwu)); + loadUpdates(value.finished); + }; + const cid = pwug.registerCallback(value => { + setPWU(value); + }); + setPWU(pwug.value()); + + return () => { + pwug.deregisterCallback(cid); + plgobj.deregisterCallback(cid2); + }; + }, []); + + return ( + Vencord.Settings.plugins[p.name].enabled).length} enabled)` : ""}`} + > +
+ {isObjectEmpty(pluginsWithUpdates) ? ( + !updatesLoaded && ( + Checking for updates... + ) + ) : ( + + + Plugin Updates Available + + + The following plugins are out-of-date: +
    + {Object.values(pluginsWithUpdates) + .toSorted() + .map(pl => ( +
  • {pl}
  • + ))} +
+ {!updatesLoaded && + "and possibly more, as update checking is not finished. "} + You can update plugins below. +
+
+ )} +
+ + + Install Plugin + + + You can install a plugin from GitHub, GitLab, Codeberg, + git.nin0.dev, or plugins.nin0.dev by pasting its clone URL + here. + +
+ setUrl(t)} + validate={t => { + const match = t.match(CLONE_LINK_REGEX); + if (match) { + const idpl = match.includes("plugins.nin0.dev") + ? 1 + : 0; + const installed = plugins + .map(p => p.directory) + .includes(match[[3, 6][idpl]]); + if (installed) { + setValid(false); + return "Plugin already installed, update below"; + } + setValid(true); + return true; + } else { + setValid(false); + return "Invalid URL, read the notice above"; + } + }} + initialValue={url} + /> +
+
+ +
+
+
+ {pluginsLoaded ? ( +
+ {plugins + .toSorted((a, b) => + a.name.localeCompare(b.name, "en", { + sensitivity: "base", + }), + ) + .toSorted((a, b) => { + const updatePendingNames = + Object.keys(pluginsWithUpdates); + const [aa, bb] = [ + updatePendingNames.includes(a.directory!) + ? 1000 + : 0, + updatePendingNames.includes(b.directory!) + ? 1000 + : 0, + ]; + return bb - aa; + }) + .map(plugin => { + + const pl = Vencord.Plugins.plugins[ + plugin.name + ]; + return { + await Native.rmPlugin( + plugin.directory!, + ); + Alerts.show({ + title: "Done!", + body: `${plugin.name} has been uninstalled. A ${plugin.usesNative ? "restart" : "refresh"} is needed to fully remove the plugin.`, + confirmText: + plugin.usesNative + ? "Restart" + : "Refresh", + cancelText: "Later", + onConfirm() { + plugin.usesNative + ? relaunch() + : window.location.reload(); + }, + }); + }} + className={cl("delete-button")} + > + + } + setEnabled={t => { + Vencord.Settings.plugins[pl.name].enabled = t; + if (pluginRequiresRestart(pl)) { + Toasts.show({ + id: Toasts.genId(), + message: "Restart to apply changes!", + type: Toasts.Type.MESSAGE + }); + } else { + (t ? startPlugin : stopPlugin)(pl); + } + }} + footer={( +
+ {Object.keys( + pluginsWithUpdates, + ).includes(plugin.directory!) && ( + + )} + + {plugin.supportChannelID && } +
+ )} + />; + })} +
+ ) : ( + Loading plugins... + )} +
+
+ ); +} + +export default wrapTab(UserPluginsTab, "UserPlugins"); diff --git a/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx b/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx new file mode 100644 index 000000000..753a93961 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/components/UserpluginInstallButton.tsx @@ -0,0 +1,55 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Button } from "@components/Button"; +import { Alerts, ChannelStore, useEffect, useState } from "@webpack/common"; + +import userpluginInstaller, { Native, OpenSettingsModule, settings } from ".."; +import { CLONE_LINK_REGEX, showInstallFinishedAlert, WHITELISTED_SHARE_CHANNELS } from "../misc/constants"; + +export default function UserpluginInstallButton({ props }: any) { + const [plugins, setPlugins] = useState<{ + directory?: string; + }[]>([]); + useEffect(() => { + const { plugins } = userpluginInstaller; + + setPlugins(plugins.value()); + const cid = plugins.registerCallback(value => setPlugins(plugins.value())); + return () => plugins.deregisterCallback(cid); + }); + const { message } = props; + if (![...WHITELISTED_SHARE_CHANNELS, ...(settings.store.allowlistedChannels || "").split(",")].includes(ChannelStore.getChannel(message.channel_id).parent_id) && !WHITELISTED_SHARE_CHANNELS.includes(message.channel_id)) + return; + const gitLink = (props.message.content as string).match(CLONE_LINK_REGEX); + if (!gitLink) return; + const idpl = gitLink.includes("plugins.nin0.dev") ? 1 : 0; + const installed = plugins.map(p => p.directory).includes(gitLink[[3, 6][idpl]]); + return <> +
+ +
+ ; +} diff --git a/src/equicordplugins/userpluginInstaller.dev/index.tsx b/src/equicordplugins/userpluginInstaller.dev/index.tsx new file mode 100644 index 000000000..98e884661 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/index.tsx @@ -0,0 +1,145 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import "./misc/style.css"; + +import { showNotification } from "@api/Notifications"; +import { definePluginSettings } from "@api/Settings"; +import { Button } from "@components/Button"; +import { Notice } from "@components/Notice"; +import plSettings from "@plugins/_core/settings"; +import { Devs } from "@utils/constants"; +import { relaunch } from "@utils/native"; +import definePlugin, { OptionType, PluginNative } from "@utils/types"; +import { findByPropsLazy, findComponentByCodeLazy } from "@webpack"; +import { Alerts } from "@webpack/common"; + +import SettingsTab from "./components/SettingsTab"; +import UserpluginInstallButton from "./components/UserpluginInstallButton"; +import { VariableWithCallbacks } from "./VariableWithCallbacks"; + +// @ts-ignore +export const Native = VencordNative.pluginHelpers.UserpluginInstaller as PluginNative; +export const OpenSettingsModule = findByPropsLazy("openUserSettings"); +const AppsIcon = findComponentByCodeLazy("2.95H20a2 2 0"); + +export const settings = definePluginSettings({ + allowlistedChannels: { + type: OptionType.STRING, + description: "Comma separated list of channels where the Install Plugin button should be displayed. It is always displayed in the Vencord Userplugin channels" + }, + notifyIfUpdate: { + type: OptionType.BOOLEAN, + description: "Show a Vencord notification if UserPlugins need to be updated", + default: true + }, + neverNotifyForPlugins: { + type: OptionType.STRING, + description: "Never show update notifications for these plugins (you can still update them from the UserPlugins tab)", + default: "" + }, + setGitPath: { + type: OptionType.COMPONENT, + component: () => + } +}); + +export default definePlugin({ + name: "UserpluginInstaller", + description: "Install userplugins with a simple button click", + settingsAboutComponent: () => ( + + Equicord does not moderate userplugins and takes no responsibility for anything that may result from installing them. + Only install userplugins from developers you trust. Doing so is entirely at your own risk. + + ), + async checkPluginUpdates() { + for (const p of this.plugins.value()) { + if (await Native.isUpdateAvailableForPlugin(p.directory!)) { + const t = this.pluginsWithUpdates.value().plugins; + t.push(p.directory!); + this.pluginsWithUpdates.value({ + finished: false, + plugins: t + }); + } + } + const t = this.pluginsWithUpdates.value().plugins; + this.pluginsWithUpdates.value({ + finished: true, + plugins: t + }); + }, + section: { + key: "vencord_userplugins", + title: "UserPlugins", + panelTitle: "UserPlugins", + Component: SettingsTab, + Icon: AppsIcon + }, + async start() { + if (!VencordNative.pluginHelpers.UserpluginInstaller) return void Alerts.show({ + title: "UserpluginInstaller not fully loaded", + body: "You need to restart to allow the native to be loaded :)", + confirmText: "Restart now", + onConfirm() { + relaunch(); + }, + cancelText: "Later" + }); + + plSettings.customEntries.push(this.section); + + this.pluginsWithUpdates.registerCallback((value, id) => { + if (value.plugins.length === 0) return; + if (settings.store.neverNotifyForPlugins.split(",").map(t => t.trim().toLowerCase()).includes(value.plugins[value.plugins.length - 1].toLowerCase())) + return; + this.pluginsWithUpdates.deregisterCallback(id); + if (settings.store.notifyIfUpdate) + showNotification({ + title: "Some UserPlugins are out of date!", + body: "Click to open the UserPlugin Updater", + noPersist: true, + permanent: true, + onClick() { + OpenSettingsModule.openUserSettings("vencord_userplugins_panel"); + }, + }); + }); + const pls = await Native.getUserplugins(); + // @ts-ignore :trolley: + this.plugins.value(pls); + await this.checkPluginUpdates(); + }, + stop() { + // @ts-ignore + plSettings.customEntries.splice(plSettings.customEntries.indexOf(this.section), 1); + }, + plugins: new VariableWithCallbacks<{ + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; + directory: string; + remote: string; + }[]>([]), + pluginsWithUpdates: new VariableWithCallbacks<{ + finished: boolean; + plugins: string[]; + }>({ + finished: false, + plugins: [] + }), + settings, + authors: [Devs.nin0dev], + renderMessageAccessory: props => { + return ; + } +}); diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts b/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts new file mode 100644 index 000000000..b860a82c3 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/constants.ts @@ -0,0 +1,28 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { classNameFactory } from "@api/Styles"; +import { relaunch } from "@utils/native"; +import { Alerts } from "@webpack/common"; + +// if edited, also edit in native.ts!!! +export const CLONE_LINK_REGEX = /https:\/\/(?:((?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org))\/(?!user-attachments)((?:[a-zA-Z0-9]|-)+)\/((?:[a-zA-Z0-9]|-|\.)+)(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?/; +export const WHITELISTED_SHARE_CHANNELS = ["1256395889354997771", "1032200195582197831", "1301947896601509900", "1322935137591365683"]; +export const cl = classNameFactory("vc-userplugininstaller-"); + +export function showInstallFinishedAlert(pluginToEnable: string, native: boolean) { + Alerts.show({ + title: "Done!", + body: `${pluginToEnable} has been successfully installed.${native ? " However, as it makes use of native functions, a client restart is required." : ""} What now?`, + confirmText: `Enable & ${native ? "restart" : "refresh"}`, + cancelText: native ? "Restart" : "Refresh", + onConfirm() { + !Vencord.Plugins.plugins[pluginToEnable] ? Vencord.Settings.plugins[pluginToEnable] = { enabled: true } : Vencord.Settings.plugins[pluginToEnable].enabled = true; + native ? relaunch() : window.location.reload(); + }, + onCancel: () => native ? relaunch() : window.location.reload() + }); +} diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt b/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt new file mode 100644 index 000000000..9486605c9 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/pluginValidate.txt @@ -0,0 +1,158 @@ + + + + + + Review userplugin + + + + %WARNINGHIDER% %NATIVETSHIDER% %PRESENDHIDER% + + + +

Plugin info

+
+

%PLUGINNAME%

+

%PLUGINDESC%

+
+ +

Warnings

+
+

Uses a native.ts file

+

+ Use of this file allows the plugin to escape the browser sandbox + and potentially do anything to your system and data. + ONLY INSTALL THIS PLUGIN AFTER REVIEWING THE CODE AND BEING + 100% SURE THAT NOTHING BAD CAN BE DONE! +

+
+ Acknowledge warning (required to allow + install) +
+
+

Has pre-send listeners

+

+ This allows the plugin to edit your messages before they are + sent. +

+
+

+ Reminder: installing a userplugin can be a destructive action. Make + sure that you know and trust the developer before installing any. +

+
+ + +
+ + diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt b/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt new file mode 100644 index 000000000..5e4e6938e --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/setGitPath.txt @@ -0,0 +1,118 @@ + + + + + + + Git Path + + + + + +

Git path

+

+ If you're having issues downloading userplugins because Git isn't properly detected, you can manually set a Git + path + that'll be used instead of + simply looking in PATH. +
+ If you do not specify anything, Git will be called from the PATH variable. Do not set this setting unless you + have issues. +
+
+ On Linux, Flatpak still isn't supported. +

+ +
+ + + +
+ + + diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/style.css b/src/equicordplugins/userpluginInstaller.dev/misc/style.css new file mode 100644 index 000000000..098e37ea6 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/style.css @@ -0,0 +1,78 @@ +.vc-userplugininstaller-info-card { + padding: 15px 20px; + margin-bottom: 20px; +} + +.vc-userplugininstaller-install-desc { + margin-top: 5px; +} + +.vc-userplugininstaller-install-field, +.vc-userplugininstaller-button-container { + margin-top: 10px; +} + +.vc-userplugininstaller-install-button { + margin-left: auto; +} + +.vc-userplugininstaller-update-check-container { + margin-top: 10px; +} + +.vc-userplugininstaller-plugins-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 10px; + align-items: start; +} + +.vc-userplugininstaller-info-button { + height: 24px; + width: 24px; + padding: 0; + background: transparent; + color: var(--icon-secondary); + transition: background-color 0.2s ease; + + &:hover { + color: var(--interactive-hover); + } +} + +.vc-userplugininstaller-settings-button:hover { + color: var(--interactive-hover); +} + +.vc-userplugininstaller-plugin-footer { + margin-top: 10px; + display: flex; + flex-wrap: wrap; + gap: 5px; + + div { + flex-basis: 100%; + margin-top: 5px; + font-size: 0.9rem; + } +} + +.vc-userplugininstaller-outdated-list { + padding-left: 30px; + margin: 3px 0; + list-style-type: disc; +} + +.vc-userplugininstaller-delete-button { + height: 24px; + width: 24px; + padding: 0; + background: transparent; + margin-right: 8px; + color: var(--icon-muted); + transition: background-color .2s ease; + + &:hover { + color: var(--red-new-46) + } +} diff --git a/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt b/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt new file mode 100644 index 000000000..573200223 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/misc/updateValidate.txt @@ -0,0 +1,129 @@ + + + + + + Review userplugin + + + + +

Plugin info

+
+

%PLUGINNAME%

+

%PLUGINDESC%

+
+

Update info

+
+

%COMMITMESSAGE%

+
+

+ You may want to review the + source code that will be applied. +

+
+ +

+ Reminder: installing a userplugin can be a destructive action. Make + sure that you know and trust the developer before installing any. +

+
+ + +
+ + diff --git a/src/equicordplugins/userpluginInstaller.dev/native.ts b/src/equicordplugins/userpluginInstaller.dev/native.ts new file mode 100644 index 000000000..1203b4a85 --- /dev/null +++ b/src/equicordplugins/userpluginInstaller.dev/native.ts @@ -0,0 +1,473 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 nin0 + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { NativeSettings } from "@main/settings"; +import { exec, spawn } from "child_process"; +import { BrowserWindow, dialog, shell, WebContentsView } from "electron"; +import { existsSync, readdirSync, readFileSync } from "fs"; +import { readdir, readFile, rm } from "fs/promises"; +import { basename, join } from "path"; +import yaml from "yaml-js"; + +// @ts-ignore fuck off +import pluginValidateContent from "./misc/pluginValidate.txt"; // i would use HTML but esbuild is being whiny +// @ts-ignore fuck off +import setGitPathContent from "./misc/setGitPath.txt"; +// @ts-ignore fuck off +import updateValidateContent from "./misc/updateValidate.txt"; // see above + +const PLUGIN_META_REGEX = /export default definePlugin\((?:\s|\/(?:\/|\*).*)*{\s*(?:\s|\/(?:\/|\*).*)*name:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*,(?:\s|\/(?:\/|\*).*)*(?:\s|\/(?:\/|\*).*)*description:\s*(?:"|'|`)(.*)(?:"|'|`)(?:\s|\/(?:\/|\*).*)*/; +// if edited, also edit in misc/constants.ts!!! +const CLONE_LINK_REGEX = /https:\/\/(?:((?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org))\/(?!user-attachments)((?:[a-zA-Z0-9]|-)+)\/((?:[a-zA-Z0-9]|-|\.)+)(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?/; + +const vencordPath = ["desktop", "equibop"].includes(basename(__dirname)) ? join(__dirname, "../") : __dirname; + +export async function rmPlugin(_, name: string): Promise { + // eslint-disable-next-line + return new Promise(async (resolve, reject) => { + const ups = await getUserplugins(); + const pl = ups.find(p => p.directory! === name); + if (!pl) return; + + const deleteReqDialog = await dialog.showMessageBox({ + title: "Uninstall plugin", + message: `Uninstall ${pl.name}`, + type: "error", + detail: `The uninstall of the userplugin ${pl.name} has been requested. Would you like to do so?\n\nIf you did not initiate this, press No.`, + buttons: ["No", "Yes"] + }); + + if (deleteReqDialog.response !== 1) return reject("User rejected"); + await rm(join(vencordPath, "../src/userplugins", name), { recursive: true }); + + await build(); + resolve("Done"); + }); +} + +export async function isUpdateAvailableForPlugin(_, name: string): Promise { + return new Promise(resolve => { + const pluginDir = join(vencordPath, "../src/userplugins", name); + const otherProc = exec("git fetch", { + cwd: pluginDir + }); + otherProc.once("close", () => { + async function doStuff() { + try { + const head = (await readFile(join(pluginDir, ".git/HEAD"), "utf8")).match(/^ref: (.+)/)![1]; + const remoteHead = (await readFile(join(pluginDir, ".git/refs/remotes/origin/HEAD"), "utf8")).match(/^ref: (.+)/)![1]; + const localCommit = await readFile(join(pluginDir, ".git", head), "utf8"); + const remoteCommit = await readFile(join(pluginDir, ".git", remoteHead), "utf8"); + + resolve(localCommit !== remoteCommit); + } + catch (e) { + resolve(false); + } + } + doStuff(); + }); + }); +} + +export function initPluginInstall(_, link: string, source: string, owner: string, repo: string): Promise { + // eslint-disable-next-line + return new Promise(async (resolve, reject) => { + const verifiedRegex = link.match(CLONE_LINK_REGEX)!; + const idpl = source === "plugins.nin0.dev" ? 1 : 0; + if (![4, 7].includes(verifiedRegex.length) || verifiedRegex[0] !== link || verifiedRegex[[1, 4][idpl]] !== source || verifiedRegex[[2, 5][idpl]] !== owner || verifiedRegex[[3, 6][idpl]] !== repo) return reject("Invalid link"); + + // Ask for clone + const cloneDialog = await dialog.showMessageBox({ + title: "Clone userplugin", + message: `You are about to clone a userplugin from ${source}.`, + type: "question", + detail: `The repository name is "${repo}" and it is owned by "${owner}".\nThe repository URL is ${link}\n\n(If you did not request this intentionally, choose Cancel)`, + buttons: ["Cancel", "Clone repository and continue install", "Open repository in browser"] + }); + switch (cloneDialog.response) { + case 0: { + return reject("Rejected by user"); + } + case 1: { + await cloneRepo(link, repo); + break; + } + case 2: { + await shell.openExternal(link); + return reject("silentStop"); + } + } + + // Get plugin meta + const meta = await getPluginMeta(join(vencordPath, "..", "src", "userplugins", repo)); + + // Review plugin + const win = new BrowserWindow({ + maximizable: false, + minimizable: false, + width: 560, + height: meta.usesNative || meta.usesPreSend ? 650 : 360, + resizable: false, + webPreferences: { + devTools: true + }, + title: "Review userplugin", + modal: true, + parent: BrowserWindow.getAllWindows()[0], + show: false, + autoHideMenuBar: true + }); + const reView /* haha got it */ = new WebContentsView({ + webPreferences: { + devTools: true, + nodeIntegration: true + } + }); + win.contentView.addChildView(reView); + win.loadURL(generateReviewPluginContent(meta)); + win.on("page-title-updated", async e => { + switch (win.webContents.getTitle() as "abortInstall" | "reviewCode" | "install") { + case "abortInstall": { + win.close(); + await rm(join(vencordPath, "..", "src", "userplugins", repo), { + recursive: true + }); + return reject("Rejected by user"); + } + case "install": { + win.close(); + try { + await build(); + } + catch (e) { + reject((e as Error).toString()); + } + resolve(JSON.stringify({ + name: meta.name, + native: meta.usesNative + })); + break; + } + } + }); + win.show(); + }); +} + +async function build(): Promise { + return new Promise((resolve, reject) => { + const proc = exec("pnpm build --dev", { + cwd: join(vencordPath, ".."), + shell: process.env.SHELL || process.env.ComSpec || "/bin/sh" + }); + proc.once("close", () => { + if (proc.exitCode !== 0) { + reject("Failed to build Vencord, try building from console"); + } + resolve("Success"); + }); + }); +} + +async function getPluginMeta(path: string, extra: object = {}): Promise<{ + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; + directory?: string; + remote: string; + supportChannelID?: string; +}> { + return new Promise((resolve, reject) => { + const files = readdirSync(path); + let fileToRead: "index.ts" | "index.tsx" | "index.js" | "index.jsx" | undefined; + files.forEach(f => { + if (f === "index.ts") fileToRead = "index.ts"; + if (f === "index.tsx") fileToRead = "index.tsx"; + if (f === "index.js") fileToRead = "index.js"; + if (f === "index.jsx") fileToRead = "index.jsx"; + }); + if (!fileToRead) reject("Invalid plugin"); + + const file = readFileSync(`${path}/${fileToRead}`, "utf8"); + let remoteURL; + try { + const remoteC = readFileSync(join(path, ".git/config"), "utf8"); + remoteURL = remoteC.match(/\[remote "origin"]\s+url = (https:\/\/(?:(?:git(?:hub|lab)\.com|git\.(?:[a-zA-Z0-9]|\.)+|codeberg\.org)\/(?!user-attachments)(?:[a-zA-Z0-9]|-)+\/(?:[a-zA-Z0-9]|-|\.)+(?:\.git)?|(plugins\.(nin0)\.dev)\/((?:[a-zA-Z0-9]|-|\.)+))(?:\/)?)\n/); + } catch { + remoteURL = null; + } + + let supportChannelID; + try { + const meta = readFileSync(join(path, "meta.yml"), "utf8"); + console.log(meta); + const parsed = yaml.load(meta); + if (parsed.thread && typeof parsed.thread === "string" && /^\d+$/.test(parsed.thread)) { + supportChannelID = parsed.thread; + } + } catch { + supportChannelID = null; + } + + const rawMeta = file.match(PLUGIN_META_REGEX); + resolve({ + name: rawMeta![1], + description: rawMeta![2], + usesPreSend: file.includes("PreSendListener") || file.includes("onBeforeMessage"), + usesNative: files.includes("native.ts") || files.includes("native.js"), + remote: remoteURL ? remoteURL[1] : "", + supportChannelID, + ...extra + }); + + }); +} + +async function cloneRepo(link: string, repo: string): Promise { + return new Promise((resolve, reject) => { + const proc = spawn("git", ["clone", link], { + cwd: join(vencordPath, "..", "src", "userplugins") + }); + proc.once("close", async () => { + if (proc.exitCode !== 0) { + if (!existsSync(join(vencordPath, "..", "src", "userplugins", repo))) + return reject("Failed to clone"); + const deleteReqDialog = await dialog.showMessageBox({ + title: "Error", + message: "Plugin already exists", + type: "error", + detail: `The plugin that you tried to clone already exists at ${join(vencordPath, "..", "src", "userplugins")}.\nWould you like to reclone it? Only do this if you want to reinstall or update the plugin.`, + buttons: ["No", "Yes"] + }); + if (deleteReqDialog.response !== 1) return reject("User rejected"); + await rm(join(vencordPath, "..", "src", "userplugins", repo), { + recursive: true + }); + await cloneRepo(link, repo); + } + resolve(); + }); + }); +} + +function generateReviewPluginContent(meta: { + name: string; + description: string; + usesPreSend: boolean; + usesNative: boolean; +}): string { + const template = pluginValidateContent.replace("%PLUGINNAME%", meta.name.replaceAll("<", "<")).replace("%PLUGINDESC%", meta.description.replaceAll("<", "<")).replace("%WARNINGHIDER%", !meta.usesNative && !meta.usesPreSend ? "[data-useless=\"warning\"] { display: none !important; }" : "").replace("%NATIVETSHIDER%", meta.usesNative ? "" : "#native-ts-warning { display: none !important; }").replace("%PRESENDHIDER%", meta.usesPreSend ? "" : "#pre-send-warning { display: none !important; }"); + const buf = Buffer.from(template).toString("base64"); + return `data:text/html;base64,${buf}`; +} + +function generateUpdatePluginContent(meta: { + name: string; + description: string; + remote: string; + commit: string; +}): string { + const template = updateValidateContent.replace("%PLUGINNAME%", meta.name.replaceAll("<", "<")).replace("%PLUGINDESC%", meta.description.replaceAll("<", "<")).replace("%REMOTE%", meta.remote).replace("%COMMITMESSAGE%", meta.commit.replaceAll("\n", "
")); + const buf = Buffer.from(template).toString("base64"); + return `data:text/html;base64,${buf}`; +} + +export async function getUserplugins() { + const folderContents = await readdir(join(vencordPath, "..", "src", "userplugins"), { + withFileTypes: true + }); + const plugins = await Promise.allSettled( + folderContents + .filter(item => item.isDirectory()) + .map(item => ({ + path: join(item.parentPath, item.name), + directory: item.name + })) + .map(({ path, directory }) => getPluginMeta(path, { directory })) + ); + + return plugins + .filter(p => p.status === "fulfilled") + .map(p => p.value); +} + +export async function updatePlugin(_, directory: string) { + return new Promise((resolve, reject) => { + const pluginDir = join(vencordPath, "../src/userplugins", directory); + + async function doStuff() { + const pluginMeta = await getPluginMeta(pluginDir); + + const win = new BrowserWindow({ + maximizable: false, + minimizable: false, + width: 560, + height: 600, + resizable: false, + webPreferences: { + devTools: true + }, + title: "Review userplugin", + modal: true, + parent: BrowserWindow.getAllWindows()[0], + show: false, + autoHideMenuBar: true + }); + const reView /* haha got it */ = new WebContentsView({ + webPreferences: { + devTools: true, + nodeIntegration: true + } + }); + win.contentView.addChildView(reView); + + const commitProc = exec("git log origin/HEAD...HEAD --oneline --pretty=format:%an////////%h////////%H////////%s", { + cwd: pluginDir + }); + let rawOutput = ""; + commitProc.stdout?.on("data", d => { + rawOutput += String(d); + }); + commitProc.once("close", () => { + win.loadURL(generateUpdatePluginContent({ + name: pluginMeta.name, + description: pluginMeta.description, + remote: pluginMeta.remote, + commit: rawOutput.split("\n").map(line => line.split("////////")).map(([user, shortCommit, longCommit, message]) => `${user} (${shortCommit}) ~ ${message}`).join("\n") + })); + win.on("page-title-updated", async e => { + if (win.webContents.getTitle().startsWith("openLink:")) { + await shell.openExternal(win.webContents.getTitle().replace("openLink:", "")); + } + switch (win.webContents.getTitle() as "abortInstall" | "install") { + case "abortInstall": { + win.close(); + return reject("Rejected by user"); + } + case "install": { + win.close(); + try { + const otherProc = exec("git rebase origin/HEAD", { + cwd: pluginDir + }); + let errored = ""; + otherProc.stderr?.on("data", d => { if (String(d).includes("Success")) return; errored += String(d); }); + otherProc.once("close", () => { + if (errored) if (!errored.includes("Success")) return reject(`Failed to apply the update, chances are you have local changes that conflict with your remote. Git errors:\n\n${errored}`); + build().then(() => resolve(JSON.stringify({ + name: pluginMeta.name, + native: pluginMeta.usesNative + }))); + }); + } + catch (e) { + reject((e as Error).toString()); + } + break; + } + } + }); + }); + win.show(); + } + doStuff(); + }); +} + +export async function openGitPathModal(_: any) { + const gitPathSet: string | undefined = NativeSettings.store.plugins.UserpluginInstaller?.gitPath; + const win = new BrowserWindow({ + maximizable: false, + minimizable: false, + width: 560, + height: 400, + resizable: false, + webPreferences: { + devTools: true + }, + title: "Set Git path", + modal: true, + parent: BrowserWindow.getAllWindows()[0], + show: false, + autoHideMenuBar: true + }); + const reView = new WebContentsView({ + webPreferences: { + devTools: true, + nodeIntegration: true + } + }); + win.contentView.addChildView(reView); + win.loadURL(`data:text/html;base64,${Buffer.from(setGitPathContent).toString("base64")}`); + win.on("page-title-updated", async _ => { + const t = win.webContents.getTitle(); + if (t === "abort") win.close(); + if (t.startsWith("ok")) { + if (!NativeSettings.store.plugins.UserpluginInstaller) { + NativeSettings.store.plugins.UserpluginInstaller = { + gitPath: undefined + }; + } + if (t === "ok-") { + NativeSettings.store.plugins.UserpluginInstaller.gitPath = undefined; + } else { + const gitPath2 = t.split("-").toSpliced(0, 1).join("-"); + NativeSettings.store.plugins.UserpluginInstaller.gitPath = gitPath2; + } + win.close(); + } + if (t.startsWith("check")) { + try { + const gitProc = spawn(t === "check-" ? "git" : t.split("-").toSpliced(0, 1).join("-"), ["--version"]); + let rawOutput = ""; + gitProc.stdout?.on("data", d => { + rawOutput += String(d); + }); + gitProc.on("error", e => { + dialog.showMessageBox({ + title: "Error", + message: "Git error", + type: "error", + detail: `${e}\n\nDouble-check the path you entered.`, + buttons: ["OK"] + }); + }); + gitProc.once("close", () => { + if (gitProc.exitCode === 0) { + dialog.showMessageBox({ + title: "Success", + message: "Git works!", + type: "info", + detail: `Successfully called ${rawOutput.trim()}`, + buttons: ["OK"] + }); + } + }); + } catch (e) { + dialog.showMessageBox({ + title: "Error", + message: "Git error", + type: "error", + detail: `${e}\n\nDouble-check the path you entered.`, + buttons: ["OK"] + }); + } + } + }); + win.show(); + if (gitPathSet) { + win.webContents.executeJavaScript(`document.querySelector("input").value = ${JSON.stringify(gitPathSet)};`); + } + + console.log(yaml.load(` + name: test + items: + - a + - b + `)); +} diff --git a/src/equicordplugins/vcNarratorCustom/index.tsx b/src/equicordplugins/vcNarratorCustom/index.tsx index c9d80123c..fac57eced 100644 --- a/src/equicordplugins/vcNarratorCustom/index.tsx +++ b/src/equicordplugins/vcNarratorCustom/index.tsx @@ -895,6 +895,7 @@ const UserContextMenuPatch: NavContextMenuPatchCallback = (children, { user }: U export default definePlugin({ name: "VcNarratorCustom", description: "Announces when users join, leave, or move voice channels via narrator using TikTok TTS. Revamped and back from the dead.", + tags: ["Accessibility", "Voice"], authors: [Devs.Ven, Devs.Nyako, EquicordDevs.Loukios, EquicordDevs.examplegit], settings, contextMenus: { diff --git a/src/equicordplugins/vcPanelSettings/index.tsx b/src/equicordplugins/vcPanelSettings/index.tsx index bfc60e08f..24893ae04 100644 --- a/src/equicordplugins/vcPanelSettings/index.tsx +++ b/src/equicordplugins/vcPanelSettings/index.tsx @@ -238,6 +238,7 @@ function VoiceSettings() { export default definePlugin({ name: "VCPanelSettings", description: "Control voice settings right from the voice panel", + tags: ["Utility", "Voice"], authors: [Devs.nin0dev], settings, renderVoiceSettings() { return ; }, diff --git a/src/equicordplugins/viewRawVariant/index.tsx b/src/equicordplugins/viewRawVariant/index.tsx index 41597a401..97730526b 100644 --- a/src/equicordplugins/viewRawVariant/index.tsx +++ b/src/equicordplugins/viewRawVariant/index.tsx @@ -129,6 +129,7 @@ function makeContextCallback( export default definePlugin({ name: "ViewRawVariant", description: "Copy/View raw content of any message, channel, or guild, but show in the right click menu.", + tags: ["Appearance", "Customisation", "Chat", "Organisation", "Servers"], authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna, Devs.Kyuuhachi], contextMenus: { "guild-context": makeContextCallback("guild", val => diff --git a/src/equicordplugins/voiceButtons/index.tsx b/src/equicordplugins/voiceButtons/index.tsx index af960f502..4654572ff 100644 --- a/src/equicordplugins/voiceButtons/index.tsx +++ b/src/equicordplugins/voiceButtons/index.tsx @@ -16,6 +16,7 @@ import { UserChatButton, UserDeafenButton, UserMuteButton } from "./utils"; export default definePlugin({ name: "VoiceButtons", description: "Quickly DM, mute, or deafen any user right from the voice-call panel.", + tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.nicola02nb, EquicordDevs.omaw], settings, patches: [ diff --git a/src/equicordplugins/voiceChannelLog/index.tsx b/src/equicordplugins/voiceChannelLog/index.tsx index a0e4d1d9c..377ff7503 100644 --- a/src/equicordplugins/voiceChannelLog/index.tsx +++ b/src/equicordplugins/voiceChannelLog/index.tsx @@ -54,8 +54,9 @@ const patchChannelContextMenu: NavContextMenuPatchCallback = (children, { channe export default definePlugin({ name: "VoiceChannelLog", description: "Logs voice channel activity including joins, leaves, soundboard, mute, camera, screenshare, and more.", + tags: ["Servers", "Utility", "Voice"], authors: [Devs.Sqaaakoi, Devs.thororen, EquicordDevs.nyx, Devs.Moxxie, EquicordDevs.Fres, Devs.amy], - dependencies: ["AudioPlayerAPI"], + dependencies: ["AudioPlayerAPI", "HeaderBarAPI"], settings, contextMenus: { "channel-context": patchChannelContextMenu diff --git a/src/equicordplugins/voiceChatUtils/index.tsx b/src/equicordplugins/voiceChatUtils/index.tsx index 421000cf7..a9ebea15f 100644 --- a/src/equicordplugins/voiceChatUtils/index.tsx +++ b/src/equicordplugins/voiceChatUtils/index.tsx @@ -174,6 +174,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "VoiceChatUtilities", description: "This plugin allows you to perform multiple actions on an entire channel (move, mute, disconnect, etc.) (originally by dutake)", + tags: ["Chat", "Servers", "Voice"], authors: [Devs.D3SOX, EquicordDevs.nickwoah], settings, diff --git a/src/equicordplugins/voiceJoinMessages/index.ts b/src/equicordplugins/voiceJoinMessages/index.ts index 12824ab91..3fdc3499b 100644 --- a/src/equicordplugins/voiceJoinMessages/index.ts +++ b/src/equicordplugins/voiceJoinMessages/index.ts @@ -111,6 +111,7 @@ let clientOldChannelId: string | undefined; export default definePlugin({ name: "VoiceJoinMessages", description: "Recieve client-side ephemeral messages when your friends join voice channels", + tags: ["Servers", "Utility", "Voice"], authors: [Devs.Sqaaakoi, Devs.thororen], settings, flux: { diff --git a/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx b/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx index f60724321..db2d8def3 100644 --- a/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx +++ b/src/equicordplugins/voiceMessageTranscriber.desktop/index.tsx @@ -314,6 +314,7 @@ export default definePlugin({ name: "VoiceMessageTranscriber", authors: [Devs.TheSun], description: "On-device transcriptions for voice messages powered by Whisper v3", + tags: ["Chat", "Media", "Utility", "Voice"], patches: [ { find: ".VOICE_MESSAGE)),", diff --git a/src/equicordplugins/voiceRejoin/index.tsx b/src/equicordplugins/voiceRejoin/index.tsx index 12042df43..291bd7aee 100644 --- a/src/equicordplugins/voiceRejoin/index.tsx +++ b/src/equicordplugins/voiceRejoin/index.tsx @@ -51,6 +51,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "VoiceRejoin", description: "Rejoins DM/Server call automatically when restarting Discord.", + tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.omaw, EquicordDevs.keircn], settings, diff --git a/src/equicordplugins/waitForSlot/index.tsx b/src/equicordplugins/waitForSlot/index.tsx index fbcfd636e..4df55ee89 100644 --- a/src/equicordplugins/waitForSlot/index.tsx +++ b/src/equicordplugins/waitForSlot/index.tsx @@ -64,6 +64,7 @@ function promptVoiceChannel(channel: Channel | null | undefined): boolean { export default definePlugin({ name: "WaitForSlot", description: "Automatically join a full voice channel when a slot opens.", + tags: ["Servers", "Utility", "Voice"], authors: [EquicordDevs.omaw, Devs.prism], settings, patches: [ diff --git a/src/equicordplugins/wallpaperFree/index.tsx b/src/equicordplugins/wallpaperFree/index.tsx index cfc8fe99e..6cd0364c4 100644 --- a/src/equicordplugins/wallpaperFree/index.tsx +++ b/src/equicordplugins/wallpaperFree/index.tsx @@ -33,6 +33,7 @@ export default definePlugin({ name: "WallpaperFree", authors: [Devs.Joona], description: "Recreation of the old DM wallpaper experiment; Set a background image for any channel, user or server.", + tags: ["Appearance", "Chat", "Customisation"], patches: [ { find: ".handleSendMessage,onResize", diff --git a/src/equicordplugins/webpackTarball/index.tsx b/src/equicordplugins/webpackTarball/index.tsx index 536e1212c..c96e9011c 100644 --- a/src/equicordplugins/webpackTarball/index.tsx +++ b/src/equicordplugins/webpackTarball/index.tsx @@ -31,6 +31,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "WebpackTarball", description: "Converts Discord's webpack sources into a tarball.", + tags: ["Developers", "Utility"], authors: [Devs.Kyuuhachi], settings, diff --git a/src/equicordplugins/whitelistedEmojis/index.tsx b/src/equicordplugins/whitelistedEmojis/index.tsx index 70d21eb37..7a72e531f 100644 --- a/src/equicordplugins/whitelistedEmojis/index.tsx +++ b/src/equicordplugins/whitelistedEmojis/index.tsx @@ -597,6 +597,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhitelistedEmojis", description: "Adds the ability to disable all message emojis except for a whitelisted set.", + tags: ["Chat", "Emotes"], authors: [EquicordDevs.creations], patches: [ { diff --git a/src/equicordplugins/whosWatching/index.tsx b/src/equicordplugins/whosWatching/index.tsx index 2412d1827..e7dfe0020 100644 --- a/src/equicordplugins/whosWatching/index.tsx +++ b/src/equicordplugins/whosWatching/index.tsx @@ -82,6 +82,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhosWatching", description: "Hover over the screenshare icon to view what users are watching your stream", + tags: ["Activity"], authors: [EquicordDevs.Fres, Devs.thororen], settings, patches: [ diff --git a/src/equicordplugins/wigglyText/index.tsx b/src/equicordplugins/wigglyText/index.tsx index 1f683e9e6..b3118029f 100644 --- a/src/equicordplugins/wigglyText/index.tsx +++ b/src/equicordplugins/wigglyText/index.tsx @@ -112,6 +112,7 @@ const updateStyles = () => { export default definePlugin({ name: "WigglyText", description: "Adds a new markdown formatting that makes text wiggly.", + tags: ["Appearance", "Customisation", "Fun"], authors: [EquicordDevs.nexpid], settings, settingsAboutComponent: () => ( diff --git a/src/equicordplugins/writeUpperCase/index.ts b/src/equicordplugins/writeUpperCase/index.ts index 263b1a231..81a9a329a 100644 --- a/src/equicordplugins/writeUpperCase/index.ts +++ b/src/equicordplugins/writeUpperCase/index.ts @@ -37,6 +37,7 @@ const presendObject: MessageSendListener = (_, msg) => { export default definePlugin({ name: "WriteUpperCase", description: "Changes the first Letter of each Sentence in Message Inputs to Uppercase", + tags: ["Appearance", "Customisation", "Chat"], authors: [Devs.Samwich, EquicordDevs.KrystalSkull], settings, diff --git a/src/main/utils/extensions.ts b/src/main/utils/extensions.ts index 9ecfbfe82..0b19d9286 100644 --- a/src/main/utils/extensions.ts +++ b/src/main/utils/extensions.ts @@ -79,6 +79,6 @@ export async function installExt(id: string) { .catch(err => console.error(`Failed to extract extension ${id}`, err)); } - // @ts-expect-error Electron 36 Deprecates session.defaultSession.loadExtension() + // Electron 36 Deprecates session.defaultSession.loadExtension() session.defaultSession.extensions ? session.defaultSession.extensions.loadExtension(extDir) : session.defaultSession.loadExtension(extDir); } diff --git a/src/plugins/_core/supportHelper.tsx b/src/plugins/_core/supportHelper.tsx index a2e1d8172..385472477 100644 --- a/src/plugins/_core/supportHelper.tsx +++ b/src/plugins/_core/supportHelper.tsx @@ -289,7 +289,7 @@ export default definePlugin({ required: true, description: "Helps us provide support to you", authors: [Devs.Ven], - dependencies: ["UserSettingsAPI"], + dependencies: ["UserSettingsAPI", "CommandsAPI", "MessageAccessoriesAPI"], settings, diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index 12f5f5cbb..dad81c7bb 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -70,6 +70,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AccountPanelServerProfile", description: "Right click your account panel in the bottom left to view your profile in the current server", + tags: ["Appearance", "Servers"], authors: [Devs.Nuckyz, Devs.relitrix], settings, @@ -79,7 +80,7 @@ export default definePlugin({ group: true, replacement: [ { - match: /(\.AVATAR,children:.+?renderPopout:(\i)=>){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, + match: /(\.AVATAR,children:.+?renderPopout:\(?(\i)(?:,\i\))?=>){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, replace: (_, rest, popoutProps, originalPopout, currentUser) => `${rest}$self.UserProfile({popoutProps:${popoutProps},currentUser:${currentUser},originalRenderPopout:()=>{${originalPopout}}})` }, { diff --git a/src/plugins/alwaysAnimate/index.ts b/src/plugins/alwaysAnimate/index.ts index 071596253..e66792ee5 100644 --- a/src/plugins/alwaysAnimate/index.ts +++ b/src/plugins/alwaysAnimate/index.ts @@ -51,6 +51,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AlwaysAnimate", description: "Animates anything that can be animated", + tags: ["Appearance", "Fun"], authors: [Devs.FieryFlames], settings, patches: [ diff --git a/src/plugins/alwaysExpandRoles/index.ts b/src/plugins/alwaysExpandRoles/index.ts index 7ad1e6fae..502679ea9 100644 --- a/src/plugins/alwaysExpandRoles/index.ts +++ b/src/plugins/alwaysExpandRoles/index.ts @@ -33,6 +33,7 @@ migratePluginSettings("AlwaysExpandRoles", "ShowAllRoles"); export default definePlugin({ name: "AlwaysExpandRoles", description: "Always expands the role list in profile popouts", + tags: ["Appearance", "Roles"], authors: [Devs.surgedevs], isModified: true, settings, diff --git a/src/plugins/alwaysTrust/index.tsx b/src/plugins/alwaysTrust/index.tsx index a7d975726..1682fc50a 100644 --- a/src/plugins/alwaysTrust/index.tsx +++ b/src/plugins/alwaysTrust/index.tsx @@ -60,6 +60,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "AlwaysTrust", description: "Removes the annoying untrusted domain and suspicious file popup", + tags: ["Utility"], authors: [Devs.zt, Devs.Trwy], isModified: true, settings, diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx index f136d08a0..565ec1a39 100644 --- a/src/plugins/anonymiseFileNames/index.tsx +++ b/src/plugins/anonymiseFileNames/index.tsx @@ -75,6 +75,8 @@ export default definePlugin({ name: "AnonymiseFileNames", authors: [Devs.fawn], description: "Anonymise uploaded file names", + dependencies: ["CommandsAPI"], + tags: ["Privacy", "Utility"], isModified: true, settings, diff --git a/src/plugins/appleMusic.desktop/index.tsx b/src/plugins/appleMusic.desktop/index.tsx index e265f4efc..c477f8e2a 100644 --- a/src/plugins/appleMusic.desktop/index.tsx +++ b/src/plugins/appleMusic.desktop/index.tsx @@ -157,6 +157,7 @@ function getImageAsset(type: AssetImageType, data: TrackData) { export default definePlugin({ name: "AppleMusicRichPresence", description: "Discord rich presence for your Apple Music!", + tags: ["Activity", "Media"], authors: [Devs.RyanCaoDev], hidden: !IS_MAC, reporterTestable: ReporterTestable.None, diff --git a/src/plugins/arRPC.web/index.tsx b/src/plugins/arRPC.web/index.tsx index e602b18eb..31a813211 100644 --- a/src/plugins/arRPC.web/index.tsx +++ b/src/plugins/arRPC.web/index.tsx @@ -42,6 +42,7 @@ migratePluginSettings("WebRichPresence", "WebRichPresence (arRPC)"); export default definePlugin({ name: "WebRichPresence", description: "Client plugin for arRPC to enable RPC on Discord Web (experimental)", + tags: ["Activity", "Utility"], authors: [Devs.Ducko], reporterTestable: ReporterTestable.None, hidden: !IS_EQUIBOP && !IS_VESKTOP && !("legcord" in window), diff --git a/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts b/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts index d1dbdc213..2c74fec66 100644 --- a/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts +++ b/src/plugins/autoDndWhilePlaying.discordDesktop/index.ts @@ -48,6 +48,7 @@ migratePluginSettings("AutoDNDWhilePlaying", "StatusWhilePlaying"); export default definePlugin({ name: "AutoDNDWhilePlaying", description: "Automatically updates your online status (online, idle, dnd) when launching games", + tags: ["Activity", "Utility"], authors: [Devs.thororen], isModified: true, settings, diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx index caaa38991..947768aac 100644 --- a/src/plugins/betterFolders/index.tsx +++ b/src/plugins/betterFolders/index.tsx @@ -254,9 +254,9 @@ const GRID_STYLE_NAME = "vc-betterFolders-sidebar-grid"; export default definePlugin({ name: "BetterFolders", description: "Shows server folders on dedicated sidebar and adds folder related improvements", + tags: ["Organisation", "Servers", "Appearance"], authors: [Devs.juby, Devs.AutumnVN, Devs.Nuckyz], isModified: true, - settings, start() { settings.store.nestedFolders = getNestedFolderMap(); diff --git a/src/plugins/betterGifAltText/index.ts b/src/plugins/betterGifAltText/index.ts index 0a381e547..3b95f912e 100644 --- a/src/plugins/betterGifAltText/index.ts +++ b/src/plugins/betterGifAltText/index.ts @@ -24,6 +24,7 @@ export default definePlugin({ authors: [Devs.Ven], description: "Change GIF alt text from simply being 'GIF' to containing the gif tags / filename", + tags: ["Media", "Accessibility", "Customisation"], patches: [ { find: ".modalContext})};", diff --git a/src/plugins/betterGifPicker/index.ts b/src/plugins/betterGifPicker/index.ts index cb2675886..3718b03eb 100644 --- a/src/plugins/betterGifPicker/index.ts +++ b/src/plugins/betterGifPicker/index.ts @@ -20,6 +20,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterGifPicker", description: "Makes the gif picker open the favourite category by default", + tags: ["Emotes", "Customisation"], authors: [Devs.Samwich, EquicordDevs.justjxke], isModified: true, settings, diff --git a/src/plugins/betterNotes/index.tsx b/src/plugins/betterNotes/index.tsx index 68aa70c61..465010cff 100644 --- a/src/plugins/betterNotes/index.tsx +++ b/src/plugins/betterNotes/index.tsx @@ -40,6 +40,7 @@ export default definePlugin({ name: "BetterNotesBox", description: "Hide notes or disable spellcheck (Configure in settings!!)", authors: [Devs.Ven], + tags: ["Customisation", "Utility"], settings, patches: [ diff --git a/src/plugins/betterRoleContext/index.tsx b/src/plugins/betterRoleContext/index.tsx index 4a99d8822..6a3ec4141 100644 --- a/src/plugins/betterRoleContext/index.tsx +++ b/src/plugins/betterRoleContext/index.tsx @@ -90,6 +90,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BetterRoleContext", description: "Adds options to copy role color / edit role / view role icon when right clicking roles in the user profile", + tags: ["Roles", "Appearance"], authors: [Devs.Ven, Devs.goodbee], dependencies: ["UserSettingsAPI"], diff --git a/src/plugins/betterRoleDot/index.ts b/src/plugins/betterRoleDot/index.ts index 3cdff9bb4..89caa0056 100644 --- a/src/plugins/betterRoleDot/index.ts +++ b/src/plugins/betterRoleDot/index.ts @@ -40,6 +40,7 @@ export default definePlugin({ name: "BetterRoleDot", authors: [Devs.Ven, Devs.AutumnVN], description: "Copy role colour on RoleDot (accessibility setting) click. Also allows using both RoleDot and coloured names simultaneously", + tags: ["Roles", "Appearance"], settings, patches: [ diff --git a/src/plugins/betterSessions/index.tsx b/src/plugins/betterSessions/index.tsx index fcdfbfece..cb016f856 100644 --- a/src/plugins/betterSessions/index.tsx +++ b/src/plugins/betterSessions/index.tsx @@ -56,7 +56,7 @@ export default definePlugin({ name: "BetterSessions", description: "Enhances the sessions (devices) menu. Allows you to view exact timestamps, give each session a custom name, and receive notifications about new sessions.", authors: [Devs.amia], - + tags: ["Notifications", "Customisation", "Utility"], settings: settings, patches: [ diff --git a/src/plugins/betterSessions/styles.css b/src/plugins/betterSessions/styles.css index adfc283f0..fafba1ed0 100644 --- a/src/plugins/betterSessions/styles.css +++ b/src/plugins/betterSessions/styles.css @@ -7,13 +7,11 @@ .vc-betterSessions-rename-btn { margin-left: 4px; translate: 0 -2px; - width: fit-content; } .vc-betterSessions-new-btn { margin-left: 4px; translate: 0 -2px; - width: fit-content; pointer-events: none; padding: 1px 4px; } \ No newline at end of file diff --git a/src/plugins/betterSettings/index.tsx b/src/plugins/betterSettings/index.tsx index fb95d41ba..58591d6ed 100644 --- a/src/plugins/betterSettings/index.tsx +++ b/src/plugins/betterSettings/index.tsx @@ -78,6 +78,7 @@ export default definePlugin({ name: "BetterSettings", description: "Enhances your settings-menu-opening experience", authors: [Devs.Kyuuhachi], + tags: ["Appearance", "Customisation", "Organisation"], settings, start() { diff --git a/src/plugins/betterUploadButton/index.ts b/src/plugins/betterUploadButton/index.ts index 9639dc60a..44fe643d2 100644 --- a/src/plugins/betterUploadButton/index.ts +++ b/src/plugins/betterUploadButton/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "BetterUploadButton", authors: [Devs.fawn, Devs.Ven], description: "Upload with a single click, open menu with right click", + tags: ["Utility", "Shortcuts"], patches: [ { find: ".CHAT_INPUT_BUTTON_NOTIFICATION,", diff --git a/src/plugins/biggerStreamPreview/index.tsx b/src/plugins/biggerStreamPreview/index.tsx index 2e8beb86a..a1e8959c9 100644 --- a/src/plugins/biggerStreamPreview/index.tsx +++ b/src/plugins/biggerStreamPreview/index.tsx @@ -89,6 +89,7 @@ export const userContextPatch: NavContextMenuPatchCallback = (children, { user } export default definePlugin({ name: "BiggerStreamPreview", description: "This plugin allows you to enlarge stream previews", + tags: ["Media", "Appearance"], authors: [Devs.phil], contextMenus: { "user-context": userContextPatch, diff --git a/src/plugins/blurNsfw/index.ts b/src/plugins/blurNsfw/index.ts index d37545836..e959d7ffc 100644 --- a/src/plugins/blurNsfw/index.ts +++ b/src/plugins/blurNsfw/index.ts @@ -43,6 +43,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "BlurNSFW", description: "Blur attachments in NSFW channels until hovered", + tags: ["Privacy", "Appearance"], authors: [Devs.Ven], isModified: true, settings, diff --git a/src/plugins/callTimer/index.tsx b/src/plugins/callTimer/index.tsx index fc9617b45..8402bb97a 100644 --- a/src/plugins/callTimer/index.tsx +++ b/src/plugins/callTimer/index.tsx @@ -109,6 +109,7 @@ let runOneTime = true; export default definePlugin({ name: "CallTimer", description: "Add call timers for all users in voice channels and in the connection status.", + tags: ["Voice", "Utility"], authors: [Devs.Ven, EquicordDevs.MaxHerbold, Devs.D3SOX], managedStyle: alignedChatInputFix, settings, diff --git a/src/plugins/characterCounter/index.tsx b/src/plugins/characterCounter/index.tsx index 209924bc2..57b9c3f30 100644 --- a/src/plugins/characterCounter/index.tsx +++ b/src/plugins/characterCounter/index.tsx @@ -35,6 +35,7 @@ export default definePlugin({ name: "CharacterCounter", description: "Adds a character counter to the chat input", authors: [Devs.thororen], + tags: ["Utility"], settings, patches: [ { diff --git a/src/plugins/clearURLs/index.ts b/src/plugins/clearURLs/index.ts index 362706079..6affa8f9b 100644 --- a/src/plugins/clearURLs/index.ts +++ b/src/plugins/clearURLs/index.ts @@ -50,6 +50,8 @@ interface RuleSet { export default definePlugin({ name: "ClearURLs", description: "Automatically removes tracking elements from URLs you send", + dependencies: ["MessageEventsAPI"], + tags: ["Privacy", "Utility"], authors: [Devs.adryd, Devs.thororen], rules: [] as RuleSet[], diff --git a/src/plugins/clientTheme/index.tsx b/src/plugins/clientTheme/index.tsx index 984318e29..48e16971d 100644 --- a/src/plugins/clientTheme/index.tsx +++ b/src/plugins/clientTheme/index.tsx @@ -29,6 +29,7 @@ export default definePlugin({ name: "ClientTheme", authors: [Devs.Nuckyz], description: "Recreation of the old client theme experiment. Add a color to your Discord client theme", + tags: ["Appearance", "Customisation"], settings, startAt: StartAt.DOMContentLoaded, diff --git a/src/plugins/colorSighted/index.ts b/src/plugins/colorSighted/index.ts index 025cfb94e..0f9201632 100644 --- a/src/plugins/colorSighted/index.ts +++ b/src/plugins/colorSighted/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "ColorSighted", description: "Removes the colorblind-friendly icons from statuses, just like 2015-2017 Discord", authors: [Devs.lewisakura], + tags: ["Appearance", "Accessibility"], patches: [ { find: "Masks.STATUS_ONLINE", diff --git a/src/plugins/consoleJanitor/index.tsx b/src/plugins/consoleJanitor/index.tsx index f01be7791..b3e2d4f69 100644 --- a/src/plugins/consoleJanitor/index.tsx +++ b/src/plugins/consoleJanitor/index.tsx @@ -109,6 +109,7 @@ export default definePlugin({ name: "ConsoleJanitor", description: "Disables annoying console messages/errors", authors: [Devs.Nuckyz, Devs.sadan], + tags: ["Developers", "Console", "Utility"], settings, startAt: StartAt.Init, diff --git a/src/plugins/consoleShortcuts/index.ts b/src/plugins/consoleShortcuts/index.ts index 8b158e6df..f8edc29ad 100644 --- a/src/plugins/consoleShortcuts/index.ts +++ b/src/plugins/consoleShortcuts/index.ts @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import { loadLazyChunks } from "@debug/loadLazyChunks"; import { Devs } from "@utils/constants"; import { getCurrentChannel, getCurrentGuild } from "@utils/discord"; import { runtimeHashMessageKey } from "@utils/intlHash"; @@ -28,7 +29,6 @@ import definePlugin, { PluginNative, StartAt } from "@utils/types"; import * as Webpack from "@webpack"; import { extract, filters, findAll, findModuleId, search } from "@webpack"; import * as Common from "@webpack/common"; -import { loadLazyChunks } from "debug/loadLazyChunks"; import type { ComponentType } from "react"; const DESKTOP_ONLY = (f: string) => () => { @@ -245,6 +245,7 @@ export default definePlugin({ name: "ConsoleShortcuts", description: "Adds shorter Aliases for many things on the window. Run `shortcutList` for a list.", authors: [Devs.Ven], + tags: ["Developers", "Console", "Shortcuts", "Utility"], startAt: StartAt.Init, patches: [ diff --git a/src/plugins/copyEmojiMarkdown/index.tsx b/src/plugins/copyEmojiMarkdown/index.tsx index e03197fec..dfa46a350 100644 --- a/src/plugins/copyEmojiMarkdown/index.tsx +++ b/src/plugins/copyEmojiMarkdown/index.tsx @@ -51,6 +51,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CopyEmojiMarkdown", description: "Allows you to copy emojis as formatted string (<:blobcatcozy:1026533070955872337>)", + tags: ["Emotes", "Utility"], authors: [Devs.HappyEnderman, Devs.Vishnya], settings, diff --git a/src/plugins/copyFileContents/index.tsx b/src/plugins/copyFileContents/index.tsx index be7ec07a2..c74a5c544 100644 --- a/src/plugins/copyFileContents/index.tsx +++ b/src/plugins/copyFileContents/index.tsx @@ -22,6 +22,7 @@ const CheckMarkIcon = () => { export default definePlugin({ name: "CopyFileContents", description: "Adds a button to text file attachments to copy their contents", + tags: ["Utility"], authors: [Devs.Obsidian, Devs.Nuckyz], patches: [ { diff --git a/src/plugins/copyStickerLinks/index.tsx b/src/plugins/copyStickerLinks/index.tsx index 635b8d313..bc8fe8e90 100644 --- a/src/plugins/copyStickerLinks/index.tsx +++ b/src/plugins/copyStickerLinks/index.tsx @@ -87,6 +87,7 @@ const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { t export default definePlugin({ name: "CopyStickerLinks", description: "Adds the ability to copy & open Sticker links", + tags: ["Emotes", "Utility"], authors: [Devs.Ven, Devs.Byeoon], contextMenus: { "message": messageContextMenuPatch, diff --git a/src/plugins/copyUserURLs/index.tsx b/src/plugins/copyUserURLs/index.tsx index 744f7ccac..07ac0721d 100644 --- a/src/plugins/copyUserURLs/index.tsx +++ b/src/plugins/copyUserURLs/index.tsx @@ -47,6 +47,7 @@ export default definePlugin({ name: "CopyUserURLs", authors: [Devs.castdrian], description: "Adds a 'Copy User URL' option to the user context menu.", + tags: ["Utility", "Friends"], contextMenus: { "user-context": UserContextMenuPatch } diff --git a/src/plugins/crashHandler/index.ts b/src/plugins/crashHandler/index.ts index 37f1d878b..19db0ea11 100644 --- a/src/plugins/crashHandler/index.ts +++ b/src/plugins/crashHandler/index.ts @@ -61,8 +61,8 @@ export default definePlugin({ name: "CrashHandler", description: "Utility plugin for handling and possibly recovering from crashes without a restart", authors: [Devs.Nuckyz], + tags: ["Utility", "Developers"], enabledByDefault: true, - settings, patches: [ diff --git a/src/plugins/ctrlEnterSend/index.ts b/src/plugins/ctrlEnterSend/index.ts index 7b0b26b9a..ba6eb3df6 100644 --- a/src/plugins/ctrlEnterSend/index.ts +++ b/src/plugins/ctrlEnterSend/index.ts @@ -12,6 +12,7 @@ export default definePlugin({ name: "CtrlEnterSend", authors: [Devs.UlyssesZhan], description: "Use Ctrl+Enter to send messages (customizable)", + tags: ["Shortcuts", "Chat"], settings: definePluginSettings({ submitRule: { description: "The way to send a message", diff --git a/src/plugins/customCommands/index.ts b/src/plugins/customCommands/index.ts index b89e4d958..bc77ab6f6 100644 --- a/src/plugins/customCommands/index.ts +++ b/src/plugins/customCommands/index.ts @@ -90,8 +90,10 @@ migratePluginSettings("CustomCommands", "MessageTags"); export default definePlugin({ name: "CustomCommands", description: "Allows you to create custom slash commands / tags", - tags: ["MessageTags"], + dependencies: ["CommandsAPI"], + searchTerms: ["MessageTags"], authors: [Devs.Ven, Devs.Luna,], + tags: ["Commands", "Customisation", "Utility"], settings, async start() { diff --git a/src/plugins/customIdle/index.ts b/src/plugins/customIdle/index.ts index 60ebf6ba7..3f3dca72f 100644 --- a/src/plugins/customIdle/index.ts +++ b/src/plugins/customIdle/index.ts @@ -29,6 +29,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "CustomIdle", description: "Allows you to set the time before Discord goes idle (or disable auto-idle)", + tags: ["Activity", "Customisation"], authors: [Devs.newwares], settings, patches: [ diff --git a/src/plugins/customRPC/index.tsx b/src/plugins/customRPC/index.tsx index 44f18f6c1..bafff2c2e 100644 --- a/src/plugins/customRPC/index.tsx +++ b/src/plugins/customRPC/index.tsx @@ -215,6 +215,7 @@ export async function setRpc(disable?: boolean) { export default definePlugin({ name: "CustomRPC", description: "Add a fully customisable Rich Presence (Game status) to your Discord profile", + tags: ["Activity", "Customisation"], authors: [Devs.captain, Devs.AutumnVN, Devs.nin0dev], dependencies: ["UserSettingsAPI"], // This plugin's patch is not important for functionality, so don't require a restart diff --git a/src/plugins/dearrow/index.tsx b/src/plugins/dearrow/index.tsx index 1247472d4..b9a367f8a 100644 --- a/src/plugins/dearrow/index.tsx +++ b/src/plugins/dearrow/index.tsx @@ -170,6 +170,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Dearrow", description: "Makes YouTube embed titles and thumbnails less sensationalist, powered by Dearrow", + tags: ["Media", "Utility"], authors: [Devs.Ven], settings, diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index f9a3cf452..cbc57d06d 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -27,6 +27,7 @@ export interface AvatarDecoration { export default definePlugin({ name: "Decor", description: "Create and use your own custom avatar decorations, or pick your favorite from the presets.", + tags: ["Appearance", "Customisation"], authors: [Devs.FieryFlames], patches: [ // Patch MediaResolver to return correct URL for Decor avatar decorations diff --git a/src/plugins/devCompanion.dev/index.tsx b/src/plugins/devCompanion.dev/index.tsx index 43449840c..da7b42ebd 100644 --- a/src/plugins/devCompanion.dev/index.tsx +++ b/src/plugins/devCompanion.dev/index.tsx @@ -48,6 +48,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "DevCompanion", description: "Dev Companion Plugin. Please report anything not working or being weird (most likely its a bug) to sadan, either ping or dm, thanks!", + tags: ["Developers", "Utility"], authors: [Devs.Ven, Devs.sadan], reporterTestable: ReporterTestable.None, isModified: true, diff --git a/src/plugins/devCompanion.dev/initWs.tsx b/src/plugins/devCompanion.dev/initWs.tsx index 92cb15858..49e931808 100644 --- a/src/plugins/devCompanion.dev/initWs.tsx +++ b/src/plugins/devCompanion.dev/initWs.tsx @@ -5,6 +5,7 @@ */ import { popNotice, showNotice } from "@api/Notices"; +import { Settings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { loadLazyChunks } from "@debug/loadLazyChunks"; import { reporterData } from "@debug/reporterData"; @@ -12,7 +13,6 @@ import { getIntlMessageFromHash } from "@utils/discord"; import { canonicalizeMatch, canonicalizeReplace } from "@utils/patches"; import { filters, findAll, search, wreq } from "@webpack"; import { React, Toasts, useState } from "@webpack/common"; -import { Settings } from "Vencord"; import { CLIENT_VERSION, logger, PORT, settings } from "."; import { Recieve } from "./types"; diff --git a/src/plugins/devCompanion.dev/types/send.ts b/src/plugins/devCompanion.dev/types/send.ts index 86260a4e3..e9439e631 100644 --- a/src/plugins/devCompanion.dev/types/send.ts +++ b/src/plugins/devCompanion.dev/types/send.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { ReporterData } from "debug/reporterData"; +import { ReporterData } from "@debug/reporterData"; export type OutgoingMessage = Base; export type FullOutgoingMessage = OutgoingMessage & Nonce; diff --git a/src/plugins/devCompanion.dev/util.tsx b/src/plugins/devCompanion.dev/util.tsx index 4fda47040..7611b8081 100644 --- a/src/plugins/devCompanion.dev/util.tsx +++ b/src/plugins/devCompanion.dev/util.tsx @@ -10,8 +10,8 @@ import { Settings } from "@api/Settings"; import { canonicalizeMatch } from "@utils/patches"; import { CodeFilter, stringMatches, wreq } from "@webpack"; import { Toasts } from "@webpack/common"; -import { WebpackPatcher } from "Vencord"; +import { WebpackPatcher } from "../../Vencord"; import { logger, settings as companionSettings } from "."; import { FindNode } from "./types/recieve"; diff --git a/src/plugins/disableCallIdle/index.ts b/src/plugins/disableCallIdle/index.ts index 216f1218c..523580e76 100644 --- a/src/plugins/disableCallIdle/index.ts +++ b/src/plugins/disableCallIdle/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableCallIdle", description: "Disables automatically getting kicked from a DM voice call after 3 minutes and being moved to an AFK voice channel.", + tags: ["Voice", "Utility"], authors: [Devs.Nuckyz], patches: [ { diff --git a/src/plugins/dontRoundMyTimestamps/index.ts b/src/plugins/dontRoundMyTimestamps/index.ts index 4c432c73f..7d8cb9b14 100644 --- a/src/plugins/dontRoundMyTimestamps/index.ts +++ b/src/plugins/dontRoundMyTimestamps/index.ts @@ -24,6 +24,7 @@ export default definePlugin({ name: "DontRoundMyTimestamps", authors: [Devs.Lexi], description: "Always rounds relative timestamps down, so 7.6y becomes 7y instead of 8y", + tags: ["Appearance", "Utility"], start() { moment.relativeTimeRounding(Math.floor); diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index 9c1802577..5382dc250 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -37,6 +37,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "Experiments", description: "Enable Access to Experiments & other dev-only features in Discord!", + tags: ["Developers", "Utility"], authors: [ Devs.Megu, Devs.Ven, @@ -70,6 +71,8 @@ export default definePlugin({ match: /(?<=children:\[)(?=null!=.{0,150}"Installation ID:)/, replace: "$self.WarningCard()," }, + // for some reason the installation id and copy buttons are on + // different lines so it looks stupid when the card above is added { match: /(?<=,marginBottom:16)(?=\},children:\[)/, replace: ',flexDirection:"row",alignItems:"center"' diff --git a/src/plugins/expressionCloner/index.tsx b/src/plugins/expressionCloner/index.tsx index 3a79a05ef..3e80f75b0 100644 --- a/src/plugins/expressionCloner/index.tsx +++ b/src/plugins/expressionCloner/index.tsx @@ -232,7 +232,7 @@ function CloneModal({ data }: { data: Sticker | Emoji; }) { <> Custom Name { data.name = v; setName(v); @@ -411,7 +411,8 @@ migratePluginSettings("ExpressionCloner", "EmoteCloner"); export default definePlugin({ name: "ExpressionCloner", description: "Allows you to clone Emotes & Stickers to your own server (right click them)", - tags: ["StickerCloner", "EmoteCloner", "EmojiCloner"], + tags: ["Emotes", "Servers"], + searchTerms: ["StickerCloner", "EmoteCloner", "EmojiCloner"], authors: [Devs.Ven, Devs.Nuckyz], contextMenus: { "message": messageContextMenuPatch, diff --git a/src/plugins/f8break/index.ts b/src/plugins/f8break/index.ts index 89dd2c92f..5b1b118ce 100644 --- a/src/plugins/f8break/index.ts +++ b/src/plugins/f8break/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "F8Break", description: "Pause the client when you press F8 with DevTools (+ breakpoints) open.", + tags: ["Developers", "Shortcuts"], authors: [Devs.lewisakura], start() { diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx index 10559321d..dfd345191 100644 --- a/src/plugins/fakeNitro/index.tsx +++ b/src/plugins/fakeNitro/index.tsx @@ -180,6 +180,7 @@ export default definePlugin({ name: "FakeNitro", authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven, Devs.fawn, Devs.captain, Devs.Nuckyz, Devs.AutumnVN, Devs.sadan], description: "Allows you to send fake emojis/stickers, use nitro themes, and stream in nitro quality", + tags: ["Emotes", "Appearance", "Customisation", "Chat"], dependencies: ["MessageEventsAPI"], settings, diff --git a/src/plugins/fakeProfileThemes/index.tsx b/src/plugins/fakeProfileThemes/index.tsx index 589862c4d..ec550f850 100644 --- a/src/plugins/fakeProfileThemes/index.tsx +++ b/src/plugins/fakeProfileThemes/index.tsx @@ -200,6 +200,7 @@ function SettingsAboutComponent() { export default definePlugin({ name: "FakeProfileThemes", description: "Allows profile theming by hiding the colors in your bio thanks to invisible 3y3 encoding", + tags: ["Appearance", "Customisation"], authors: [Devs.Alyxia, Devs.Remty], patches: [ { diff --git a/src/plugins/favEmojiFirst/index.tsx b/src/plugins/favEmojiFirst/index.tsx index f369023c5..4c6261d78 100644 --- a/src/plugins/favEmojiFirst/index.tsx +++ b/src/plugins/favEmojiFirst/index.tsx @@ -1101,8 +1101,9 @@ const messageSendListener = (_channelId: string, messageObj: { content: string; export default definePlugin({ name: "FavoriteEmojiFirst", authors: [Devs.Aria, Devs.Ven, EquicordDevs.justjxke], - tags: ["EmojiAlias"], + tags: ["Emotes", "Customisation"], description: "Puts your favorite emoji first in the emoji autocomplete and also has emoji alias.", + dependencies: ["MessagePopoverAPI"], settings, contextMenus: { "expression-picker": expressionPickerPatch, diff --git a/src/plugins/favGifSearch/index.tsx b/src/plugins/favGifSearch/index.tsx index 8c720f1fb..57926ef24 100644 --- a/src/plugins/favGifSearch/index.tsx +++ b/src/plugins/favGifSearch/index.tsx @@ -84,6 +84,7 @@ export default definePlugin({ name: "FavoriteGifSearch", authors: [Devs.Aria], description: "Adds a search bar to favorite gifs.", + tags: ["Media", "Customisation"], patches: [ { diff --git a/src/plugins/fixCodeblockGap/index.ts b/src/plugins/fixCodeblockGap/index.ts index d65d83dc7..e9a7cca28 100644 --- a/src/plugins/fixCodeblockGap/index.ts +++ b/src/plugins/fixCodeblockGap/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "FixCodeblockGap", description: "Removes the gap between codeblocks and text below it", + tags: ["Appearance"], authors: [Devs.Grzesiek11], patches: [ { diff --git a/src/plugins/fixImagesQuality/index.tsx b/src/plugins/fixImagesQuality/index.tsx index 5215b68e9..7b5bb9742 100644 --- a/src/plugins/fixImagesQuality/index.tsx +++ b/src/plugins/fixImagesQuality/index.tsx @@ -24,6 +24,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "FixImagesQuality", description: "Improves quality of images by loading them at their original resolution", + tags: ["Media", "Appearance"], authors: [Devs.Nuckyz, Devs.Ven], settings, diff --git a/src/plugins/fixSpotifyEmbeds.desktop/index.tsx b/src/plugins/fixSpotifyEmbeds.desktop/index.tsx index c5b42742a..4ca6f5fe3 100644 --- a/src/plugins/fixSpotifyEmbeds.desktop/index.tsx +++ b/src/plugins/fixSpotifyEmbeds.desktop/index.tsx @@ -23,5 +23,6 @@ export default definePlugin({ name: "FixSpotifyEmbeds", description: "Fixes spotify embeds being incredibly loud by letting you customise the volume", authors: [Devs.Ven], + tags: ["Media", "Customisation"], settings, }); diff --git a/src/plugins/fixYoutubeEmbeds.desktop/index.tsx b/src/plugins/fixYoutubeEmbeds.desktop/index.tsx index 6ea46fd7f..d76bd666e 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/index.tsx +++ b/src/plugins/fixYoutubeEmbeds.desktop/index.tsx @@ -27,6 +27,7 @@ migratePluginSettings("FixYoutubeEmbeds", "YoutubeDescription"); export default definePlugin({ name: "FixYoutubeEmbeds", description: "Bypasses youtube videos being blocked from display on Discord (for example by UMG)", + tags: ["Media", "Utility"], authors: [Devs.coolelectronics, Devs.arHSM], settings, patches: [ diff --git a/src/plugins/fixYoutubeEmbeds.desktop/native.ts b/src/plugins/fixYoutubeEmbeds.desktop/native.ts index f865a6566..950940b06 100644 --- a/src/plugins/fixYoutubeEmbeds.desktop/native.ts +++ b/src/plugins/fixYoutubeEmbeds.desktop/native.ts @@ -4,8 +4,8 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { RendererSettings } from "@main/settings"; import { app } from "electron"; -import { RendererSettings } from "main/settings"; app.on("browser-window-created", (_, win) => { win.webContents.on("frame-created", (_, { frame }) => { diff --git a/src/plugins/forceOwnerCrown/index.ts b/src/plugins/forceOwnerCrown/index.ts index f7e4b4701..17997568a 100644 --- a/src/plugins/forceOwnerCrown/index.ts +++ b/src/plugins/forceOwnerCrown/index.ts @@ -25,6 +25,7 @@ export default definePlugin({ name: "ForceOwnerCrown", description: "Force the owner crown next to usernames even if the server is large.", authors: [Devs.D3SOX, Devs.Nickyux], + tags: ["Roles", "Appearance", "Servers"], patches: [ { find: "#{intl::GUILD_OWNER}),children:", diff --git a/src/plugins/friendInvites/index.ts b/src/plugins/friendInvites/index.ts index 0af611bc9..7cd486a7a 100644 --- a/src/plugins/friendInvites/index.ts +++ b/src/plugins/friendInvites/index.ts @@ -26,6 +26,8 @@ const FriendInvites = findByPropsLazy("createFriendInvite"); export default definePlugin({ name: "FriendInvites", description: "Create and manage friend invite links via slash commands (/create friend invite, /view friend invites, /revoke friend invites).", + dependencies: ["CommandsAPI"], + tags: ["Friends", "Commands"], authors: [Devs.afn, Devs.Dziurwa], commands: [ { diff --git a/src/plugins/friendsSince/index.tsx b/src/plugins/friendsSince/index.tsx index 006ea2fce..cc0396c4f 100644 --- a/src/plugins/friendsSince/index.tsx +++ b/src/plugins/friendsSince/index.tsx @@ -23,6 +23,7 @@ const Section = findComponentByCodeLazy("headingVariant:", '"section"', "heading export default definePlugin({ name: "FriendsSince", description: "Shows when you became friends with someone in the user popout", + tags: ["Friends"], authors: [Devs.Elvyra, Devs.Antti], patches: [ // DM User Sidebar diff --git a/src/plugins/fullSearchContext/index.tsx b/src/plugins/fullSearchContext/index.tsx index 2f20cd53b..672552d9f 100644 --- a/src/plugins/fullSearchContext/index.tsx +++ b/src/plugins/fullSearchContext/index.tsx @@ -81,6 +81,7 @@ migratePluginSettings("FullSearchContext", "SearchReply"); export default definePlugin({ name: "FullSearchContext", description: "Makes the message context menu in message search results have all options you'd expect", + tags: ["Utility"], authors: [Devs.Ven, Devs.Aria], patches: [{ diff --git a/src/plugins/fullUserInChatbox/index.tsx b/src/plugins/fullUserInChatbox/index.tsx index 9ac4f811d..dfed0036e 100644 --- a/src/plugins/fullUserInChatbox/index.tsx +++ b/src/plugins/fullUserInChatbox/index.tsx @@ -23,6 +23,7 @@ interface UserMentionComponentProps { export default definePlugin({ name: "FullUserInChatbox", description: "Makes the user mention in the chatbox have more functionalities, like left/right clicking", + tags: ["Shortcuts", "Utility"], authors: [Devs.sadan], patches: [ diff --git a/src/plugins/gameActivityToggle/index.tsx b/src/plugins/gameActivityToggle/index.tsx index 40667fb40..c0ad504ae 100644 --- a/src/plugins/gameActivityToggle/index.tsx +++ b/src/plugins/gameActivityToggle/index.tsx @@ -98,8 +98,9 @@ function GameActivityToggleButton({ iconForeground, hideTooltips, nameplate }: U export default definePlugin({ name: "GameActivityToggle", description: "Adds a button next to the mic and deafen button to toggle game activity.", + tags: ["Activity", "Shortcuts"], authors: [Devs.Nuckyz, Devs.RuukuLada], - dependencies: ["UserSettingsAPI"], + dependencies: ["UserSettingsAPI", "UserAreaAPI"], settings, userAreaButton: { diff --git a/src/plugins/gifPaste/index.ts b/src/plugins/gifPaste/index.ts index 65ea464c4..24804a5b8 100644 --- a/src/plugins/gifPaste/index.ts +++ b/src/plugins/gifPaste/index.ts @@ -26,6 +26,7 @@ import { ExpressionPickerStore } from "@webpack/common"; export default definePlugin({ name: "GifPaste", description: "Makes picking a gif in the gif picker insert a link into the chatbox instead of instantly sending it", + tags: ["Media", "Chat"], authors: [Devs.Ven], patches: [{ diff --git a/src/plugins/greetStickerPicker/index.tsx b/src/plugins/greetStickerPicker/index.tsx index 0604c54d8..7b61f349e 100644 --- a/src/plugins/greetStickerPicker/index.tsx +++ b/src/plugins/greetStickerPicker/index.tsx @@ -152,6 +152,7 @@ function GreetMenu({ channel, message }: { message: Message, channel: Channel; } export default definePlugin({ name: "GreetStickerPicker", description: "Allows you to use any greet sticker instead of only the random one by right-clicking the 'Wave to say hi!' button", + tags: ["Emotes", "Customisation"], authors: [Devs.Ven], settings, diff --git a/src/plugins/hideAttachments/index.tsx b/src/plugins/hideAttachments/index.tsx index 16579d0a7..b47e053ac 100644 --- a/src/plugins/hideAttachments/index.tsx +++ b/src/plugins/hideAttachments/index.tsx @@ -56,8 +56,9 @@ async function toggleHide(channelId: string, messageId: string) { export default definePlugin({ name: "HideMedia", description: "Hide attachments and embeds for individual messages via hover button", + tags: ["Chat", "Appearance"], authors: [Devs.Ven], - dependencies: ["MessageUpdaterAPI"], + dependencies: ["MessageUpdaterAPI", "MessageAccessoriesAPI", "MessagePopoverAPI"], patches: [{ find: "this.renderAttachments(", diff --git a/src/plugins/iLoveSpam/index.ts b/src/plugins/iLoveSpam/index.ts index 2e574cb46..b1bb5b6bc 100644 --- a/src/plugins/iLoveSpam/index.ts +++ b/src/plugins/iLoveSpam/index.ts @@ -24,6 +24,7 @@ migratePluginSettings("IloveSpam", "iLoveSpam"); export default definePlugin({ name: "ILoveSpam", description: "Do not hide messages from 'likely spammers'", + tags: ["Utility", "Chat"], authors: [Devs.botato, Devs.Nyako], patches: [ { diff --git a/src/plugins/ignoreActivities/index.tsx b/src/plugins/ignoreActivities/index.tsx index 8eb334cbf..dfc57bdf4 100644 --- a/src/plugins/ignoreActivities/index.tsx +++ b/src/plugins/ignoreActivities/index.tsx @@ -232,6 +232,7 @@ export default definePlugin({ name: "IgnoreActivities", authors: [Devs.Nuckyz, Devs.Kylie], description: "Ignore activities from showing up on your status ONLY. You can configure which ones are specifically ignored from the Registered Games and Activities tabs, or use the general settings below", + tags: ["Activity", "Privacy", "Customisation"], dependencies: ["UserSettingsAPI"], settings, diff --git a/src/plugins/imageFilename/index.ts b/src/plugins/imageFilename/index.ts index 77717e5b5..d421fb43a 100644 --- a/src/plugins/imageFilename/index.ts +++ b/src/plugins/imageFilename/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "ImageFilename", authors: [Devs.Ven], description: "Display the file name of images & GIFs as a tooltip when hovering over them", + tags: ["Media", "Utility"], settings, patches: [ diff --git a/src/plugins/imageLink/index.ts b/src/plugins/imageLink/index.ts index 08d3a0247..0d01cb1d3 100644 --- a/src/plugins/imageLink/index.ts +++ b/src/plugins/imageLink/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "ImageLink", description: "Never hide image links in messages, even if it's the only content", + tags: ["Media", "Appearance"], authors: [Devs.Kyuuhachi, Devs.Sqaaakoi], patches: [ diff --git a/src/plugins/imageZoom/index.tsx b/src/plugins/imageZoom/index.tsx index bbd9b82a6..38ed37ff2 100644 --- a/src/plugins/imageZoom/index.tsx +++ b/src/plugins/imageZoom/index.tsx @@ -155,8 +155,9 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => export default definePlugin({ name: "ImageZoom", description: "Lets you zoom in to images and gifs. Use scroll wheel to zoom in and shift + scroll wheel to increase lens radius / size", + tags: ["Media", "Utility"], authors: [Devs.Aria], - tags: ["ImageUtilities"], + searchTerms: ["ImageUtilities"], managedStyle, diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts index e5a547dbc..8600894f2 100644 --- a/src/plugins/implicitRelationships/index.ts +++ b/src/plugins/implicitRelationships/index.ts @@ -21,12 +21,25 @@ import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; import { Constants, FluxDispatcher, GuildStore, RelationshipStore, SnowflakeUtils, UserAffinitiesStore, UserStore } from "@webpack/common"; -import { Settings } from "Vencord"; + +const settings = definePluginSettings( + { + sortByAffinity: { + type: OptionType.BOOLEAN, + default: true, + description: "Whether to sort implicit relationships by their affinity to you.", + restartNeeded: true + }, + } +); export default definePlugin({ name: "ImplicitRelationships", description: "Shows your implicit relationships in the Friends tab.", + tags: ["Friends", "Servers"], authors: [Devs.Dolfies], + settings, + patches: [ // Counts header { @@ -73,7 +86,7 @@ export default definePlugin({ { find: "getRelationshipCounts(){", replacement: { - predicate: () => Settings.plugins.ImplicitRelationships.sortByAffinity, + predicate: () => settings.store.sortByAffinity, match: /\}\)\.sortBy\((.+?)\)\.value\(\)/, replace: "}).sortBy(row => $self.wrapSort(($1), row)).value()" } @@ -102,16 +115,6 @@ export default definePlugin({ }, } ], - settings: definePluginSettings( - { - sortByAffinity: { - type: OptionType.BOOLEAN, - default: true, - description: "Whether to sort implicit relationships by their affinity to you.", - restartNeeded: true - }, - } - ), wrapSort(comparator: Function, row: any) { return row.type === 5 diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts index c1d41fbfe..cd405ecfd 100644 --- a/src/plugins/ircColors/index.ts +++ b/src/plugins/ircColors/index.ts @@ -60,6 +60,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "IrcColors", description: "Makes username colors in chat unique, like in IRC clients", + tags: ["Appearance", "Customisation"], authors: [Devs.Grzesiek11, Devs.jamesbt365], settings, diff --git a/src/plugins/keepCurrentChannel/index.ts b/src/plugins/keepCurrentChannel/index.ts index 92a389eb4..61c585aaa 100644 --- a/src/plugins/keepCurrentChannel/index.ts +++ b/src/plugins/keepCurrentChannel/index.ts @@ -43,6 +43,7 @@ let previousCache: PreviousChannel | undefined; export default definePlugin({ name: "KeepCurrentChannel", description: "Attempt to navigate to the channel you were in before switching accounts or loading Discord.", + tags: ["Utility", "Organisation"], authors: [Devs.Nuckyz], patches: [ diff --git a/src/plugins/lastfmRichPresence/index.tsx b/src/plugins/lastfmRichPresence/index.tsx index 98acdc2e3..fdb7b8528 100644 --- a/src/plugins/lastfmRichPresence/index.tsx +++ b/src/plugins/lastfmRichPresence/index.tsx @@ -186,6 +186,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LastFMRichPresence", description: "Little plugin for Last.fm rich presence", + tags: ["Activity", "Media"], authors: [Devs.dzshn, Devs.RuiNtD, Devs.blahajZip, Devs.archeruwu], settings, diff --git a/src/plugins/loadingQuotes/index.ts b/src/plugins/loadingQuotes/index.ts index 8c63fe5a2..fa0dd55fd 100644 --- a/src/plugins/loadingQuotes/index.ts +++ b/src/plugins/loadingQuotes/index.ts @@ -57,6 +57,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "LoadingQuotes", description: "Replace Discords loading quotes", + tags: ["Appearance", "Fun", "Customisation"], authors: [Devs.Ven, Devs.KraXen72, Devs.UlyssesZhan], settings, diff --git a/src/plugins/memberCount/index.tsx b/src/plugins/memberCount/index.tsx index 83c4f85ef..7f94cece4 100644 --- a/src/plugins/memberCount/index.tsx +++ b/src/plugins/memberCount/index.tsx @@ -62,6 +62,7 @@ export const cl = classNameFactory("vc-membercount-"); export default definePlugin({ name: "MemberCount", description: "Shows the number of online members, total members, and users in voice channels on the server — in the member list and tooltip.", + tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Commandtechno, Devs.Apexo], settings, diff --git a/src/plugins/mentionAvatars/index.tsx b/src/plugins/mentionAvatars/index.tsx index b87995c8b..44b4ec12d 100644 --- a/src/plugins/mentionAvatars/index.tsx +++ b/src/plugins/mentionAvatars/index.tsx @@ -48,6 +48,7 @@ function DefaultRoleIcon() { export default definePlugin({ name: "MentionAvatars", description: "Shows user avatars and role icons inside mentions", + tags: ["Appearance", "Customisation"], authors: [Devs.Ven, Devs.SerStars], patches: [{ // HEY THOR UPDATE SHOW ME YOUR NAME IF THIS SHIT CHANGES TY :) diff --git a/src/plugins/messageClickActions/index.ts b/src/plugins/messageClickActions/index.ts index 42fd83fef..b070db16e 100644 --- a/src/plugins/messageClickActions/index.ts +++ b/src/plugins/messageClickActions/index.ts @@ -577,6 +577,7 @@ async function executeAction( export default definePlugin({ name: "MessageClickActions", description: "Customize click actions on messages.", + tags: ["Chat", "Shortcuts"], authors: [Devs.Ven, EquicordDevs.keircn, EquicordDevs.ZcraftElite, EquicordDevs.omaw], isModified: true, diff --git a/src/plugins/messageLatency/index.tsx b/src/plugins/messageLatency/index.tsx index 6f66fb036..0aac594de 100644 --- a/src/plugins/messageLatency/index.tsx +++ b/src/plugins/messageLatency/index.tsx @@ -29,6 +29,7 @@ const DISCORD_KT_DELAY = 1471228928; export default definePlugin({ name: "MessageLatency", description: "Displays an indicator for messages that took ≥n seconds to send", + tags: ["Chat", "Utility"], authors: [Devs.arHSM], settings: definePluginSettings({ diff --git a/src/plugins/messageLinkEmbeds/index.tsx b/src/plugins/messageLinkEmbeds/index.tsx index 08d02cb82..723e18d79 100644 --- a/src/plugins/messageLinkEmbeds/index.tsx +++ b/src/plugins/messageLinkEmbeds/index.tsx @@ -364,6 +364,7 @@ function AutomodEmbedAccessory(props: MessageEmbedProps): JSX.Element | null { export default definePlugin({ name: "MessageLinkEmbeds", description: "Adds a preview to messages that link another message", + tags: ["Chat", "Appearance"], authors: [Devs.TheSun, Devs.Ven, Devs.RyanCaoDev], dependencies: ["MessageAccessoriesAPI", "MessageUpdaterAPI", "UserSettingsAPI"], diff --git a/src/plugins/messageLogger/index.tsx b/src/plugins/messageLogger/index.tsx index 534f988bc..b54e70226 100644 --- a/src/plugins/messageLogger/index.tsx +++ b/src/plugins/messageLogger/index.tsx @@ -417,6 +417,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "MessageLogger", description: "Temporarily logs deleted and edited messages.", + tags: ["Chat", "Utility"], authors: [Devs.rushii, Devs.Ven, Devs.AutumnVN, Devs.Nickyux, Devs.Kyuuhachi, EquicordDevs.justjxke], dependencies: ["MessageUpdaterAPI"], isModified: true, diff --git a/src/plugins/moreQuickReactions/index.ts b/src/plugins/moreQuickReactions/index.ts index 25e7ff4f7..811b15c1b 100644 --- a/src/plugins/moreQuickReactions/index.ts +++ b/src/plugins/moreQuickReactions/index.ts @@ -52,6 +52,7 @@ migratePluginSettings("MoreQuickReactions", "BetterQuickReact"); export default definePlugin({ name: "MoreQuickReactions", description: "Improves the quick react buttons in the message context menu.", + tags: ["Emotes", "Reactions", "Customisation", "Shortcuts"], authors: [Devs.Ven, Devs.Sqaaakoi, Devs.iamme], isModified: true, settings, diff --git a/src/plugins/mutualGroupDMs/index.tsx b/src/plugins/mutualGroupDMs/index.tsx index 08cb1bf41..2d0a52ce0 100644 --- a/src/plugins/mutualGroupDMs/index.tsx +++ b/src/plugins/mutualGroupDMs/index.tsx @@ -35,7 +35,7 @@ const UserUtils = findByPropsLazy("getGlobalName"); const ProfileListClasses = findCssClassesLazy("empty", "textContainer", "connectionIcon"); const TabBarClasses = findCssClassesLazy("tabPanelScroller", "tabBarPanel"); const MutualsListClasses = findCssClassesLazy("row", "icon", "name", "details"); -const ExpandableList = findComponentByCodeLazy('action:"PRESS_SECTION"', "section"); +const ExpandableList = findComponentByCodeLazy('action:"PRESS_SECTION"', '"section"'); function getGroupDMName(channel: Channel) { return channel.name || @@ -86,6 +86,7 @@ const IS_PATCHED = Symbol("MutualGroupDMs.Patched"); export default definePlugin({ name: "MutualGroupDMs", description: "Shows mutual group dms in profiles", + tags: ["Friends", "Appearance"], authors: [Devs.amia], patches: [ diff --git a/src/plugins/newGuildSettings/index.tsx b/src/plugins/newGuildSettings/index.tsx index dd7f05a91..cbbba3d18 100644 --- a/src/plugins/newGuildSettings/index.tsx +++ b/src/plugins/newGuildSettings/index.tsx @@ -151,7 +151,8 @@ function applyDefaultSettings(guildId: string | null) { export default definePlugin({ name: "NewGuildSettings", description: "Automatically mute new servers and change various other settings upon joining", - tags: ["MuteNewGuild", "mute", "server"], + tags: ["Servers", "Customisation"], + searchTerms: ["MuteNewGuild", "mute", "server"], authors: [Devs.Glitch, Devs.Nuckyz, Devs.carince, Devs.Mopi, Devs.GabiRP], isModified: true, contextMenus: { diff --git a/src/plugins/noBlockedMessages/index.ts b/src/plugins/noBlockedMessages/index.ts index 3c50240fa..4b6b312e4 100644 --- a/src/plugins/noBlockedMessages/index.ts +++ b/src/plugins/noBlockedMessages/index.ts @@ -90,6 +90,7 @@ export default definePlugin({ name: "NoBlockedMessages", description: "Hide all blocked/ignored messages from chat completely.", authors: [Devs.rushii, Devs.Samu, Devs.jamesbt365, Devs.Elvyra, EquicordDevs.Etorix], + tags: ["Accessibility", "Chat"], isModified: true, settings, patches: [ diff --git a/src/plugins/noDeepLinks.web/index.ts b/src/plugins/noDeepLinks.web/index.ts index 019df659a..b1770a3a0 100644 --- a/src/plugins/noDeepLinks.web/index.ts +++ b/src/plugins/noDeepLinks.web/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "DisableDeepLinks", description: "Disables Discord's stupid deep linking feature which tries to force you to use their Desktop App", + tags: ["Utility"], authors: [Devs.Ven], required: true, diff --git a/src/plugins/noDevtoolsWarning/index.ts b/src/plugins/noDevtoolsWarning/index.ts index 5c35fa67b..d5dcad53c 100644 --- a/src/plugins/noDevtoolsWarning/index.ts +++ b/src/plugins/noDevtoolsWarning/index.ts @@ -23,6 +23,7 @@ export default definePlugin({ name: "NoDevtoolsWarning", description: "Disables the 'HOLD UP' banner in the console. As a side effect, also prevents Discord from hiding your token, which prevents random logouts.", authors: [Devs.Ven], + tags: ["Developers", "Console"], patches: [{ find: "setDevtoolsCallbacks", replacement: { diff --git a/src/plugins/noF1/index.ts b/src/plugins/noF1/index.ts index a40be5acc..36e088e46 100644 --- a/src/plugins/noF1/index.ts +++ b/src/plugins/noF1/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoF1", description: "Disables F1 help bind.", + tags: ["Utility"], authors: [Devs.Cyn], patches: [ { diff --git a/src/plugins/noMaskedUrlPaste/index.ts b/src/plugins/noMaskedUrlPaste/index.ts index 64f522cae..fc10f8970 100644 --- a/src/plugins/noMaskedUrlPaste/index.ts +++ b/src/plugins/noMaskedUrlPaste/index.ts @@ -11,6 +11,7 @@ export default definePlugin({ name: "NoMaskedUrlPaste", authors: [Devs.CatNoir], description: "Pasting a link while having text selected will not paste as masked URL", + tags: ["Chat", "Utility"], patches: [ { find: ".selection,preventEmojiSurrogates:", diff --git a/src/plugins/noMosaic/index.ts b/src/plugins/noMosaic/index.ts index c52e19a6b..b360e1ea1 100644 --- a/src/plugins/noMosaic/index.ts +++ b/src/plugins/noMosaic/index.ts @@ -21,7 +21,8 @@ export default definePlugin({ name: "NoMosaic", authors: [Devs.AutumnVN], description: "Removes Discord image mosaic", - tags: ["image", "mosaic", "media"], + tags: ["Media", "Appearance", "Chat"], + searchTerms: ["image", "mosaic", "media"], settings, diff --git a/src/plugins/noOnboardingDelay/index.ts b/src/plugins/noOnboardingDelay/index.ts index 285109761..b5f963463 100644 --- a/src/plugins/noOnboardingDelay/index.ts +++ b/src/plugins/noOnboardingDelay/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoOnboardingDelay", description: "Skips the slow and annoying onboarding delay", + tags: ["Utility", "Servers"], authors: [Devs.nekohaxx], patches: [ { diff --git a/src/plugins/noPendingCount/index.ts b/src/plugins/noPendingCount/index.ts index b1a7ffad8..5bede8b49 100644 --- a/src/plugins/noPendingCount/index.ts +++ b/src/plugins/noPendingCount/index.ts @@ -47,6 +47,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NoPendingCount", description: "Removes the ping count of incoming friend requests, message requests, and nitro offers.", + tags: ["Notifications", "Appearance"], authors: [Devs.amia], settings: settings, diff --git a/src/plugins/noProfileThemes/index.ts b/src/plugins/noProfileThemes/index.ts index 7c440df80..a4fe648d0 100644 --- a/src/plugins/noProfileThemes/index.ts +++ b/src/plugins/noProfileThemes/index.ts @@ -23,6 +23,7 @@ import { UserStore } from "@webpack/common"; export default definePlugin({ name: "NoProfileThemes", description: "Completely removes Nitro profile themes from everyone but yourself", + tags: ["Appearance"], authors: [Devs.TheKodeToad], patches: [ { diff --git a/src/plugins/noReplyMention/index.tsx b/src/plugins/noReplyMention/index.tsx index a08a04b8b..2e2bb9c6b 100644 --- a/src/plugins/noReplyMention/index.tsx +++ b/src/plugins/noReplyMention/index.tsx @@ -62,6 +62,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NoReplyMention", description: "Disables reply pings by default", + tags: ["Chat", "Notifications"], authors: [Devs.DustyAngel47, Devs.rae, Devs.pylix, Devs.outfoxxed], settings, diff --git a/src/plugins/noServerEmojis/index.ts b/src/plugins/noServerEmojis/index.ts index 6550dabb8..fd764dbf3 100644 --- a/src/plugins/noServerEmojis/index.ts +++ b/src/plugins/noServerEmojis/index.ts @@ -26,6 +26,7 @@ export default definePlugin({ name: "NoServerEmojis", authors: [Devs.UlyssesZhan], description: "Do not show server emojis in the autocomplete menu.", + tags: ["Emotes", "Servers"], settings, patches: [ diff --git a/src/plugins/noSystemBadge.discordDesktop/index.ts b/src/plugins/noSystemBadge.discordDesktop/index.ts index 0fbb5332a..c01c0b87a 100644 --- a/src/plugins/noSystemBadge.discordDesktop/index.ts +++ b/src/plugins/noSystemBadge.discordDesktop/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoSystemBadge", description: "Disables the taskbar and system tray unread count badge.", + tags: ["Notifications", "Appearance"], authors: [Devs.rushii], patches: [ { diff --git a/src/plugins/noTypingAnimation/index.ts b/src/plugins/noTypingAnimation/index.ts index 74bcdd50e..6eca410fa 100644 --- a/src/plugins/noTypingAnimation/index.ts +++ b/src/plugins/noTypingAnimation/index.ts @@ -11,6 +11,7 @@ export default definePlugin({ name: "NoTypingAnimation", authors: [Devs.AutumnVN], description: "Disables the CPU-intensive typing dots animation", + tags: ["Appearance"], patches: [ { find: "dotCycle", diff --git a/src/plugins/noUnblockToJump/index.ts b/src/plugins/noUnblockToJump/index.ts index 5d876fc7b..6c1f504b6 100644 --- a/src/plugins/noUnblockToJump/index.ts +++ b/src/plugins/noUnblockToJump/index.ts @@ -22,6 +22,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoUnblockToJump", description: "Allows you to jump to messages of blocked or ignored users and likely spammers without unblocking them", + tags: ["Utility"], authors: [Devs.dzshn], patches: [ { diff --git a/src/plugins/notificationVolume/index.ts b/src/plugins/notificationVolume/index.ts index d320d76f1..5959c0dd1 100644 --- a/src/plugins/notificationVolume/index.ts +++ b/src/plugins/notificationVolume/index.ts @@ -21,6 +21,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "NotificationVolume", description: "Save your ears and set a separate volume for notifications and in-app sounds", + tags: ["Notifications", "Voice"], authors: [Devs.philipbry], settings, patches: [ diff --git a/src/plugins/onePingPerDM/index.ts b/src/plugins/onePingPerDM/index.ts index 05dba7e80..87727fa32 100644 --- a/src/plugins/onePingPerDM/index.ts +++ b/src/plugins/onePingPerDM/index.ts @@ -47,7 +47,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "OnePingPerDM", - description: "If unread messages are sent by a user in DMs multiple times, you'll only receive one audio ping.", + description: "If unread messages are sent by a user in DMs multiple times, you'll only receive one audio ping. Read the messages to reset the limit", + tags: ["Notifications", "Customisation"], authors: [Devs.ProffDea], isModified: true, settings, diff --git a/src/plugins/openInApp/index.ts b/src/plugins/openInApp/index.ts index 05e5b1c29..60012f735 100644 --- a/src/plugins/openInApp/index.ts +++ b/src/plugins/openInApp/index.ts @@ -84,6 +84,7 @@ const Native = VencordNative.pluginHelpers.OpenInApp as PluginNative | undefined; export default definePlugin({ name: "ReactErrorDecoder", - description: 'Replaces "Minifed React Error" with the actual error.', + description: 'Replaces "Minified React Error" with the actual error.', + tags: ["Developers"], authors: [Devs.Cyn, Devs.maisymoe], patches: [ { diff --git a/src/plugins/readAllNotificationsButton/index.tsx b/src/plugins/readAllNotificationsButton/index.tsx index 3a06c385b..65c113a21 100644 --- a/src/plugins/readAllNotificationsButton/index.tsx +++ b/src/plugins/readAllNotificationsButton/index.tsx @@ -66,6 +66,7 @@ const ReadAllButton = () => ( export default definePlugin({ name: "ReadAllNotificationsButton", description: "Read all server notifications with a single button click!", + tags: ["Notifications", "Shortcuts"], authors: [Devs.kemo, EquicordDevs.KrystalSkull], dependencies: ["ServerListAPI"], diff --git a/src/plugins/relationshipNotifier/index.ts b/src/plugins/relationshipNotifier/index.ts index d913dde48..ddb432e43 100644 --- a/src/plugins/relationshipNotifier/index.ts +++ b/src/plugins/relationshipNotifier/index.ts @@ -26,6 +26,7 @@ import { syncAndRunChecks, syncFriends, syncGroups, syncGuilds } from "./utils"; export default definePlugin({ name: "RelationshipNotifier", description: "Notifies you when a friend, group chat, or server removes you.", + tags: ["Friends", "Notifications"], authors: [Devs.nick], settings, diff --git a/src/plugins/replaceGoogleSearch/index.tsx b/src/plugins/replaceGoogleSearch/index.tsx index e12048b18..434923251 100644 --- a/src/plugins/replaceGoogleSearch/index.tsx +++ b/src/plugins/replaceGoogleSearch/index.tsx @@ -131,6 +131,7 @@ migratePluginSettings("ReplaceGoogleSearch", "Search"); export default definePlugin({ name: "ReplaceGoogleSearch", description: "Replaces the Google search with different Engine(s)", + tags: ["Utility", "Customisation"], authors: [Devs.Moxxie, Devs.Ethan], settings, diff --git a/src/plugins/replyTimestamp/index.tsx b/src/plugins/replyTimestamp/index.tsx index 65e969241..021caea59 100644 --- a/src/plugins/replyTimestamp/index.tsx +++ b/src/plugins/replyTimestamp/index.tsx @@ -58,6 +58,7 @@ function ReplyTimestamp({ export default definePlugin({ name: "ReplyTimestamp", description: "Shows a timestamp on replied-message previews", + tags: ["Chat", "Appearance"], authors: [Devs.Kyuuhachi], patches: [ diff --git a/src/plugins/revealAllSpoilers/index.ts b/src/plugins/revealAllSpoilers/index.ts index 173632d7a..a1176d7b5 100644 --- a/src/plugins/revealAllSpoilers/index.ts +++ b/src/plugins/revealAllSpoilers/index.ts @@ -27,7 +27,7 @@ export default definePlugin({ name: "RevealAllSpoilers", description: "Reveal all spoilers in a message by Ctrl-clicking a spoiler, or in the chat with Ctrl+Shift-click", authors: [Devs.whqwert], - + tags: ["Accessibility", "Chat", "Shortcuts", "Utility"], patches: [ { find: ".removeObscurity,", diff --git a/src/plugins/reverseImageSearch/index.tsx b/src/plugins/reverseImageSearch/index.tsx index 10d3fad19..68845c0a1 100644 --- a/src/plugins/reverseImageSearch/index.tsx +++ b/src/plugins/reverseImageSearch/index.tsx @@ -102,8 +102,9 @@ const imageContextMenuPatch: NavContextMenuPatchCallback = (children, props) => export default definePlugin({ name: "ReverseImageSearch", description: "Adds ImageSearch to image context menus", + tags: ["Media", "Utility"], authors: [Devs.Ven, Devs.Nuckyz], - tags: ["ImageUtilities"], + searchTerms: ["ImageUtilities"], patches: [ { diff --git a/src/plugins/reviewDB/index.tsx b/src/plugins/reviewDB/index.tsx index 393237e0e..dca4e7217 100644 --- a/src/plugins/reviewDB/index.tsx +++ b/src/plugins/reviewDB/index.tsx @@ -69,6 +69,8 @@ const userContextPatch: NavContextMenuPatchCallback = (children, { user }: { use export default definePlugin({ name: "ReviewDB", description: "Review other users (Adds a new settings to profiles)", + dependencies: ["ProfileCollectionsAPI"], + tags: ["Friends", "Servers"], authors: [Devs.mantikafasi, Devs.Ven], isModified: true, diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx index 5972bb240..6ebbdf1c2 100644 --- a/src/plugins/roleColorEverywhere/index.tsx +++ b/src/plugins/roleColorEverywhere/index.tsx @@ -76,6 +76,7 @@ export default definePlugin({ name: "RoleColorEverywhere", authors: [Devs.KingFish, Devs.lewisakura, Devs.AutumnVN, Devs.Kyuuhachi, Devs.jamesbt365], description: "Adds the top role color anywhere possible", + tags: ["Roles", "Appearance"], settings, patches: [ diff --git a/src/plugins/secretRingTone/index.ts b/src/plugins/secretRingTone/index.ts index f2913afd1..4ebbe3b84 100644 --- a/src/plugins/secretRingTone/index.ts +++ b/src/plugins/secretRingTone/index.ts @@ -20,6 +20,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SecretRingToneEnabler", description: "Always play the secret version of the discord ringtone (except during special ringtone events)", + tags: ["Notifications", "Fun"], authors: [Devs.AndrewDLO, Devs.FieryFlames, Devs.RamziAH], settings, patches: [ diff --git a/src/plugins/seeSummaries/index.tsx b/src/plugins/seeSummaries/index.tsx index faa642fc7..29dd7d383 100644 --- a/src/plugins/seeSummaries/index.tsx +++ b/src/plugins/seeSummaries/index.tsx @@ -52,6 +52,7 @@ interface ChannelSummaries { export default definePlugin({ name: "Summaries", description: "Enables Discord's experimental Summaries feature on every server, displaying AI generated summaries of conversations", + tags: ["Chat", "Fun"], authors: [Devs.mantikafasi], settings, patches: [ diff --git a/src/plugins/sendTimestamps/index.tsx b/src/plugins/sendTimestamps/index.tsx index 65c1f11d7..930bf498e 100644 --- a/src/plugins/sendTimestamps/index.tsx +++ b/src/plugins/sendTimestamps/index.tsx @@ -170,6 +170,8 @@ const SendTimestampButton: ChatBarButtonFactory = ({ isAnyChat }) => { export default definePlugin({ name: "SendTimestamps", description: "Send timestamps easily via chat box button & text shortcuts. Read the extended description!", + dependencies: ["ChatInputButtonAPI", "MessagePopoverAPI"], + tags: ["Chat", "Commands"], authors: [Devs.Ven, Devs.Tyler, Devs.Grzesiek11], settings, diff --git a/src/plugins/serverInfo/index.tsx b/src/plugins/serverInfo/index.tsx index 22a58ed4d..e68342efa 100644 --- a/src/plugins/serverInfo/index.tsx +++ b/src/plugins/serverInfo/index.tsx @@ -50,9 +50,10 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ServerInfo", description: "Allows you to view info about a server", + tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Nuckyz, EquicordDevs.Z1xus], dependencies: ["DynamicImageModalAPI"], - tags: ["guild", "info", "ServerProfile"], + searchTerms: ["guild", "info", "ServerProfile"], isModified: true, contextMenus: { "guild-context": Patch, diff --git a/src/plugins/serverListIndicators/index.tsx b/src/plugins/serverListIndicators/index.tsx index ed71c1f0a..0d31102c9 100644 --- a/src/plugins/serverListIndicators/index.tsx +++ b/src/plugins/serverListIndicators/index.tsx @@ -141,6 +141,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "ServerListIndicators", description: "Add online friend count or server count in the server list", + tags: ["Servers", "Appearance"], authors: [Devs.dzshn, EquicordDevs.Panniku], dependencies: ["ServerListAPI"], settings, diff --git a/src/plugins/shikiCodeblocks.desktop/index.ts b/src/plugins/shikiCodeblocks.desktop/index.ts index ea333f655..d42065c0e 100644 --- a/src/plugins/shikiCodeblocks.desktop/index.ts +++ b/src/plugins/shikiCodeblocks.desktop/index.ts @@ -33,6 +33,7 @@ import { clearStyles } from "./utils/createStyle"; export default definePlugin({ name: "ShikiCodeblocks", description: "Brings vscode-style codeblocks into Discord, powered by Shiki", + tags: ["Appearance", "Chat", "Customisation"], authors: [Devs.Vap], reporterTestable: ReporterTestable.Patches, settings, diff --git a/src/plugins/showConnections/index.tsx b/src/plugins/showConnections/index.tsx index 1c5d3ec5d..4bbd62e08 100644 --- a/src/plugins/showConnections/index.tsx +++ b/src/plugins/showConnections/index.tsx @@ -161,6 +161,7 @@ function CompactConnectionComponent({ connection, theme }: { connection: Connect export default definePlugin({ name: "ShowConnections", description: "Show connected accounts in user popouts", + tags: ["Friends", "Appearance"], authors: [Devs.TheKodeToad], settings, diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index 85b9b3ddf..cad544520 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -82,6 +82,7 @@ function isUncategorized(objChannel: { channel: Channel; comparator: number; }) export default definePlugin({ name: "ShowHiddenChannels", description: "Show channels that you do not have access to view.", + tags: ["Servers", "Utility"], authors: [Devs.BigDuck, Devs.AverageReactEnjoyer, Devs.D3SOX, Devs.Ven, Devs.Nuckyz, Devs.Nickyux, Devs.dzshn, EquicordDevs.Oggetto], isModified: true, settings, diff --git a/src/plugins/showHiddenThings/index.ts b/src/plugins/showHiddenThings/index.ts index 9a329474d..5ef238327 100644 --- a/src/plugins/showHiddenThings/index.ts +++ b/src/plugins/showHiddenThings/index.ts @@ -37,8 +37,9 @@ const settings = definePluginSettings({ export default definePlugin({ name: "ShowHiddenThings", - tags: ["ShowTimeouts", "ShowInvitesPaused", "ShowModView", "DisableDiscoveryFilters"], + searchTerms: ["ShowTimeouts", "ShowInvitesPaused", "ShowModView", "DisableDiscoveryFilters"], description: "Displays various hidden & moderator-only things regardless of permissions.", + tags: ["Servers", "Utility"], authors: [Devs.Dolfies], settings, diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx index 7c8e24582..bda540684 100644 --- a/src/plugins/showMeYourName/index.tsx +++ b/src/plugins/showMeYourName/index.tsx @@ -1069,7 +1069,8 @@ export default definePlugin({ name: "ShowMeYourName", description: "Display any permutation of custom nicknames, friend nicknames, server nicknames, display names, and usernames in chat.", authors: [EquicordDevs.Etorix, Devs.Rini, Devs.TheKodeToad, Devs.sadan, Devs.prism], - tags: ["SMYN", "Nicknames", "Custom Nicknames",], + tags: ["Appearance", "Customisation"], + searchTerms: ["SMYN", "Nicknames", "Custom Nicknames"], isModified: true, settings, @@ -1138,7 +1139,7 @@ export default definePlugin({ // Attach the group ID to their messages to allow animating gradients within a group. find: "CUSTOM_GIFT?\"\":", replacement: { - match: /(isHovered:(\i).{0,1300}?\(\i,\i,\i\);)(let \i=\i.id===\i)/, + match: /(isHovered:(\i).{0,1300})(let \i=\i.id===\i,\i=)/, replace: "$1arguments[0].message.showMeYourNameGroupId=!!arguments[0].groupId?`g-${arguments[0].groupId}`:null;$self.handleHoveringMessage(arguments[0].message,$2);$3" }, }, diff --git a/src/plugins/showTimeoutDuration/index.tsx b/src/plugins/showTimeoutDuration/index.tsx index bcc5cd760..9960b4769 100644 --- a/src/plugins/showTimeoutDuration/index.tsx +++ b/src/plugins/showTimeoutDuration/index.tsx @@ -69,6 +69,7 @@ function renderTimeout(message: Message, inline: boolean) { export default definePlugin({ name: "ShowTimeoutDuration", description: "Shows how much longer a user's timeout will last, either in the timeout icon tooltip or next to it", + tags: ["Servers", "Utility"], authors: [Devs.Ven, Devs.Sqaaakoi], settings, diff --git a/src/plugins/silentMessageToggle/index.tsx b/src/plugins/silentMessageToggle/index.tsx index 61f543217..9e6eb724c 100644 --- a/src/plugins/silentMessageToggle/index.tsx +++ b/src/plugins/silentMessageToggle/index.tsx @@ -110,6 +110,8 @@ export default definePlugin({ name: "SilentMessageToggle", authors: [Devs.Nuckyz, Devs.CatNoir, EquicordDevs.Z1xus], description: "Adds a button to the chat bar to toggle sending a silent message.", + dependencies: ["ChatInputButtonAPI"], + tags: ["Chat", "Utility"], settings, chatBarButton: { diff --git a/src/plugins/silentTyping/index.tsx b/src/plugins/silentTyping/index.tsx index e84edcb85..31cbd60ec 100644 --- a/src/plugins/silentTyping/index.tsx +++ b/src/plugins/silentTyping/index.tsx @@ -296,7 +296,9 @@ function shouldHideMembersListTypingIndicators(): boolean { export default definePlugin({ name: "SilentTyping", authors: [Devs.Ven, Devs.Rini, Devs.ImBanana, EquicordDevs.Etorix], - description: "Hide your typing indicator from chat.", + description: "Hide that you are typing", + dependencies: ["CommandsAPI", "ChatInputButtonAPI"], + tags: ["Chat", "Privacy"], isModified: true, settings, diff --git a/src/plugins/sortFriendRequests/index.tsx b/src/plugins/sortFriendRequests/index.tsx index 27efd88c6..b10e0817e 100644 --- a/src/plugins/sortFriendRequests/index.tsx +++ b/src/plugins/sortFriendRequests/index.tsx @@ -56,6 +56,7 @@ export default definePlugin({ name: "SortFriends", authors: [Devs.Megu, EquicordDevs.CallMeGii], description: "Sorts friend requests by date of receipt", + tags: ["Friends", "Organisation"], isModified: true, settings, diff --git a/src/plugins/spotifyCrack/index.ts b/src/plugins/spotifyCrack/index.ts index 505e53a12..d15d1fd86 100644 --- a/src/plugins/spotifyCrack/index.ts +++ b/src/plugins/spotifyCrack/index.ts @@ -38,6 +38,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "SpotifyCrack", description: "Free listen along, no auto-pausing in voice chat, and allows activity to continue playing when idling", + tags: ["Media", "Utility"], authors: [Devs.Cyn, Devs.Nuckyz], settings, diff --git a/src/plugins/spotifyShareCommands/index.ts b/src/plugins/spotifyShareCommands/index.ts index b4a85eb16..b0d5e0fd2 100644 --- a/src/plugins/spotifyShareCommands/index.ts +++ b/src/plugins/spotifyShareCommands/index.ts @@ -98,6 +98,8 @@ function makeCommand(name: string, formatUrl: (track: Track) => string): Command export default definePlugin({ name: "SpotifyShareCommands", description: "Share your current Spotify track, album or artist via slash command (/track, /album, /artist)", + dependencies: ["CommandsAPI"], + tags: ["Media", "Commands"], authors: [Devs.katlyn], commands: [ makeCommand("track", track => `https://open.spotify.com/track/${track.id}`), diff --git a/src/plugins/startupTimings/index.tsx b/src/plugins/startupTimings/index.tsx index 4a8c06807..d61d004eb 100644 --- a/src/plugins/startupTimings/index.tsx +++ b/src/plugins/startupTimings/index.tsx @@ -27,6 +27,7 @@ import StartupTimingPage from "./StartupTimingPage"; export default definePlugin({ name: "StartupTimings", description: "Adds Startup Timings to the Settings menu", + tags: ["Developers"], authors: [Devs.Megu], start() { SettingsPlugin.customEntries.push({ diff --git a/src/plugins/stickerPaste/index.ts b/src/plugins/stickerPaste/index.ts index 8a0082073..0dd0bd2b3 100644 --- a/src/plugins/stickerPaste/index.ts +++ b/src/plugins/stickerPaste/index.ts @@ -10,6 +10,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "StickerPaste", description: "Makes picking a sticker in the sticker picker insert it into the chatbox instead of instantly sending", + tags: ["Emotes", "Chat"], authors: [Devs.ImBanana], patches: [ diff --git a/src/plugins/streamerModeOnStream/index.ts b/src/plugins/streamerModeOnStream/index.ts index 26b4a279c..49609ac61 100644 --- a/src/plugins/streamerModeOnStream/index.ts +++ b/src/plugins/streamerModeOnStream/index.ts @@ -37,6 +37,7 @@ function toggleStreamerMode({ streamKey }: StreamEvent, value: boolean) { export default definePlugin({ name: "StreamerModeOn", description: "Automatically enables streamer mode when you start streaming in Discord", + tags: ["Privacy", "Utility"], authors: [Devs.IcedMarina], flux: { STREAM_CREATE: d => toggleStreamerMode(d, true), diff --git a/src/plugins/superReactionTweaks/index.ts b/src/plugins/superReactionTweaks/index.ts index 0ca873efa..7c0d9a2c0 100644 --- a/src/plugins/superReactionTweaks/index.ts +++ b/src/plugins/superReactionTweaks/index.ts @@ -37,6 +37,7 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "SuperReactionTweaks", description: "Customize the limit of Super Reactions playing at once, and super react by default", + tags: ["Reactions", "Emotes"], authors: [Devs.FieryFlames, Devs.ant0n], patches: [ { diff --git a/src/plugins/textReplace/index.tsx b/src/plugins/textReplace/index.tsx index 289f4ee4f..3374bd8fb 100644 --- a/src/plugins/textReplace/index.tsx +++ b/src/plugins/textReplace/index.tsx @@ -303,9 +303,10 @@ const TEXT_REPLACE_RULES_EXEMPT_CHANNEL_IDS = [ export default definePlugin({ name: "TextReplace", - description: "Replace text in your or others' messages. You can find pre-made rules in the #textreplace-rules channel in Vencord's Server.", + description: "Replace text in your messages. You can find pre-made rules in the #textreplace-rules channel in Vencord's Server", + dependencies: ["MessagePopoverAPI"], + tags: ["Chat", "Customisation", "Utility"], authors: [Devs.AutumnVN, Devs.TheKodeToad, EquicordDevs.Etorix], - isModified: true, settings, modifyIncomingMessage, diff --git a/src/plugins/themeAttributes/index.ts b/src/plugins/themeAttributes/index.ts index e71dec0ad..aee5e5018 100644 --- a/src/plugins/themeAttributes/index.ts +++ b/src/plugins/themeAttributes/index.ts @@ -13,6 +13,7 @@ import { UserStore } from "@webpack/common"; export default definePlugin({ name: "ThemeAttributes", description: "Adds data attributes to various elements for theming purposes", + tags: ["Appearance", "Customisation"], authors: [Devs.Ven, Devs.Board], patches: [ diff --git a/src/plugins/translate/index.tsx b/src/plugins/translate/index.tsx index d5d36c121..caeb5ac62 100644 --- a/src/plugins/translate/index.tsx +++ b/src/plugins/translate/index.tsx @@ -63,6 +63,8 @@ let tooltipTimeout: any; export default definePlugin({ name: "Translate", description: "Translate messages with Google Translate or DeepL", + dependencies: ["ChatInputButtonAPI", "MessageAccessoriesAPI", "MessagePopoverAPI"], + tags: ["Chat", "Utility"], authors: [Devs.Ven, Devs.AshtonMemer], settings, contextMenus: { diff --git a/src/plugins/typingIndicator/index.tsx b/src/plugins/typingIndicator/index.tsx index ecfb841ee..2f78df0c3 100644 --- a/src/plugins/typingIndicator/index.tsx +++ b/src/plugins/typingIndicator/index.tsx @@ -166,6 +166,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "TypingIndicator", description: "Adds an indicator if someone is typing on a channel.", + tags: ["Notifications", "Appearance", "Servers"], authors: [Devs.Nuckyz, Devs.fawn, Devs.Sqaaakoi], isModified: true, settings, diff --git a/src/plugins/typingTweaks/index.tsx b/src/plugins/typingTweaks/index.tsx index 1b72581d3..4832478bf 100644 --- a/src/plugins/typingTweaks/index.tsx +++ b/src/plugins/typingTweaks/index.tsx @@ -114,6 +114,7 @@ migratePluginToSettings(true, "TypingTweaks", "AmITyping", "amITyping"); export default definePlugin({ name: "TypingTweaks", description: "Show avatars and role colours in the typing indicator", + tags: ["Appearance", "Customisation"], authors: [Devs.zt, Devs.sadan, EquicordDevs.MrDiamond], settings, isModified: true, diff --git a/src/plugins/unindent/index.ts b/src/plugins/unindent/index.ts index 1a548a68e..9ebbf8deb 100644 --- a/src/plugins/unindent/index.ts +++ b/src/plugins/unindent/index.ts @@ -23,6 +23,8 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "Unindent", description: "Trims leading indentation from codeblocks", + dependencies: ["MessageEventsAPI"], + tags: ["Chat", "Utility"], authors: [Devs.Ven], patches: [ diff --git a/src/plugins/unlockedAvatarZoom/index.ts b/src/plugins/unlockedAvatarZoom/index.ts index dc8de74db..fbab2b734 100644 --- a/src/plugins/unlockedAvatarZoom/index.ts +++ b/src/plugins/unlockedAvatarZoom/index.ts @@ -20,6 +20,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UnlockedAvatarZoom", description: "Allows you to zoom in further in the image crop tool when changing your avatar", + tags: ["Media", "Utility"], authors: [Devs.nakoyasha], settings, patches: [ diff --git a/src/plugins/unsuppressEmbeds/index.tsx b/src/plugins/unsuppressEmbeds/index.tsx index 9f4baeee3..6ad1a6850 100644 --- a/src/plugins/unsuppressEmbeds/index.tsx +++ b/src/plugins/unsuppressEmbeds/index.tsx @@ -62,6 +62,7 @@ export default definePlugin({ name: "UnsuppressEmbeds", authors: [Devs.rad, Devs.HypedDomi], description: "Allows you to unsuppress embeds in messages", + tags: ["Chat", "Utility"], contextMenus: { "message": messageContextMenuPatch } diff --git a/src/plugins/userMessagesPronouns/index.ts b/src/plugins/userMessagesPronouns/index.ts index 56721e11f..1088e2f20 100644 --- a/src/plugins/userMessagesPronouns/index.ts +++ b/src/plugins/userMessagesPronouns/index.ts @@ -28,6 +28,7 @@ export default definePlugin({ name: "UserMessagesPronouns", authors: [Devs.Tyman, Devs.TheKodeToad, Devs.Ven, Devs.Elvyra], description: "Adds pronouns to chat user messages", + tags: ["Chat", "Appearance"], settings, patches: [ diff --git a/src/plugins/userVoiceShow/index.tsx b/src/plugins/userVoiceShow/index.tsx index ec97530e5..fb6f0c8df 100644 --- a/src/plugins/userVoiceShow/index.tsx +++ b/src/plugins/userVoiceShow/index.tsx @@ -48,6 +48,8 @@ const settings = definePluginSettings({ export default definePlugin({ name: "UserVoiceShow", description: "Shows an indicator when a user is in a Voice Channel", + tags: ["Voice", "Appearance", "Friends"], + dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI", "NicknameIconsAPI"], authors: [Devs.Nuckyz, Devs.LordElias, EquicordDevs.omaw], settings, renderNicknameIcon({ userId }) { diff --git a/src/plugins/usrbg/index.tsx b/src/plugins/usrbg/index.tsx index b77efb8f7..8d1c40d72 100644 --- a/src/plugins/usrbg/index.tsx +++ b/src/plugins/usrbg/index.tsx @@ -54,6 +54,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "USRBG", description: "Displays user banners from USRBG, allowing anyone to get a banner without Nitro", + tags: ["Appearance", "Customisation"], authors: [Devs.AutumnVN, Devs.katlyn, Devs.pylix, Devs.TheKodeToad], settings, patches: [ diff --git a/src/plugins/validReply/index.ts b/src/plugins/validReply/index.ts index 2ca072040..988d67cf4 100644 --- a/src/plugins/validReply/index.ts +++ b/src/plugins/validReply/index.ts @@ -33,6 +33,7 @@ const createMessageRecord = findByCodeLazy(".createFromServer(", ".isBlockedForM export default definePlugin({ name: "ValidReply", description: 'Fixes "Message could not be loaded" upon hovering over the reply', + tags: ["Chat", "Utility"], authors: [Devs.newwares], patches: [ { diff --git a/src/plugins/validUser/index.tsx b/src/plugins/validUser/index.tsx index 2ff829a12..3fa17ef6f 100644 --- a/src/plugins/validUser/index.tsx +++ b/src/plugins/validUser/index.tsx @@ -177,8 +177,9 @@ function MentionWrapper({ data, UserMention, RoleMention, parse, props }: Mentio export default definePlugin({ name: "ValidUser", description: "Fix mentions for unknown users showing up as '@unknown-user' (hover over a mention to fix it)", + tags: ["Chat", "Utility"], authors: [Devs.Ven, Devs.Dolfies], - tags: ["MentionCacheFix"], + searchTerms: ["MentionCacheFix"], patches: [ { diff --git a/src/plugins/vcDoubleClick/index.ts b/src/plugins/vcDoubleClick/index.ts index d9310f51f..4eea12da4 100644 --- a/src/plugins/vcDoubleClick/index.ts +++ b/src/plugins/vcDoubleClick/index.ts @@ -28,6 +28,7 @@ const timers = {} as Record{$self.openAvatar($1)},", + match: /(?<=avatarProps:(\i),eventHandlers:(\i).{0,50}?)return null==/, + replace: 'Object.assign($2,{style:{cursor:"pointer"},onClick:()=>$self.openAvatar($1.src)});$&', } }, // Banners diff --git a/src/plugins/viewRaw/index.tsx b/src/plugins/viewRaw/index.tsx index aad99622c..212ea4e49 100644 --- a/src/plugins/viewRaw/index.tsx +++ b/src/plugins/viewRaw/index.tsx @@ -176,6 +176,8 @@ const devContextCallback: NavContextMenuPatchCallback = (children, { id }: { id: export default definePlugin({ name: "ViewRaw", description: "Copy and view the raw content/data of any message, channel or guild", + dependencies: ["MessagePopoverAPI"], + tags: ["Chat", "Developers"], authors: [Devs.KingFish, Devs.Ven, Devs.rad, Devs.ImLvna], settings, diff --git a/src/plugins/voiceDownload/index.tsx b/src/plugins/voiceDownload/index.tsx index eac912e47..8dbc9b705 100644 --- a/src/plugins/voiceDownload/index.tsx +++ b/src/plugins/voiceDownload/index.tsx @@ -12,6 +12,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "VoiceDownload", description: "Adds a download to voice messages. (Opens a new browser tab)", + tags: ["Voice", "Media"], authors: [Devs.puv], patches: [ { diff --git a/src/plugins/voiceMessages/index.tsx b/src/plugins/voiceMessages/index.tsx index acad7fa6f..5214cf62a 100644 --- a/src/plugins/voiceMessages/index.tsx +++ b/src/plugins/voiceMessages/index.tsx @@ -26,7 +26,7 @@ import { Microphone } from "@components/Icons"; import { Link } from "@components/Link"; import { Paragraph } from "@components/Paragraph"; import { lastState as silentMessageEnabled } from "@plugins/silentMessageToggle"; -import { Devs, EquicordDevs } from "@utils/constants"; +import { Devs } from "@utils/constants"; import { classNameFactory } from "@utils/css"; import { Margins } from "@utils/margins"; import { ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, openModal } from "@utils/modal"; @@ -271,10 +271,10 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "VoiceMessages", - description: "Allows you to send voice messages like on mobile. To do so, right click the upload button and click Send Voice Message.", - authors: [Devs.Ven, Devs.Vap, Devs.Nickyux, EquicordDevs.Z1xus, Devs.prism], + description: "Allows you to send voice messages like on mobile. To do so, right click the upload button and click Send Voice Message", + tags: ["Voice"], + authors: [Devs.Ven, Devs.Vap, Devs.Nickyux], settings, - contextMenus: { "channel-attach": ctxMenuPatch } diff --git a/src/plugins/volumeBooster/index.ts b/src/plugins/volumeBooster/index.ts index 4ab0c332a..e379686ad 100644 --- a/src/plugins/volumeBooster/index.ts +++ b/src/plugins/volumeBooster/index.ts @@ -51,6 +51,7 @@ export default definePlugin({ name: "VolumeBooster", authors: [Devs.Nuckyz, Devs.sadan], description: "Allows you to set the user and stream volume above the default maximum", + tags: ["Voice", "Utility"], settings, patches: [ diff --git a/src/plugins/webContextMenus.web/index.ts b/src/plugins/webContextMenus.web/index.ts index 2076404ab..dd86c9652 100644 --- a/src/plugins/webContextMenus.web/index.ts +++ b/src/plugins/webContextMenus.web/index.ts @@ -88,6 +88,7 @@ function fixImageUrl(urlString: string) { export default definePlugin({ name: "WebContextMenus", description: "Re-adds context menus missing in the web version of Discord: Links & Images (Copy/Open Link/Image), Text Area (Copy, Cut, Paste, SpellCheck)", + tags: ["Utility"], authors: [Devs.Ven], enabledByDefault: true, required: requiredByPlatform, diff --git a/src/plugins/webKeybinds.web/index.ts b/src/plugins/webKeybinds.web/index.ts index b9b49c35c..f8563dc88 100644 --- a/src/plugins/webKeybinds.web/index.ts +++ b/src/plugins/webKeybinds.web/index.ts @@ -26,6 +26,7 @@ const KeyBinds = findByPropsLazy("JUMP_TO_GUILD", "SERVER_NEXT"); export default definePlugin({ name: "WebKeybinds", description: "Re-adds keybinds missing in the web version of Discord: ctrl+t, ctrl+shift+t, ctrl+tab, ctrl+shift+tab, ctrl+1-9, ctrl+,. Only works fully on Vesktop/Legcord, not inside your browser", + tags: ["Shortcuts"], authors: [Devs.Ven], enabledByDefault: true, diff --git a/src/plugins/webScreenShareFixes.web/index.ts b/src/plugins/webScreenShareFixes.web/index.ts index e7fbc178e..ac06a00e2 100644 --- a/src/plugins/webScreenShareFixes.web/index.ts +++ b/src/plugins/webScreenShareFixes.web/index.ts @@ -11,6 +11,7 @@ export default definePlugin({ name: "WebScreenShareFixes", authors: [Devs.Kaitlyn], description: "Removes 2500kbps bitrate cap on chromium and vesktop clients.", + tags: ["Voice"], enabledByDefault: true, patches: [ diff --git a/src/plugins/whoReacted/index.tsx b/src/plugins/whoReacted/index.tsx index cb2d6f977..79b03baf3 100644 --- a/src/plugins/whoReacted/index.tsx +++ b/src/plugins/whoReacted/index.tsx @@ -88,6 +88,7 @@ const settings = definePluginSettings({ export default definePlugin({ name: "WhoReacted", description: "Renders the avatars of users who reacted to a message", + tags: ["Reactions", "Chat", "Appearance"], authors: [Devs.Ven, Devs.KannaDev, Devs.newwares], isModified: true, settings, diff --git a/src/plugins/xsOverlay/index.tsx b/src/plugins/xsOverlay/index.tsx index ff07da6e7..52d2bc912 100644 --- a/src/plugins/xsOverlay/index.tsx +++ b/src/plugins/xsOverlay/index.tsx @@ -188,8 +188,9 @@ const Native = VencordNative.pluginHelpers.XSOverlay as PluginNative string = RegExp.escape ?? function (s: string) { return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }; diff --git a/src/utils/types.ts b/src/utils/types.ts index ac078d5e5..c33114a5c 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -46,6 +46,32 @@ export function makeRange(start: number, end: number, step = 1) { return ranges; } +export const PluginTags = [ + "Accessibility", + "Activity", + "Appearance", + "Chat", + "Commands", + "Console", + "Customisation", + "Developers", + "Emotes", + "Friends", + "Fun", + "Media", + "Notifications", + "Organisation", + "Privacy", + "Reactions", + "Roles", + "Servers", + "Shortcuts", + "Utility", + "Voice" +] as const; + +export type PluginTag = typeof PluginTags[number]; + export type ReplaceFn = (match: string, ...groups: string[]) => string; export interface PatchReplacement { @@ -105,6 +131,9 @@ export type IconProps = { height?: number | string; width?: number | string; cla export interface PluginDef { name: string; description: string; + /** Additional search terms that will bring up your plugin */ + searchTerms?: string[]; + tags?: PluginTag[]; authors: PluginAuthor[]; start?(): void; stop?(): void; @@ -182,8 +211,6 @@ export interface PluginDef { */ toolboxActions?: Record void> | (() => ReactNode); - tags?: string[]; - /** * Managed style to automatically enable and disable when the plugin is enabled or disabled */ diff --git a/src/webpack/common/components.ts b/src/webpack/common/components.ts index a5723c001..98d453abf 100644 --- a/src/webpack/common/components.ts +++ b/src/webpack/common/components.ts @@ -59,7 +59,7 @@ export const TooltipContainer = TooltipContainerComponent as never; export const TextInput = waitForComponent("TextInput", filters.componentByCode("#{intl::MAXIMUM_LENGTH_ERROR}", '"input"')); export const TextArea = waitForComponent("TextArea", filters.componentByCode("this.getPaddingRight()},id:")); export const Select = waitForComponent("Select", filters.componentByCode('selectionMode:"single",onSelectionChange:', "isSelected:")); -export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('?"multiple":"single"')); +export const SearchableSelect = waitForComponent("SearchableSelect", filters.componentByCode('?"multiple":"single",required:')); export const Slider = waitForComponent("Slider", filters.componentByCode("markDash", "this.renderMark(")); export const Popout = waitForComponent("Popout", filters.componentByCode("ref:this.ref,", "renderPopout:this.renderPopout,")); export const Dialog = waitForComponent("Dialog", filters.componentByCode('role:"dialog",tabIndex:-1')); diff --git a/src/webpack/patchWebpack.ts b/src/webpack/patchWebpack.ts index fb31cbc23..2b1994f20 100644 --- a/src/webpack/patchWebpack.ts +++ b/src/webpack/patchWebpack.ts @@ -5,14 +5,14 @@ */ import { Settings } from "@api/Settings"; +import { reporterData } from "@debug/reporterData"; +import { traceFunctionWithResults } from "@debug/Tracer"; import { makeLazy } from "@utils/lazy"; import { Logger } from "@utils/Logger"; import { interpolateIfDefined } from "@utils/misc"; import { Patch, PatchReplacement } from "@utils/types"; import { WebpackRequire } from "@vencord/discord-types/webpack"; -import { reporterData } from "debug/reporterData"; -import { traceFunctionWithResults } from "../debug/Tracer"; import { AnyModuleFactory, AnyWebpackRequire, MaybePatchedModuleFactory, PatchedModuleFactory } from "./types"; import { _blacklistBadModules, _initWebpack, factoryListeners, findModuleFactory, moduleListeners, waitForSubscriptions, wreq } from "./webpack"; diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index 5917d9073..4060bd45b 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import { traceFunction } from "@debug/Tracer"; import { makeLazy, proxyLazy } from "@utils/lazy"; import { LazyComponent } from "@utils/lazyReact"; import { Logger } from "@utils/Logger"; @@ -24,7 +25,6 @@ import { escapeRegExp } from "@utils/text"; import type { FluxStore } from "@vencord/discord-types"; import type { ModuleExports, ModuleFactory, WebpackRequire } from "@vencord/discord-types/webpack"; -import { traceFunction } from "../debug/Tracer"; import type { AnyModuleFactory, AnyWebpackRequire } from "./types"; const logger = new Logger("Webpack"); From 8940b83b0f046f9a36336e2ea09015ec7ac06400 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:51:14 -0400 Subject: [PATCH 051/247] fix missing modified --- src/plugins/textReplace/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/textReplace/index.tsx b/src/plugins/textReplace/index.tsx index 3374bd8fb..68938e8dc 100644 --- a/src/plugins/textReplace/index.tsx +++ b/src/plugins/textReplace/index.tsx @@ -307,7 +307,7 @@ export default definePlugin({ dependencies: ["MessagePopoverAPI"], tags: ["Chat", "Customisation", "Utility"], authors: [Devs.AutumnVN, Devs.TheKodeToad, EquicordDevs.Etorix], - + isModified: true, settings, modifyIncomingMessage, From ffdf02d904fe4dd11a38fc49e18dd1ca2a103623 Mon Sep 17 00:00:00 2001 From: Elliott Tallis Date: Thu, 16 Apr 2026 18:52:30 +0100 Subject: [PATCH 052/247] Fix confetti blocking quest buttons (#977) --- src/equicordplugins/questify/styles.css | 7 ++++++- src/utils/constants.ts | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/equicordplugins/questify/styles.css b/src/equicordplugins/questify/styles.css index 38912c83b..c3ebcc613 100644 --- a/src/equicordplugins/questify/styles.css +++ b/src/equicordplugins/questify/styles.css @@ -362,4 +362,9 @@ .questify-quest-item-restyle > :nth-child(2) [class*="container"] { border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; -} \ No newline at end of file +} + +/* Prevent completion confetti from covering quest buttons */ +div[id^="quest-tile-"] div[class^="confetti__"] { + pointer-events: none; +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 96f90bd78..ca02efbd7 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1288,6 +1288,10 @@ export const EquicordDevs = Object.freeze({ name: "Kiri", id: 310525496771346434n, }, + pointy: { + name: "pointy", + id: 99914384989519872n + }, } satisfies Record); // iife so #__PURE__ works correctly From 0420214ccf7726fc997b665915fc3f9feee892f6 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:54:36 -0400 Subject: [PATCH 053/247] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd9f7f0cc..3c506786f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "equicord", "private": "true", - "version": "1.14.7.0", + "version": "1.14.7.1", "description": "The other cutest Discord client mod", "homepage": "https://github.com/Equicord/Equicord#readme", "bugs": { From ef80e2a91021e311bded37e8b63f178e433f25af Mon Sep 17 00:00:00 2001 From: Vendicated Date: Thu, 16 Apr 2026 22:40:39 +0200 Subject: [PATCH 054/247] MessageLogger: fix 'Remove Message History' not working --- src/plugins/messageLogger/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/messageLogger/index.tsx b/src/plugins/messageLogger/index.tsx index 5988fa201..ca4849bd9 100644 --- a/src/plugins/messageLogger/index.tsx +++ b/src/plugins/messageLogger/index.tsx @@ -93,7 +93,7 @@ const patchMessageContextMenu: NavContextMenuPatchCallback = (children, props) = mlDeleted: true }); } else { - message.editHistory = []; + updateMessage(channel_id, id, { editHistory: [] }); } }} /> From 1c373f72818fc46f4b82cac358d9cb139a49e03b Mon Sep 17 00:00:00 2001 From: Vendicated Date: Thu, 16 Apr 2026 22:48:12 +0200 Subject: [PATCH 055/247] fix AccountPanelServerProfile --- src/plugins/accountPanelServerProfile/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/accountPanelServerProfile/index.tsx b/src/plugins/accountPanelServerProfile/index.tsx index 311988dea..4ba38b63b 100644 --- a/src/plugins/accountPanelServerProfile/index.tsx +++ b/src/plugins/accountPanelServerProfile/index.tsx @@ -72,7 +72,7 @@ export default definePlugin({ group: true, replacement: [ { - match: /(\.AVATAR,children:.+?renderPopout:(\i)=>){(.+?)}(?=,position)(?<=currentUser:(\i).+?)/, + match: /(\.AVATAR,children:.+?renderPopout:\((\i),\i\)=>)\{(.+?)\}(?=,position)(?<=currentUser:(\i).+?)/, replace: (_, rest, popoutProps, originalPopout, currentUser) => `${rest}$self.UserProfile({popoutProps:${popoutProps},currentUser:${currentUser},originalRenderPopout:()=>{${originalPopout}}})` }, { From afe435e847792e98abecbae5121bb23918fca6d3 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Thu, 16 Apr 2026 23:00:34 +0200 Subject: [PATCH 056/247] fix visual issues with Vencord Settings modals --- src/components/settings/tabs/BaseTab.tsx | 13 +++++++++---- src/components/settings/tabs/styles.css | 8 ++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/components/settings/tabs/BaseTab.tsx b/src/components/settings/tabs/BaseTab.tsx index b4c0ebb53..17a2e8025 100644 --- a/src/components/settings/tabs/BaseTab.tsx +++ b/src/components/settings/tabs/BaseTab.tsx @@ -16,9 +16,10 @@ * along with this program. If not, see . */ +import { BaseText } from "@components/BaseText"; import ErrorBoundary from "@components/ErrorBoundary"; import { handleComponentFailed } from "@components/handleComponentFailed"; -import { ModalCloseButton, ModalContent, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; +import { ModalCloseButton, ModalContent, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; import { onlyOnce } from "@utils/onlyOnce"; import type { ComponentType, PropsWithChildren } from "react"; @@ -43,13 +44,17 @@ export function wrapTab(component: ComponentType, tab: string) { export function openSettingsTabModal(Tab: ComponentType) { try { openModal(wrapTab((modalProps: ModalProps) => ( - + + + {Tab.displayName?.replace("SettingsTab", "") || "Settings"} + + + - - ), Tab.displayName || "Settings Tab")); + ), Tab.displayName || "SettingsTab")); } catch { handleSettingsTabError(); } diff --git a/src/components/settings/tabs/styles.css b/src/components/settings/tabs/styles.css index a0152abca..fd4aa8f46 100644 --- a/src/components/settings/tabs/styles.css +++ b/src/components/settings/tabs/styles.css @@ -61,10 +61,10 @@ height: 1.25em; } -.vc-settings-modal { - padding: 1.5em !important; +.vc-settings-modal-root { + background: var(--background-base-low); } -.vc-settings-modal-close { - float: right; +.vc-settings-modal { + padding-bottom: 1em; } \ No newline at end of file From b7b05e39390b06d3849d6ad949131904c88b2b02 Mon Sep 17 00:00:00 2001 From: nin0 Date: Thu, 16 Apr 2026 20:49:04 -0400 Subject: [PATCH 057/247] update my own dev ID (#979) --- src/utils/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index ca02efbd7..b289eb7b2 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -880,8 +880,8 @@ export const EquicordDevs = Object.freeze({ id: 1271128098301022240n }, nin0dev: { - name: "nin0dev", - id: 886685857560539176n + name: "nin0", + id: 1395533040914141235n }, D3SOX: { name: "D3SOX", From 48f887ea98ebf7352890e7710f07cab8bf83fa9b Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:26:41 -0400 Subject: [PATCH 058/247] EquicordHelper: JSON Gateway --- src/equicordplugins/equicordHelper/index.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx index a73639e7f..40d81730d 100644 --- a/src/equicordplugins/equicordHelper/index.tsx +++ b/src/equicordplugins/equicordHelper/index.tsx @@ -128,6 +128,12 @@ const settings = definePluginSettings({ default: true, restartNeeded: true }, + jsonGateway: { + type: OptionType.BOOLEAN, + description: "Forces JSON on gateway reconnect", + default: true, + restartNeeded: true + } }); export default definePlugin({ @@ -274,6 +280,14 @@ export default definePlugin({ replace: "return null;$&" }, predicate: () => settings.store.disableAdoptTagPrompt + }, + { + find: "JSONEncoding", + replacement: { + match: /void 0!==\i\?\i:/, + replace: "" + }, + predicate: () => settings.store.jsonGateway } ], renderMessageAccessory(props) { From 5117481a73b56b472a0a96afcb15ad0f8b7e9dfb Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:32:53 -0400 Subject: [PATCH 059/247] EquicordHelper: Fix JSON default: true --- src/equicordplugins/equicordHelper/index.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx index 40d81730d..e5a5f5220 100644 --- a/src/equicordplugins/equicordHelper/index.tsx +++ b/src/equicordplugins/equicordHelper/index.tsx @@ -125,14 +125,14 @@ const settings = definePluginSettings({ disableAdoptTagPrompt: { type: OptionType.BOOLEAN, description: "Disable the prompt to adopt tags", - default: true, - restartNeeded: true + restartNeeded: true, + default: false, }, jsonGateway: { type: OptionType.BOOLEAN, description: "Forces JSON on gateway reconnect", - default: true, - restartNeeded: true + restartNeeded: true, + default: false, } }); From 39044cd8e9ae4738164fe4914d5ba8b8c33f5ca7 Mon Sep 17 00:00:00 2001 From: ave <68245869+knownasivy@users.noreply.github.com> Date: Fri, 17 Apr 2026 18:26:23 -0400 Subject: [PATCH 060/247] MessageLogger: fix collapsed delete text (#4073) --- src/plugins/messageLogger/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/messageLogger/index.tsx b/src/plugins/messageLogger/index.tsx index ca4849bd9..0d364132e 100644 --- a/src/plugins/messageLogger/index.tsx +++ b/src/plugins/messageLogger/index.tsx @@ -533,8 +533,8 @@ export default definePlugin({ replace: '$&$1.type==="MESSAGE_GROUP_DELETED"||', }, { - match: /(\i).type===\i\.\i\.MESSAGE_GROUP_BLOCKED\?.*?:/, - replace: '$&$1.type==="MESSAGE_GROUP_DELETED"?$self.DELETED_MESSAGE_COUNT:', + match: /(\i).type===\i\.\i\.MESSAGE_GROUP_BLOCKED\?(\i)=.*?:/, + replace: '$&$1.type==="MESSAGE_GROUP_DELETED"?$2=$self.DELETED_MESSAGE_COUNT:', }, ], predicate: () => Settings.plugins.MessageLogger.collapseDeleted From 932457a217049677b58e2e6c3732a4041bf3bed1 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Fri, 17 Apr 2026 18:27:29 -0400 Subject: [PATCH 061/247] WindowsTitleBar: Fix Not Disabling Discords TitleBar --- .../settings/tabs/vencord/index.tsx | 16 +++++++++++-- src/equicordplugins/equicordHelper/index.tsx | 24 ++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/components/settings/tabs/vencord/index.tsx b/src/components/settings/tabs/vencord/index.tsx index c2f0aacea..a88d7ca54 100644 --- a/src/components/settings/tabs/vencord/index.tsx +++ b/src/components/settings/tabs/vencord/index.tsx @@ -27,7 +27,7 @@ import { classNameFactory } from "@utils/css"; import { Margins } from "@utils/margins"; import { identity, isAnyPluginDev } from "@utils/misc"; import { relaunch } from "@utils/native"; -import { GuildMemberStore, React, Select, UserStore } from "@webpack/common"; +import { Alerts, GuildMemberStore, React, Select, UserStore } from "@webpack/common"; import { DonateButtonComponent } from "./DonateButton"; import { openNotificationSettingsModal } from "./NotificationSettings"; @@ -249,7 +249,19 @@ function EquicordSettings() { (settings[s.key] = v)} + onChange={v => { + settings[s.key] = v; + + if (s.restartRequired) { + Alerts.show({ + title: "Restart Required", + body: "A restart is required to apply this change", + confirmText: "Restart now", + cancelText: "Later!", + onConfirm: relaunch + }); + } + }} title={s.title} description={ s.warning.enabled ? ( diff --git a/src/equicordplugins/equicordHelper/index.tsx b/src/equicordplugins/equicordHelper/index.tsx index e5a5f5220..81ffe1e1c 100644 --- a/src/equicordplugins/equicordHelper/index.tsx +++ b/src/equicordplugins/equicordHelper/index.tsx @@ -8,7 +8,7 @@ import { ApplicationCommandInputType, sendBotMessage } from "@api/Commands"; import { HeaderBarButton } from "@api/HeaderBar"; import { addMessagePreSendListener, removeMessagePreSendListener } from "@api/MessageEvents"; import { isPluginEnabled } from "@api/PluginManager"; -import { definePluginSettings, migratePluginToSettings } from "@api/Settings"; +import { definePluginSettings, migratePluginToSettings, Settings } from "@api/Settings"; import customRPC from "@plugins/customRPC"; import { Devs, EquicordDevs, GUILD_ID, SUPPORT_CHANNEL_ID, SUPPORT_CHANNEL_IDS, VC_SUPPORT_CHANNEL_IDS } from "@utils/constants"; import { isAnyPluginDev } from "@utils/misc"; @@ -288,6 +288,28 @@ export default definePlugin({ replace: "" }, predicate: () => settings.store.jsonGateway + }, + { + find: ".USE_OSX_NATIVE_TRAFFIC_LIGHTS", + predicate: () => Settings.winNativeTitleBar, + replacement: { + match: /case \i\.\i\.WINDOWS:/, + replace: 'case "WEB":' + }, + }, + { + find: '"refresh-title-bar-small"', + predicate: () => Settings.winNativeTitleBar, + replacement: [ + { + match: /\i===\i\.PlatformTypes\.WINDOWS/g, + replace: "false" + }, + { + match: /\i===\i\.PlatformTypes\.WEB/g, + replace: "true" + } + ] } ], renderMessageAccessory(props) { From 51b4748ba7489201f3efb378b6e6e2734f97e080 Mon Sep 17 00:00:00 2001 From: BoatFloater <111416210+BoatFloater@users.noreply.github.com> Date: Sat, 18 Apr 2026 07:39:47 +0900 Subject: [PATCH 062/247] ViewRaw: add message context menu option (#3990) --- src/plugins/viewRaw/index.tsx | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/plugins/viewRaw/index.tsx b/src/plugins/viewRaw/index.tsx index bfcb9ba40..269eb36ee 100644 --- a/src/plugins/viewRaw/index.tsx +++ b/src/plugins/viewRaw/index.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; import { definePluginSettings } from "@api/Settings"; import { CodeBlock } from "@components/CodeBlock"; import { Divider } from "@components/Divider"; @@ -124,31 +124,36 @@ const settings = definePluginSettings({ { label: "Left Click to view the raw content.", value: "Left", default: true }, { label: "Right click to view the raw content.", value: "Right" } ] + }, + messageContextMenu: { + description: "Show in message context menu", + type: OptionType.BOOLEAN, + default: false } }); -function MakeContextCallback(name: "Guild" | "Role" | "User" | "Channel"): NavContextMenuPatchCallback { +function MakeContextCallback(name: "Guild" | "Role" | "User" | "Channel" | "Message"): NavContextMenuPatchCallback { return (children, props) => { const value = props[name.toLowerCase()]; if (!value) return; if (props.label === getIntlMessage("CHANNEL_ACTIONS_MENU_LABEL")) return; // random shit like notification settings + const isMessage = name === "Message"; + if (isMessage && !settings.store.messageContextMenu) return; - const lastChild = children.at(-1); - if (lastChild?.key === "developer-actions") { - const p = lastChild.props; - if (!Array.isArray(p.children)) - p.children = [p.children]; - - children = p.children; - } // typescript parser goes crazy if this is inline const id = `vc-view-${name.toLowerCase()}-raw`; - children.splice(-1, 0, + const action = isMessage + ? () => openViewRawModalMessage(value) + : () => openViewRawModal(JSON.stringify(value, null, 4), name); + + const devContainer = findGroupChildrenByChildId(`devmode-copy-id-${value.id}`, children); + + (devContainer ?? children).splice(-1, 0, openViewRawModal(JSON.stringify(value, null, 4), name)} + action={action} icon={CopyIcon} /> ); @@ -186,7 +191,8 @@ export default definePlugin({ "thread-context": MakeContextCallback("Channel"), "gdm-context": MakeContextCallback("Channel"), "user-context": MakeContextCallback("User"), - "dev-context": devContextCallback + "dev-context": devContextCallback, + "message": MakeContextCallback("Message"), }, messagePopoverButton: { From 60c541260879e03266d9000408cde391a4a25e73 Mon Sep 17 00:00:00 2001 From: prism Date: Sat, 18 Apr 2026 20:31:26 +0200 Subject: [PATCH 063/247] Declutter: don't touch shop page (#984) --- src/equicordplugins/declutter/index.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/equicordplugins/declutter/index.tsx b/src/equicordplugins/declutter/index.tsx index ea2e628b6..b5b8c79c2 100644 --- a/src/equicordplugins/declutter/index.tsx +++ b/src/equicordplugins/declutter/index.tsx @@ -147,10 +147,10 @@ export default definePlugin({ patches: [ { // Nameplate - find: "#{intl::AVATAR_MALLOW}", + find: ".MINI_PREVIEW,[", replacement: { - match: /function \i\(\i\)\{(?=.{0,25}skuId:)/, - replace: "$&return null;" + match: /function \i\((\i)\)\{(?=let\{nameplate:\i,hovered:\i,selected:\i,content:\i,placement:\i\}=)/, + replace: '$&if($1.placement!=="preview"&&$1.placement!=="mini_preview")return null;' }, predicate: () => settings.store.removeNameplate, }, @@ -158,8 +158,8 @@ export default definePlugin({ // Profile banner animation effect find: "bannerAdjustment,isHovering", replacement: { - match: /\i=\i=>\{(?=.{0,50}\.useReducedMotion\))/, - replace: "$&return null;" + match: /\i=(\i)=>\{(?=.{0,50}\.useReducedMotion\))/, + replace: "$&if(!$1.shopPreview)return null;" }, predicate: () => settings.store.removeProfileEffect, }, From ac4c21b596afc2b2f7f3548879330f9e0bbd6f50 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sat, 18 Apr 2026 14:50:27 -0400 Subject: [PATCH 064/247] CharacterCounter: Selected Text Setting --- src/plugins/characterCounter/index.tsx | 39 ++++++++++++++++++++++---- src/plugins/characterCounter/style.css | 4 +++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/plugins/characterCounter/index.tsx b/src/plugins/characterCounter/index.tsx index 57b9c3f30..c119e3c19 100644 --- a/src/plugins/characterCounter/index.tsx +++ b/src/plugins/characterCounter/index.tsx @@ -11,7 +11,8 @@ import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import { classNameFactory } from "@utils/css"; import definePlugin, { OptionType } from "@utils/types"; -import { UserStore } from "@webpack/common"; +import { useEffect, UserStore, useState } from "@webpack/common"; +import EventEmitter from "events"; const cl = classNameFactory("vc-charCounter-"); @@ -20,7 +21,12 @@ const settings = definePluginSettings({ type: OptionType.BOOLEAN, description: "Enable yellow/red colouring as you get closer to the character limit", default: true, - } + }, + selectedText: { + type: OptionType.BOOLEAN, + description: "Show the character count of your current text selection", + default: false, + }, }); function getCounterColor(percentage: number) { @@ -42,8 +48,8 @@ export default definePlugin({ find: ".CREATE_FORUM_POST||", replacement: [ { - match: /(?<=textValue:(\i),editorHeight:\i,channelId:\i\.id\}\)),\i/, - replace: ",$self.renderCharCounter({text:$1})" + match: /(?<=(\i)\.emit\("submit-failure".*?textValue:(\i),editorHeight:\i,channelId:\i\.id\}\)),\i/, + replace: ",$self.renderCharCounter({text:$2,eventEmitter:$1})" } ] }, @@ -56,16 +62,37 @@ export default definePlugin({ } ], - renderCharCounter: ErrorBoundary.wrap(({ text }: { text: string; }) => { + renderCharCounter: ErrorBoundary.wrap(({ text, eventEmitter }: { text: string; eventEmitter: EventEmitter; }) => { if (!text.length) return null; + const [selectedCount, setSelectedCount] = useState(0); + const showSelected = selectedCount > 0; const premiumType = UserStore.getCurrentUser().premiumType ?? 0; const charMax = premiumType === 2 ? 4000 : 2000; - const color = getCounterColor((text.length / charMax) * 100); + useEffect(() => { + function onSelectionChange() { + const selection = window.getSelection(); + if (!selection || selection.isCollapsed) { + setSelectedCount(0); + return; + } + setSelectedCount(selection.toString().length); + } + + eventEmitter.on("selection-changed", onSelectionChange); + return () => void eventEmitter.off("selection-changed", onSelectionChange); + }, [eventEmitter]); + return (
+ {showSelected && ( + <> + {selectedCount} + / + + )} {text.length} / {charMax} diff --git a/src/plugins/characterCounter/style.css b/src/plugins/characterCounter/style.css index 072d42bef..87f7d775a 100644 --- a/src/plugins/characterCounter/style.css +++ b/src/plugins/characterCounter/style.css @@ -12,4 +12,8 @@ .vc-charCounter-count { transition: color 0.3s ease; +} + +.vc-charCounter-selected { + color: #4285F4 } \ No newline at end of file From ae6f955321ad8acca0e66901696b05c47039ac0d Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:45:40 -0400 Subject: [PATCH 065/247] Fix Creations Dev Const --- src/plugins/characterCounter/index.tsx | 4 ++-- src/utils/constants.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/characterCounter/index.tsx b/src/plugins/characterCounter/index.tsx index c119e3c19..5965f24b5 100644 --- a/src/plugins/characterCounter/index.tsx +++ b/src/plugins/characterCounter/index.tsx @@ -8,7 +8,7 @@ import "./style.css"; import { definePluginSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; -import { Devs } from "@utils/constants"; +import { Devs, EquicordDevs } from "@utils/constants"; import { classNameFactory } from "@utils/css"; import definePlugin, { OptionType } from "@utils/types"; import { useEffect, UserStore, useState } from "@webpack/common"; @@ -40,7 +40,7 @@ function getCounterColor(percentage: number) { export default definePlugin({ name: "CharacterCounter", description: "Adds a character counter to the chat input", - authors: [Devs.thororen], + authors: [Devs.thororen, EquicordDevs.creations], tags: ["Utility"], settings, patches: [ diff --git a/src/utils/constants.ts b/src/utils/constants.ts index b289eb7b2..6b507a4a9 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -997,7 +997,7 @@ export const EquicordDevs = Object.freeze({ id: 984392761929256980n }, creations: { - name: "Creation's", + name: "creations", id: 209830981060788225n }, Leko: { From b6519b6d3b820b7a77e3edcc03171b1015dd82ec Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sat, 18 Apr 2026 16:27:51 -0400 Subject: [PATCH 066/247] CharacterCounter: Inline with vencord pr --- src/plugins/characterCounter/index.tsx | 49 ++++++++++++-------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/src/plugins/characterCounter/index.tsx b/src/plugins/characterCounter/index.tsx index 5965f24b5..ac5d629ec 100644 --- a/src/plugins/characterCounter/index.tsx +++ b/src/plugins/characterCounter/index.tsx @@ -11,22 +11,18 @@ import ErrorBoundary from "@components/ErrorBoundary"; import { Devs, EquicordDevs } from "@utils/constants"; import { classNameFactory } from "@utils/css"; import definePlugin, { OptionType } from "@utils/types"; +import { findByPropsLazy } from "@webpack"; import { useEffect, UserStore, useState } from "@webpack/common"; -import EventEmitter from "events"; const cl = classNameFactory("vc-charCounter-"); +const SlateUtils = findByPropsLazy("getSelectedText"); const settings = definePluginSettings({ colorEffects: { type: OptionType.BOOLEAN, description: "Enable yellow/red colouring as you get closer to the character limit", default: true, - }, - selectedText: { - type: OptionType.BOOLEAN, - description: "Show the character count of your current text selection", - default: false, - }, + } }); function getCounterColor(percentage: number) { @@ -48,8 +44,8 @@ export default definePlugin({ find: ".CREATE_FORUM_POST||", replacement: [ { - match: /(?<=(\i)\.emit\("submit-failure".*?textValue:(\i),editorHeight:\i,channelId:\i\.id\}\)),\i/, - replace: ",$self.renderCharCounter({text:$2,eventEmitter:$1})" + match: /(?<=,editorRef:(\i),.{0,200}textValue:(\i),editorHeight:\i,channelId:\i\.id\}\)),\i/, + replace: ",$self.renderCharCounter({editorRef:$1,text:$2})" } ] }, @@ -62,28 +58,27 @@ export default definePlugin({ } ], - renderCharCounter: ErrorBoundary.wrap(({ text, eventEmitter }: { text: string; eventEmitter: EventEmitter; }) => { - if (!text.length) return null; - + renderCharCounter: ErrorBoundary.wrap(({ editorRef, text }: { text: string; editorRef: any; }) => { const [selectedCount, setSelectedCount] = useState(0); - const showSelected = selectedCount > 0; - const premiumType = UserStore.getCurrentUser().premiumType ?? 0; - const charMax = premiumType === 2 ? 4000 : 2000; - const color = getCounterColor((text.length / charMax) * 100); + const showSelected = selectedCount > 0 && (editorRef?.current?.state?.focused ?? false); useEffect(() => { - function onSelectionChange() { - const selection = window.getSelection(); - if (!selection || selection.isCollapsed) { - setSelectedCount(0); - return; - } - setSelectedCount(selection.toString().length); - } + const listener = () => { + if (!editorRef?.current) return setSelectedCount(0); - eventEmitter.on("selection-changed", onSelectionChange); - return () => void eventEmitter.off("selection-changed", onSelectionChange); - }, [eventEmitter]); + setTimeout(() => setSelectedCount(SlateUtils.getSelectedText(editorRef.current.getSlateEditor())?.length ?? 0), 50); + }; + + document.addEventListener("selectionchange", listener); + return () => document.removeEventListener("selectionchange", listener); + }, []); + + if (!text.length) return null; + + const premiumType = UserStore.getCurrentUser().premiumType ?? 0; + const charMax = premiumType === 2 ? 4000 : 2000; + + const color = getCounterColor((text.length / charMax) * 100); return (
From 42a049ea2b93afc63c99ca9d9bd386906ca2a5e1 Mon Sep 17 00:00:00 2001 From: thororen1234 <78185467+thororen1234@users.noreply.github.com> Date: Sat, 18 Apr 2026 16:46:59 -0400 Subject: [PATCH 067/247] Userplugin Priority --- scripts/build/build.mjs | 2 +- scripts/build/common.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build/build.mjs b/scripts/build/build.mjs index 748553645..b722e5837 100644 --- a/scripts/build/build.mjs +++ b/scripts/build/build.mjs @@ -77,7 +77,7 @@ const globNativesPlugin = { }); build.onLoad({ filter, namespace: "import-natives" }, async () => { - const pluginDirs = ["plugins", "userplugins", "equicordplugins"]; + const pluginDirs = ["plugins", "equicordplugins", "userplugins"]; let code = ""; let natives = "\n"; let i = 0; diff --git a/scripts/build/common.mjs b/scripts/build/common.mjs index 8138fc0cf..5e55e1b63 100644 --- a/scripts/build/common.mjs +++ b/scripts/build/common.mjs @@ -147,7 +147,7 @@ export const globPlugins = kind => ({ }); build.onLoad({ filter, namespace: "import-plugins" }, async () => { - const pluginDirs = ["plugins/_api", "plugins/_core", "plugins", "userplugins", "equicordplugins", "equicordplugins/_api"]; + const pluginDirs = ["plugins/_api", "plugins/_core", "plugins", "equicordplugins", "equicordplugins/_api", "userplugins"]; let code = ""; let pluginsCode = "\n"; let metaCode = "\n"; From d15579faa271a2cea32557714921bc2ccb230037 Mon Sep 17 00:00:00 2001 From: MasterPepe <56143265+Accentaro@users.noreply.github.com> Date: Sun, 19 Apr 2026 19:25:54 +0100 Subject: [PATCH 068/247] Add CollapsibleUI panel targets (#987) --- src/equicordplugins/collapsibleUi/index.tsx | 2 +- src/equicordplugins/collapsibleUi/settings.ts | 31 ++++- src/equicordplugins/collapsibleUi/style.css | 129 +++++++++++++++++- 3 files changed, 159 insertions(+), 3 deletions(-) diff --git a/src/equicordplugins/collapsibleUi/index.tsx b/src/equicordplugins/collapsibleUi/index.tsx index d6c7d709c..29145e661 100644 --- a/src/equicordplugins/collapsibleUi/index.tsx +++ b/src/equicordplugins/collapsibleUi/index.tsx @@ -29,7 +29,7 @@ function PanelsIcon(props: SVGProps) { } function getStateClasses(store: StateStore) { - const classNames = [cl("state"), cl(`transition-${store.transitionMs}`)]; + const classNames = [cl("state"), cl(`collapsed-size-${store.collapsedSize}`), cl(`transition-${store.transitionMs}`)]; for (const panelId of toolbarPanelOrder) { const panel = panelRegistry[panelId]; diff --git a/src/equicordplugins/collapsibleUi/settings.ts b/src/equicordplugins/collapsibleUi/settings.ts index dce2485b2..a1b164a56 100644 --- a/src/equicordplugins/collapsibleUi/settings.ts +++ b/src/equicordplugins/collapsibleUi/settings.ts @@ -8,8 +8,15 @@ import { definePluginSettings } from "@api/Settings"; import { OptionType } from "@utils/types"; export const transitionMarkers = [0, 80, 120, 160, 200, 260, 320]; +export const collapsedSizeMarkers = [8, 12, 16, 20, 24, 28, 32, 40, 48]; export const panelRegistry = { + guildBar: { + id: "guildBar", + classId: "guild-bar", + label: "Guild Bar", + collapsedKey: "guildBarCollapsed", + }, channelList: { id: "channelList", classId: "channel-list", @@ -28,6 +35,12 @@ export const panelRegistry = { label: "Message Buttons", collapsedKey: "chatButtonsCollapsed", }, + titleBar: { + id: "titleBar", + classId: "title-bar", + label: "Title Bar", + collapsedKey: "titleBarCollapsed", + }, userArea: { id: "userArea", classId: "user-area", @@ -38,15 +51,26 @@ export const panelRegistry = { export type PanelId = keyof typeof panelRegistry; -export const toolbarPanelOrder = ["channelList", "membersList", "chatButtons", "userArea"] as const satisfies readonly PanelId[]; +export const toolbarPanelOrder = ["guildBar", "channelList", "membersList", "chatButtons", "titleBar", "userArea"] as const satisfies readonly PanelId[]; export const settings = definePluginSettings({ + collapsedSize: { + type: OptionType.SLIDER, + description: "Collapsed hover area size in pixels.", + default: 12, + markers: collapsedSizeMarkers, + }, transitionMs: { type: OptionType.SLIDER, description: "Panel transition speed in milliseconds.", default: 160, markers: transitionMarkers, }, + guildBarCollapsed: { + type: OptionType.BOOLEAN, + description: "Persist the guild bar as collapsed.", + default: false, + }, channelListCollapsed: { type: OptionType.BOOLEAN, description: "Persist the channel list as collapsed.", @@ -62,6 +86,11 @@ export const settings = definePluginSettings({ description: "Persist the message button row as collapsed.", default: false, }, + titleBarCollapsed: { + type: OptionType.BOOLEAN, + description: "Persist the title bar as collapsed.", + default: false, + }, userAreaCollapsed: { type: OptionType.BOOLEAN, description: "Persist the user area as collapsed.", diff --git a/src/equicordplugins/collapsibleUi/style.css b/src/equicordplugins/collapsibleUi/style.css index 0ff9d8cc3..c3cf45f7c 100644 --- a/src/equicordplugins/collapsibleUi/style.css +++ b/src/equicordplugins/collapsibleUi/style.css @@ -1,13 +1,49 @@ body:has(.vc-collapsible-ui-state) { --vc-cui-chat-buttons-width: min(320px, 36vw); --vc-cui-collapsed-size: 12px; - --vc-cui-hover-peek: 18px; + --vc-cui-hover-peek: var(--vc-cui-collapsed-size); --vc-cui-hover-delay: 120ms; --vc-cui-user-area-collapsed-width: 52px; --vc-cui-transition: 160ms; --vc-cui-ease: cubic-bezier(.2, 0, 0, 1); } +body:has(.vc-collapsible-ui-collapsed-size-8) { + --vc-cui-collapsed-size: 8px; +} + +body:has(.vc-collapsible-ui-collapsed-size-12) { + --vc-cui-collapsed-size: 12px; +} + +body:has(.vc-collapsible-ui-collapsed-size-16) { + --vc-cui-collapsed-size: 16px; +} + +body:has(.vc-collapsible-ui-collapsed-size-20) { + --vc-cui-collapsed-size: 20px; +} + +body:has(.vc-collapsible-ui-collapsed-size-24) { + --vc-cui-collapsed-size: 24px; +} + +body:has(.vc-collapsible-ui-collapsed-size-28) { + --vc-cui-collapsed-size: 28px; +} + +body:has(.vc-collapsible-ui-collapsed-size-32) { + --vc-cui-collapsed-size: 32px; +} + +body:has(.vc-collapsible-ui-collapsed-size-40) { + --vc-cui-collapsed-size: 40px; +} + +body:has(.vc-collapsible-ui-collapsed-size-48) { + --vc-cui-collapsed-size: 48px; +} + body:has(.vc-collapsible-ui-transition-0) { --vc-cui-transition: 0ms; } @@ -36,6 +72,47 @@ body:has(.vc-collapsible-ui-transition-320) { --vc-cui-transition: 320ms; } +body:has(.vc-collapsible-ui-guild-bar-collapsed) nav[class*="guilds_"] { + overflow: hidden !important; + transition: + width var(--vc-cui-transition) var(--vc-cui-ease), + inline-size var(--vc-cui-transition) var(--vc-cui-ease), + min-width var(--vc-cui-transition) var(--vc-cui-ease), + min-inline-size var(--vc-cui-transition) var(--vc-cui-ease), + max-width var(--vc-cui-transition) var(--vc-cui-ease), + max-inline-size var(--vc-cui-transition) var(--vc-cui-ease), + flex-basis var(--vc-cui-transition) var(--vc-cui-ease) !important; +} + +body:has(.vc-collapsible-ui-guild-bar-collapsed):has(nav[class*="guilds_"]:hover) nav[class*="guilds_"], +body:has(.vc-collapsible-ui-guild-bar-collapsed):has(nav[class*="guilds_"]:focus-within) nav[class*="guilds_"] { + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-guild-bar-collapsed):has(nav[class*="guilds_"]:hover) nav[class*="guilds_"] > :where(*), +body:has(.vc-collapsible-ui-guild-bar-collapsed):has(nav[class*="guilds_"]:focus-within) nav[class*="guilds_"] > :where(*) { + opacity: 1; + pointer-events: auto; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-guild-bar-collapsed):not(:has(nav[class*="guilds_"]:hover), :has(nav[class*="guilds_"]:focus-within)) nav[class*="guilds_"] { + width: var(--vc-cui-collapsed-size) !important; + inline-size: var(--vc-cui-collapsed-size) !important; + min-width: var(--vc-cui-collapsed-size) !important; + min-inline-size: var(--vc-cui-collapsed-size) !important; + max-width: var(--vc-cui-collapsed-size) !important; + max-inline-size: var(--vc-cui-collapsed-size) !important; + flex: 0 0 var(--vc-cui-collapsed-size) !important; +} + +body:has(.vc-collapsible-ui-guild-bar-collapsed):not(:has(nav[class*="guilds_"]:hover), :has(nav[class*="guilds_"]:focus-within)) nav[class*="guilds_"] > :where(*) { + opacity: 0; + pointer-events: none; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); +} + body:has(.vc-collapsible-ui-channel-list-collapsed):has([class*="sidebarList_"]:hover) [class*="sidebarList_"] { transition-delay: var(--vc-cui-hover-delay); } @@ -171,6 +248,56 @@ body:has(.vc-collapsible-ui-user-area-collapsed):not(:has([class*="sidebar_"] > transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); } +body:has(.vc-collapsible-ui-guild-bar-collapsed):has(.vc-collapsible-ui-channel-list-collapsed):not(:has([class*="sidebar_"] > [class*="panels_"]:hover)) [class*="sidebar_"] > [class*="panels_"] { + width: calc(var(--vc-cui-hover-peek) + 4px) !important; + inline-size: calc(var(--vc-cui-hover-peek) + 4px) !important; + min-width: calc(var(--vc-cui-hover-peek) + 4px) !important; + min-inline-size: calc(var(--vc-cui-hover-peek) + 4px) !important; + max-width: calc(var(--vc-cui-hover-peek) + 4px) !important; + max-inline-size: calc(var(--vc-cui-hover-peek) + 4px) !important; +} + +body:has(.vc-collapsible-ui-title-bar-collapsed) section[class*="title_"][class*="container__"] { + overflow: hidden !important; + transition: + height var(--vc-cui-transition) var(--vc-cui-ease), + block-size var(--vc-cui-transition) var(--vc-cui-ease), + min-height var(--vc-cui-transition) var(--vc-cui-ease), + min-block-size var(--vc-cui-transition) var(--vc-cui-ease), + max-height var(--vc-cui-transition) var(--vc-cui-ease), + max-block-size var(--vc-cui-transition) var(--vc-cui-ease), + padding var(--vc-cui-transition) var(--vc-cui-ease) !important; +} + +body:has(.vc-collapsible-ui-title-bar-collapsed):has(section[class*="title_"][class*="container__"]:hover) section[class*="title_"][class*="container__"], +body:has(.vc-collapsible-ui-title-bar-collapsed):has(section[class*="title_"][class*="container__"]:focus-within) section[class*="title_"][class*="container__"] { + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-title-bar-collapsed):has(section[class*="title_"][class*="container__"]:hover) section[class*="title_"][class*="container__"] > :where(*), +body:has(.vc-collapsible-ui-title-bar-collapsed):has(section[class*="title_"][class*="container__"]:focus-within) section[class*="title_"][class*="container__"] > :where(*) { + opacity: 1; + pointer-events: auto; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); + transition-delay: var(--vc-cui-hover-delay); +} + +body:has(.vc-collapsible-ui-title-bar-collapsed):not(:has(section[class*="title_"][class*="container__"]:hover), :has(section[class*="title_"][class*="container__"]:focus-within)) section[class*="title_"][class*="container__"] { + height: var(--vc-cui-hover-peek) !important; + block-size: var(--vc-cui-hover-peek) !important; + min-height: var(--vc-cui-hover-peek) !important; + min-block-size: var(--vc-cui-hover-peek) !important; + max-height: var(--vc-cui-hover-peek) !important; + max-block-size: var(--vc-cui-hover-peek) !important; + padding-block: 0 !important; +} + +body:has(.vc-collapsible-ui-title-bar-collapsed):not(:has(section[class*="title_"][class*="container__"]:hover), :has(section[class*="title_"][class*="container__"]:focus-within)) section[class*="title_"][class*="container__"] > :where(*) { + opacity: 0; + pointer-events: none; + transition: opacity var(--vc-cui-transition) var(--vc-cui-ease); +} + .vc-collapsible-ui-chat-buttons { display: flex; align-items: center; From 9534e3c6b4ed989b17889c1b89b79c11f79f0ebe Mon Sep 17 00:00:00 2001 From: exit <67079527+exitss@users.noreply.github.com> Date: Sun, 19 Apr 2026 19:29:21 +0100 Subject: [PATCH 069/247] Jellyfin RPC: Show media info and timestamp while paused (#985) --- .../richPresence/services/jellyfin.ts | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/equicordplugins/richPresence/services/jellyfin.ts b/src/equicordplugins/richPresence/services/jellyfin.ts index ae4dc8f5d..a8cf83ebe 100644 --- a/src/equicordplugins/richPresence/services/jellyfin.ts +++ b/src/equicordplugins/richPresence/services/jellyfin.ts @@ -5,6 +5,7 @@ */ import { Logger } from "@utils/Logger"; +import { formatDurationMs } from "@utils/text"; import { Activity } from "@vencord/discord-types"; import { ApplicationAssetUtils, FluxDispatcher, showToast } from "@webpack/common"; @@ -152,13 +153,18 @@ async function getActivity(): Promise { }; const getDetails = () => { + let details: string; if (mediaData.type === "Episode" && mediaData.seriesName) - return store.jf_privacyMode ? "Watching a TV Show" : mediaData.seriesName; - return store.jf_privacyMode ? "Watching Something" : mediaData.name; + details = store.jf_privacyMode ? "Watching a TV Show" : mediaData.seriesName; + else + details = store.jf_privacyMode ? "Watching Something" : mediaData.name; + if (mediaData.isPaused) details += " - Paused"; + return details; }; const getState = () => { - if (mediaData.isPaused) return "Paused"; + let state: string | undefined; + if (mediaData.type === "Episode" && mediaData.seriesName) { let episodeFormat = ""; const season = mediaData.seasonNumber; @@ -183,13 +189,23 @@ async function getActivity(): Promise { episodeFormat = format === "fulltext" ? `Episode ${episode}` : `E${episode.toString().padStart(2, "0")}`; } - if (store.jf_showEpisodeName && mediaData.name && !store.jf_privacyMode) - return `${episodeFormat} - ${mediaData.name}`; - return episodeFormat; + state = (store.jf_showEpisodeName && mediaData.name && !store.jf_privacyMode) + ? `${episodeFormat} - ${mediaData.name}` + : episodeFormat; + } else if (store.jf_privacyMode) { + state = mediaData.type === "Audio" ? "Listening to music" : (mediaData.year ? "(????)" : undefined); + } else { + state = mediaData.artist || (mediaData.year ? `(${mediaData.year})` : undefined); } - if (store.jf_privacyMode) - return mediaData.type === "Audio" ? "Listening to music" : (mediaData.year ? "(????)" : undefined); - return mediaData.artist || (mediaData.year ? `(${mediaData.year})` : undefined); + + if (mediaData.isPaused) { + const time = mediaData.position != null && mediaData.duration != null + ? `${formatDurationMs(mediaData.position * 1000)} / ${formatDurationMs(mediaData.duration * 1000)}` + : undefined; + const parts = [state, time].filter(Boolean); + return parts.join(" - ") || "Paused"; + } + return state; }; const timestamps = (!mediaData.isPaused && mediaData.position != null && mediaData.duration != null) ? { From e5fa0e8d7a5816664b5feb855260d9df2c7a8727 Mon Sep 17 00:00:00 2001 From: Key Date: Sun, 19 Apr 2026 19:30:44 +0100 Subject: [PATCH 070/247] FileUpload: optional proxy for video files (#980) * feat(FileUpload): optional proxy for video files * im lowkey dumb as shit --- src/equicordplugins/fileUpload/settings.tsx | 44 +++++++++++++++++++ .../fileUpload/utils/upload.ts | 39 +++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/equicordplugins/fileUpload/settings.tsx b/src/equicordplugins/fileUpload/settings.tsx index ab697c3fa..d898d87a4 100644 --- a/src/equicordplugins/fileUpload/settings.tsx +++ b/src/equicordplugins/fileUpload/settings.tsx @@ -39,6 +39,12 @@ const litterboxOptions = [ { label: "72 hours", value: "72h" } ]; +const embedProxyOptions = [ + { label: "x266.mov", value: "x266", default: true }, + { label: "discord.nfp.is", value: "nfp" }, + { label: "embeddr.top", value: "embeddr" } +]; + export const settings = definePluginSettings({ serviceType: { type: OptionType.SELECT, @@ -197,6 +203,19 @@ export const settings = definePluginSettings({ default: false, hidden: true }, + embedProxyEnabled: { + type: OptionType.BOOLEAN, + description: "Proxy uploaded video links through an embed helper service.", + default: false, + hidden: true + }, + embedProxyService: { + type: OptionType.SELECT, + description: "Embed helper service to wrap uploaded video links.", + options: embedProxyOptions, + default: "x266", + hidden: true + }, corsProxyUrl: { type: OptionType.STRING, description: "CORS proxy URL used for browser uploads", @@ -495,6 +514,31 @@ export function SettingsComponent() { /> + + { + store.embedProxyEnabled = v; + update(); + }} + /> + + + {store.embedProxyEnabled && ( + +