From 40fe13feda16e0a32806dd090e3039491da919bf Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sat, 15 Nov 2025 13:39:36 +0100 Subject: [PATCH 1/7] LastFMRichPresence: fix duplicating spotify presence --- .../discord-types/src/common/Activity.d.ts | 1 + .../src/stores/PresenceStore.d.ts | 26 +++++++++++++++++++ packages/discord-types/src/stores/index.d.ts | 1 + src/plugins/lastfmRichPresence/index.tsx | 6 ++--- src/plugins/platformIndicators/index.tsx | 15 +++++------ src/webpack/common/stores.ts | 2 +- 6 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 packages/discord-types/src/stores/PresenceStore.d.ts diff --git a/packages/discord-types/src/common/Activity.d.ts b/packages/discord-types/src/common/Activity.d.ts index 42de81364..5f7b90376 100644 --- a/packages/discord-types/src/common/Activity.d.ts +++ b/packages/discord-types/src/common/Activity.d.ts @@ -40,3 +40,4 @@ export interface Activity { }; } +export type OnlineStatus = "online" | "idle" | "dnd" | "invisible" | "offline" | "unknown" | "streaming"; diff --git a/packages/discord-types/src/stores/PresenceStore.d.ts b/packages/discord-types/src/stores/PresenceStore.d.ts new file mode 100644 index 000000000..3f245aca9 --- /dev/null +++ b/packages/discord-types/src/stores/PresenceStore.d.ts @@ -0,0 +1,26 @@ +import { Activity, OnlineStatus } from "../common"; +import { FluxStore } from "./FluxStore"; + +export interface UserAndActivity { + userId: string; + activity: Activity; +} + +export type DiscordPlatform = "desktop" | "mobile" | "web" | "embedded"; + +export class PresenceStore extends FluxStore { + findActivity(userId: string, predicate: (activity: Activity) => boolean, guildId?: string): Activity | undefined; + getActivities(userId: string, guildId?: string): Activity[]; + getActivityMetadata(userId: string): any; + getAllApplicationActivities(applicationId: string): UserAndActivity[]; + getApplicationActivity(userId: string, applicationId: string, guildId?: string): Activity | null; + getClientStatus(userId: string): Record; + getHiddenActivities(): any; + /** literally just getActivities(...)[0] */ + getPrimaryActivity(userId: string, guildId?: string): Activity | null; + getState(): any; + getStatus(userId: string, guildId?: string | null, defaultStatus?: OnlineStatus): OnlineStatus; + getUnfilteredActivities(userId: string, guildId?: string): Activity[]; + getUserIds(): string[]; + isMobileOnline(userId: string): boolean; +} diff --git a/packages/discord-types/src/stores/index.d.ts b/packages/discord-types/src/stores/index.d.ts index a843445bc..756021a5b 100644 --- a/packages/discord-types/src/stores/index.d.ts +++ b/packages/discord-types/src/stores/index.d.ts @@ -8,6 +8,7 @@ export * from "./GuildMemberStore"; export * from "./GuildRoleStore"; export * from "./GuildStore"; export * from "./MessageStore"; +export * from "./PresenceStore"; export * from "./RelationshipStore"; export * from "./SelectedChannelStore"; export * from "./SelectedGuildStore"; diff --git a/src/plugins/lastfmRichPresence/index.tsx b/src/plugins/lastfmRichPresence/index.tsx index e355c361a..fdfa3f3ed 100644 --- a/src/plugins/lastfmRichPresence/index.tsx +++ b/src/plugins/lastfmRichPresence/index.tsx @@ -22,7 +22,7 @@ import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; import { Activity, ActivityAssets, ActivityButton } from "@vencord/discord-types"; import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "@vencord/discord-types/enums"; -import { ApplicationAssetUtils, FluxDispatcher, PresenceStore } from "@webpack/common"; +import { ApplicationAssetUtils, AuthenticationStore, FluxDispatcher, PresenceStore } from "@webpack/common"; interface TrackData { name: string; @@ -243,13 +243,13 @@ export default definePlugin({ async getActivity(): Promise { if (settings.store.hideWithActivity) { - if (PresenceStore.getActivities().some(a => a.application_id !== DISCORD_APP_ID)) { + if (PresenceStore.getActivities(AuthenticationStore.getId()).some(a => a.application_id !== DISCORD_APP_ID)) { return null; } } if (settings.store.hideWithSpotify) { - if (PresenceStore.getActivities().some(a => a.type === ActivityType.LISTENING && a.application_id !== DISCORD_APP_ID)) { + if (PresenceStore.getActivities(AuthenticationStore.getId()).some(a => a.type === ActivityType.LISTENING && a.application_id !== DISCORD_APP_ID)) { // there is already music status because of Spotify or richerCider (probably more) return null; } diff --git a/src/plugins/platformIndicators/index.tsx b/src/plugins/platformIndicators/index.tsx index add930648..eb51b5e79 100644 --- a/src/plugins/platformIndicators/index.tsx +++ b/src/plugins/platformIndicators/index.tsx @@ -24,7 +24,7 @@ import { addMessageDecoration, removeMessageDecoration } from "@api/MessageDecor import { Settings } from "@api/Settings"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -import { User } from "@vencord/discord-types"; +import { DiscordPlatform, User } from "@vencord/discord-types"; import { filters, findStoreLazy, mapMangledModuleLazy } from "@webpack"; import { AuthenticationStore, PresenceStore, Tooltip, UserStore, useStateFromStores } from "@webpack/common"; @@ -66,14 +66,13 @@ const Icons = { web: Icon("M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2Zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93Zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39Z"), mobile: Icon("M 187 0 L 813 0 C 916.277 0 1000 83.723 1000 187 L 1000 1313 C 1000 1416.277 916.277 1500 813 1500 L 187 1500 C 83.723 1500 0 1416.277 0 1313 L 0 187 C 0 83.723 83.723 0 187 0 Z M 125 1000 L 875 1000 L 875 250 L 125 250 Z M 500 1125 C 430.964 1125 375 1180.964 375 1250 C 375 1319.036 430.964 1375 500 1375 C 569.036 1375 625 1319.036 625 1250 C 625 1180.964 569.036 1125 500 1125 Z", { viewBox: "0 0 1000 1500", height: 17, width: 17 }), embedded: Icon("M14.8 2.7 9 3.1V47h3.3c1.7 0 6.2.3 10 .7l6.7.6V2l-4.2.2c-2.4.1-6.9.3-10 .5zm1.8 6.4c1 1.7-1.3 3.6-2.7 2.2C12.7 10.1 13.5 8 15 8c.5 0 1.2.5 1.6 1.1zM16 33c0 6-.4 10-1 10s-1-4-1-10 .4-10 1-10 1 4 1 10zm15-8v23.3l3.8-.7c2-.3 4.7-.6 6-.6H43V3h-2.2c-1.3 0-4-.3-6-.6L31 1.7V25z", { viewBox: "0 0 50 50" }), -}; -type Platform = keyof typeof Icons; +} satisfies Record; const { useStatusFillColor } = mapMangledModuleLazy(".concat(.5625*", { useStatusFillColor: filters.byCode(".hex") }); -const PlatformIcon = ({ platform, status, small }: { platform: Platform, status: string; small: boolean; }) => { +const PlatformIcon = ({ platform, status, small }: { platform: DiscordPlatform, status: string; small: boolean; }) => { const tooltip = platform === "embedded" ? "Console" : platform[0].toUpperCase() + platform.slice(1); @@ -114,7 +113,7 @@ function getBadges({ userId }: BadgeUserArgs): ProfileBadge[] { ensureOwnStatus(user); - const status = PresenceStore.getClientStatus(user.id) as Record; + const status = PresenceStore.getClientStatus(user.id); if (!status) return []; return Object.entries(status).map(([platform, status]) => ({ @@ -122,7 +121,7 @@ function getBadges({ userId }: BadgeUserArgs): ProfileBadge[] { @@ -135,13 +134,13 @@ function getBadges({ userId }: BadgeUserArgs): ProfileBadge[] { const PlatformIndicator = ({ user, small = false }: { user: User; small?: boolean; }) => { ensureOwnStatus(user); - const status = useStateFromStores([PresenceStore], () => PresenceStore.getClientStatus(user.id) as Record); + const status = useStateFromStores([PresenceStore], () => PresenceStore.getClientStatus(user.id)); if (!status) return null; const icons = Object.entries(status).map(([platform, status]) => ( diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts index 1e3e5797e..725b8092a 100644 --- a/src/webpack/common/stores.ts +++ b/src/webpack/common/stores.ts @@ -34,7 +34,7 @@ export let MessageStore: Omit & GenericStore & { export let PermissionStore: GenericStore; export let GuildChannelStore: GenericStore; export let ReadStateStore: GenericStore; -export let PresenceStore: GenericStore; +export let PresenceStore: t.PresenceStore; export let GuildStore: t.GuildStore; export let GuildRoleStore: t.GuildRoleStore; From 6afcce39dd0a7e1cc47f5b64bb6edd5a162cbf63 Mon Sep 17 00:00:00 2001 From: V Date: Sun, 16 Nov 2025 15:17:35 +0100 Subject: [PATCH 2/7] refactor: fix circular dependency issues & improve organisation (#3729) Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com> --- browser/VencordNativeStub.ts | 16 +- package.json | 4 +- pnpm-lock.yaml | 298 +++-- src/Vencord.ts | 27 +- src/api/Badges.ts | 2 +- .../index.ts => api/PluginManager.ts} | 173 +-- src/api/Settings.ts | 13 - .../SettingsSync/cloudSetup.tsx} | 33 +- .../SettingsSync/cloudSync.ts} | 167 +-- src/api/SettingsSync/offline.ts | 95 ++ src/{utils/quickCss.ts => api/Themes.ts} | 17 +- src/api/UserSettings.ts | 6 +- src/api/index.ts | 7 + .../settings/tabs/patchHelper/index.tsx | 2 +- .../settings/tabs/plugins/PluginCard.tsx | 5 +- .../settings/tabs/plugins/index.tsx | 3 +- .../tabs/sync/BackupAndRestoreTab.tsx | 2 +- .../settings/tabs/sync/CloudTab.tsx | 37 +- .../settings/tabs/themes/LocalThemesTab.tsx | 5 +- .../settings/tabs/vencord/DonateButton.tsx | 2 +- .../settings/tabs/vencord/index.tsx | 2 +- src/debug/runReporter.ts | 4 +- src/plugins/_api/badges/index.tsx | 3 +- src/plugins/_core/supportHelper.tsx | 4 +- src/plugins/betterRoleDot/index.ts | 2 +- .../components/RenameButton.tsx | 2 +- .../betterSessions/components/RenameModal.tsx | 5 +- src/plugins/betterSessions/utils.ts | 2 +- src/plugins/betterSettings/PluginsSubmenu.tsx | 3 +- .../clientTheme/components/Settings.tsx | 4 +- src/plugins/consoleShortcuts/index.ts | 2 +- src/plugins/copyEmojiMarkdown/index.tsx | 2 +- src/plugins/copyFileContents/index.tsx | 2 +- src/plugins/copyStickerLinks/index.tsx | 7 +- src/plugins/customIdle/index.ts | 10 +- src/plugins/customRPC/RpcSettings.tsx | 5 +- .../decor/lib/stores/AuthorizationStore.tsx | 5 +- .../lib/stores/CurrentUserDecorationsStore.ts | 4 +- .../decor/lib/stores/UsersDecorationsStore.ts | 7 +- src/plugins/decor/lib/utils/decoration.ts | 6 +- src/plugins/decor/settings.tsx | 3 +- .../DecorDecorationGridDecoration.tsx | 4 +- .../decor/ui/components/DecorSection.tsx | 9 +- .../ui/components/DecorationContextMenu.tsx | 7 +- src/plugins/decor/ui/components/Grid.tsx | 3 +- .../decor/ui/components/SectionedGridList.tsx | 2 +- src/plugins/decor/ui/components/index.ts | 3 +- .../decor/ui/modals/ChangeDecorationModal.tsx | 27 +- .../decor/ui/modals/CreateDecorationModal.tsx | 9 +- .../decor/ui/modals/GuidelinesModal.tsx | 4 +- src/plugins/fakeNitro/index.tsx | 9 +- src/plugins/fakeProfileThemes/index.tsx | 6 +- .../{index.css => styles.css} | 0 .../imageZoom/components/Magnifier.tsx | 7 +- .../components/DecryptionModal.tsx | 77 -- .../components/EncryptionModal.tsx | 112 -- src/plugins/invisibleChat.desktop/index.tsx | 227 ---- src/plugins/messageClickActions/index.ts | 5 +- .../components/RolesAndUsersPermissions.tsx | 2 +- .../components/UserPermissions.tsx | 2 +- .../pinDms/components/CreateCategoryModal.tsx | 5 +- src/plugins/pinDms/components/contextMenu.tsx | 4 +- src/plugins/pinDms/data.ts | 3 +- src/plugins/quickReply/index.ts | 9 +- src/plugins/relationshipNotifier/utils.ts | 5 +- src/plugins/reviewDB/auth.tsx | 2 +- .../reviewDB/components/BlockedUserModal.tsx | 9 +- .../reviewDB/components/ReviewBadge.tsx | 5 +- .../reviewDB/components/ReviewComponent.tsx | 10 +- .../reviewDB/components/ReviewModal.tsx | 8 +- .../reviewDB/components/ReviewsView.tsx | 10 +- src/plugins/seeSummaries/index.tsx | 2 +- .../shikiCodeblocks.desktop/api/shiki.ts | 4 +- .../components/ButtonRow.tsx | 3 +- .../components/Code.tsx | 2 +- .../components/CopyButton.tsx | 2 +- .../components/Header.tsx | 6 +- .../components/Highlighter.tsx | 12 +- .../hooks/useShikiSettings.ts | 5 +- .../shikiCodeblocks.desktop/utils/misc.ts | 7 +- src/plugins/showConnections/index.tsx | 7 +- .../components/HiddenChannelLockScreen.tsx | 8 +- .../spotifyControls/PlayerComponent.tsx | 4 +- src/plugins/spotifyControls/SpotifyStore.ts | 4 +- src/plugins/typingIndicator/index.tsx | 3 +- src/plugins/unindent/index.ts | 2 +- src/plugins/userVoiceShow/components.tsx | 4 +- src/plugins/vencordToolbox/index.tsx | 7 +- .../vencordToolbox/{index.css => styles.css} | 0 src/plugins/viewRaw/index.tsx | 3 +- src/utils/apng-canvas.js | 1155 ----------------- src/utils/apng.ts | 258 ++++ src/utils/constants.ts | 3 + src/utils/dependencies.ts | 53 - src/utils/discord.tsx | 16 +- src/utils/index.ts | 1 + src/utils/misc.ts | 16 - src/utils/native.ts | 9 +- src/utils/react.tsx | 2 +- src/utils/text.ts | 3 +- src/utils/types.ts | 22 +- src/webpack/common/stores.ts | 5 +- src/webpack/common/utils.ts | 5 +- src/webpack/patchWebpack.ts | 2 +- src/webpack/webpack.ts | 92 +- tsconfig.json | 2 + 106 files changed, 1039 insertions(+), 2273 deletions(-) rename src/{plugins/index.ts => api/PluginManager.ts} (77%) rename src/{utils/cloud.tsx => api/SettingsSync/cloudSetup.tsx} (81%) rename src/{utils/settingsSync.ts => api/SettingsSync/cloudSync.ts} (53%) create mode 100644 src/api/SettingsSync/offline.ts rename src/{utils/quickCss.ts => api/Themes.ts} (88%) rename src/plugins/fakeProfileThemes/{index.css => styles.css} (100%) delete mode 100644 src/plugins/invisibleChat.desktop/components/DecryptionModal.tsx delete mode 100644 src/plugins/invisibleChat.desktop/components/EncryptionModal.tsx delete mode 100644 src/plugins/invisibleChat.desktop/index.tsx rename src/plugins/vencordToolbox/{index.css => styles.css} (100%) delete mode 100644 src/utils/apng-canvas.js create mode 100644 src/utils/apng.ts diff --git a/browser/VencordNativeStub.ts b/browser/VencordNativeStub.ts index c99c176c3..649612759 100644 --- a/browser/VencordNativeStub.ts +++ b/browser/VencordNativeStub.ts @@ -19,14 +19,16 @@ /// /// +// Be very careful with imports in this file to avoid circular dependency issues. +// Only import pure modules that don't import other parts of Vencord. import monacoHtmlLocal from "file://monacoWin.html?minify"; -import * as DataStore from "../src/api/DataStore"; -import { debounce, localStorage } from "../src/utils"; -import { EXTENSION_BASE_URL } from "../src/utils/web-metadata"; -import { getTheme, Theme } from "../src/utils/discord"; -import { getThemeInfo } from "../src/main/themes"; -import { Settings } from "../src/Vencord"; +import * as DataStore from "@api/DataStore"; +import type { Settings } from "@api/Settings"; +import { getThemeInfo } from "@main/themes"; +import { debounce } from "@shared/debounce"; +import { localStorage } from "@utils/localStorage"; import { getStylusWebStoreUrl } from "@utils/web"; +import { EXTENSION_BASE_URL } from "@utils/web-metadata"; // listeners for ipc.on const cssListeners = new Set<(css: string) => void>(); @@ -90,6 +92,8 @@ window.VencordNative = { return; } + const { getTheme, Theme } = require("@utils/discord"); + win.baseUrl = EXTENSION_BASE_URL; win.setCss = setCssDebounced; win.getCurrentCss = () => VencordNative.quickCss.get(); diff --git a/package.json b/package.json index d9f62d978..2fe739f55 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@types/chrome": "^0.0.312", "@types/diff": "^7.0.2", "@types/lodash": "^4.17.14", - "@types/node": "^22.13.13", + "@types/node": "^24.10.1", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@types/yazl": "^2.4.5", @@ -74,7 +74,7 @@ "ts-pattern": "^5.6.0", "tsx": "^4.19.3", "type-fest": "^4.38.0", - "typescript": "^5.8.2", + "typescript": "^5.9.3", "typescript-eslint": "^8.28.0", "typescript-transform-paths": "^3.5.5", "zip-local": "^0.3.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ba2d3175..74de81971 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: devDependencies: '@stylistic/eslint-plugin': specifier: ^4.2.0 - version: 4.2.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + version: 4.2.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) '@types/chrome': specifier: ^0.0.312 version: 0.0.312 @@ -54,8 +54,8 @@ importers: specifier: ^4.17.14 version: 4.17.15 '@types/node': - specifier: ^22.13.13 - version: 22.13.13 + specifier: ^24.10.1 + version: 24.10.1 '@types/react': specifier: ^19.0.10 version: 19.0.12 @@ -79,7 +79,7 @@ importers: version: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))) + version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))) eslint-plugin-path-alias: specifier: 2.1.0 version: 2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) @@ -94,7 +94,7 @@ importers: version: 12.1.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) eslint-plugin-unused-imports: specifier: ^4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -112,10 +112,10 @@ importers: version: 34.2.0 stylelint: specifier: ^16.17.0 - version: 16.17.0(typescript@5.8.2) + version: 16.17.0(typescript@5.9.3) stylelint-config-standard: specifier: ^37.0.0 - version: 37.0.0(stylelint@16.17.0(typescript@5.8.2)) + version: 37.0.0(stylelint@16.17.0(typescript@5.9.3)) ts-patch: specifier: ^3.3.0 version: 3.3.0 @@ -129,14 +129,14 @@ importers: specifier: ^4.38.0 version: 4.38.0 typescript: - specifier: ^5.8.2 - version: 5.8.2 + specifier: ^5.9.3 + version: 5.9.3 typescript-eslint: specifier: ^8.28.0 - version: 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + version: 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) typescript-transform-paths: specifier: ^3.5.5 - version: 3.5.5(typescript@5.8.2) + version: 3.5.5(typescript@5.9.3) zip-local: specifier: ^0.3.5 version: 0.3.5 @@ -163,13 +163,13 @@ importers: version: 22.13.13 '@types/react': specifier: 18.3.1 - version: 19.0.12 + version: 18.3.1 '@types/react-dom': specifier: 18.3.1 version: 18.3.1 '@vencord/discord-types': specifier: ^1.0.0 - version: 1.0.0(@types/react@19.0.12) + version: 1.0.0(@types/react@18.3.1) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -529,6 +529,15 @@ packages: '@types/node@22.13.13': resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} + '@types/node@22.19.1': + resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/react-dom@18.3.1': resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} @@ -537,6 +546,9 @@ packages: peerDependencies: '@types/react': ^19.0.0 + '@types/react@18.3.1': + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@types/react@19.0.12': resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} @@ -651,6 +663,10 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} + array-includes@3.1.9: + 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'} @@ -887,6 +903,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.1: + resolution: {integrity: sha512-98XGutrXoh75MlgLihlNxAGbUuFQc7l1cqcnEZlLNKc0UrVdPndgmaDmYTDDh929VS/eqTZV0rozmhu2qqT1/g==} + data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -1002,6 +1021,10 @@ packages: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1057,8 +1080,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -1560,6 +1583,10 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -2063,6 +2090,11 @@ 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 @@ -2207,6 +2239,10 @@ packages: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + streamx@2.22.0: resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} @@ -2374,8 +2410,8 @@ packages: peerDependencies: typescript: '>=3.6.5' - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -2386,6 +2422,12 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -2719,9 +2761,9 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@stylistic/eslint-plugin@4.2.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2)': + '@stylistic/eslint-plugin@4.2.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-visitor-keys: 4.2.0 espree: 10.3.0 @@ -2769,53 +2811,68 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@22.19.1': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.10.1': + dependencies: + undici-types: 7.16.0 + + '@types/prop-types@15.7.15': {} + '@types/react-dom@18.3.1': dependencies: - '@types/react': 19.0.12 + '@types/react': 18.3.1 '@types/react-dom@19.0.4(@types/react@19.0.12)': dependencies: '@types/react': 19.0.12 + '@types/react@18.3.1': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.1 + '@types/react@19.0.12': dependencies: csstype: 3.1.3 '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.13.13 + '@types/node': 24.10.1 optional: true '@types/yazl@2.4.6': dependencies: - '@types/node': 22.13.13 + '@types/node': 24.10.1 - '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/type-utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) + '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.28.0 eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2)': + '@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.28.0 '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.28.0 debug: 4.4.0 eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - typescript: 5.8.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2824,20 +2881,20 @@ snapshots: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/type-utils@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) debug: 4.4.0 eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.28.0': {} - '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 @@ -2846,19 +2903,19 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.1.0(typescript@5.8.2) - typescript: 5.8.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2)': + '@typescript-eslint/utils@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) '@typescript-eslint/scope-manager': 8.28.0 '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - typescript: 5.8.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -2877,9 +2934,9 @@ snapshots: vscode-oniguruma: 1.7.0 vscode-textmate: 5.2.0 - '@vencord/discord-types@1.0.0(@types/react@19.0.12)': + '@vencord/discord-types@1.0.0(@types/react@18.3.1)': dependencies: - '@types/react': 19.0.12 + '@types/react': 18.3.1 moment: 2.30.1 type-fest: 4.41.0 @@ -2931,6 +2988,17 @@ snapshots: get-intrinsic: 1.3.0 is-string: 1.1.1 + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + array-union@2.1.0: {} array-unique@0.3.2: {} @@ -2949,7 +3017,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -3163,14 +3231,14 @@ snapshots: copy-descriptor@0.1.1: {} - cosmiconfig@9.0.0(typescript@5.8.2): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.2 + typescript: 5.9.3 cross-spawn@7.0.6: dependencies: @@ -3189,6 +3257,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.1: {} + data-uri-to-buffer@6.0.2: {} data-view-buffer@1.0.2: @@ -3347,6 +3417,63 @@ snapshots: unbox-primitive: 1.1.0 which-typed-array: 1.1.19 + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + 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.19 + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3431,32 +3558,32 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 @@ -3464,7 +3591,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3476,7 +3603,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -3521,11 +3648,11 @@ snapshots: dependencies: eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): dependencies: eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) eslint-scope@8.3.0: dependencies: @@ -4020,6 +4147,8 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -4307,7 +4436,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.pick@1.3.0: dependencies: @@ -4531,6 +4660,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.11: + 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: dependencies: is-core-module: 2.16.1 @@ -4702,13 +4837,18 @@ snapshots: standalone-electron-types@34.2.0: dependencies: - '@types/node': 22.13.13 + '@types/node': 22.19.1 static-extend@0.1.2: dependencies: define-property: 0.2.5 object-copy: 0.1.0 + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 @@ -4774,16 +4914,16 @@ snapshots: strip-json-comments@3.1.1: {} - stylelint-config-recommended@15.0.0(stylelint@16.17.0(typescript@5.8.2)): + stylelint-config-recommended@15.0.0(stylelint@16.17.0(typescript@5.9.3)): dependencies: - stylelint: 16.17.0(typescript@5.8.2) + stylelint: 16.17.0(typescript@5.9.3) - stylelint-config-standard@37.0.0(stylelint@16.17.0(typescript@5.8.2)): + stylelint-config-standard@37.0.0(stylelint@16.17.0(typescript@5.9.3)): dependencies: - stylelint: 16.17.0(typescript@5.8.2) - stylelint-config-recommended: 15.0.0(stylelint@16.17.0(typescript@5.8.2)) + stylelint: 16.17.0(typescript@5.9.3) + stylelint-config-recommended: 15.0.0(stylelint@16.17.0(typescript@5.9.3)) - stylelint@16.17.0(typescript@5.8.2): + stylelint@16.17.0(typescript@5.9.3): dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 @@ -4792,7 +4932,7 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.8.2) + cosmiconfig: 9.0.0(typescript@5.9.3) css-functions-list: 3.2.3 css-tree: 3.1.0 debug: 4.4.0 @@ -4890,9 +5030,9 @@ snapshots: regex-not: 1.0.2 safe-regex: 1.1.0 - ts-api-utils@2.1.0(typescript@5.8.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.8.2 + typescript: 5.9.3 ts-patch@3.3.0: dependencies: @@ -4964,22 +5104,22 @@ snapshots: typed-query-selector@2.12.0: {} - typescript-eslint@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2): + typescript-eslint@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) + '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) + '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - typescript: 5.8.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript-transform-paths@3.5.5(typescript@5.8.2): + typescript-transform-paths@3.5.5(typescript@5.9.3): dependencies: minimatch: 9.0.5 - typescript: 5.8.2 + typescript: 5.9.3 - typescript@5.8.2: {} + typescript@5.9.3: {} unbox-primitive@1.1.0: dependencies: @@ -4990,6 +5130,10 @@ snapshots: undici-types@6.20.0: {} + undici-types@6.21.0: {} + + undici-types@7.16.0: {} + union-value@1.0.1: dependencies: arr-union: 3.1.0 diff --git a/src/Vencord.ts b/src/Vencord.ts index e5e8cc955..ebbeeb30c 100644 --- a/src/Vencord.ts +++ b/src/Vencord.ts @@ -20,34 +20,32 @@ import "~plugins"; export * as Api from "./api"; +export * as Plugins from "./api/PluginManager"; export * as Components from "./components"; -export * as Plugins from "./plugins"; export * as Util from "./utils"; -export * as QuickCss from "./utils/quickCss"; export * as Updater from "./utils/updater"; export * as Webpack from "./webpack"; export * as WebpackPatcher from "./webpack/patchWebpack"; export { PlainSettings, Settings }; -import "./utils/quickCss"; -import "./webpack/patchWebpack"; - import { addVencordUiStyles } from "@components/css"; import { openUpdaterModal } from "@components/settings/tabs/updater"; +import { debounce } from "@shared/debounce"; import { IS_WINDOWS } from "@utils/constants"; import { createAndAppendStyle } from "@utils/css"; import { StartAt } from "@utils/types"; import { get as dsGet } from "./api/DataStore"; import { NotificationData, showNotification } from "./api/Notifications"; -import { PlainSettings, Settings } from "./api/Settings"; -import { patches, PMLogger, startAllPlugins } from "./plugins"; +import { initPluginManager, PMLogger, startAllPlugins } from "./api/PluginManager"; +import { PlainSettings, Settings, SettingsStore } from "./api/Settings"; +import { getCloudSettings, putCloudSettings } from "./api/SettingsSync/cloudSync"; import { localStorage } from "./utils/localStorage"; import { relaunch } from "./utils/native"; -import { getCloudSettings, putCloudSettings } from "./utils/settingsSync"; import { checkForUpdates, update, UpdateLogger } from "./utils/updater"; import { onceReady } from "./webpack"; import { SettingsRouter } from "./webpack/common"; +import { patches } from "./webpack/patchWebpack"; if (IS_REPORTER) { require("./debug/runReporter"); @@ -90,6 +88,18 @@ async function syncSettings() { }); } } + + const saveSettingsOnFrequentAction = debounce(async () => { + if (Settings.cloud.settingsSync && Settings.cloud.authenticated) { + await putCloudSettings(); + delete localStorage.Vencord_settingsDirty; + } + }, 60_000); + + SettingsStore.addGlobalChangeListener(() => { + localStorage.Vencord_settingsDirty = true; + saveSettingsOnFrequentAction(); + }); } let notifiedForUpdatesThisSession = false; @@ -161,6 +171,7 @@ async function init() { } } +initPluginManager(); startAllPlugins(StartAt.Init); init(); diff --git a/src/api/Badges.ts b/src/api/Badges.ts index 8299dafa1..f909b0e38 100644 --- a/src/api/Badges.ts +++ b/src/api/Badges.ts @@ -17,7 +17,7 @@ */ import ErrorBoundary from "@components/ErrorBoundary"; -import BadgeAPIPlugin from "plugins/_api/badges"; +import BadgeAPIPlugin from "@plugins/_api/badges"; import { ComponentType, HTMLProps } from "react"; export const enum BadgePosition { diff --git a/src/plugins/index.ts b/src/api/PluginManager.ts similarity index 77% rename from src/plugins/index.ts rename to src/api/PluginManager.ts index 5bb60a13a..110976787 100644 --- a/src/plugins/index.ts +++ b/src/api/PluginManager.ts @@ -28,6 +28,7 @@ import { addMessagePopoverButton, removeMessagePopoverButton } from "@api/Messag import { Settings, SettingsStore } from "@api/Settings"; import { disableStyle, enableStyle } from "@api/Styles"; import { Logger } from "@utils/Logger"; +import { onlyOnce } from "@utils/onlyOnce"; import { canonicalizeFind, canonicalizeReplacement } from "@utils/patches"; import { Patch, Plugin, PluginDef, ReporterTestable, StartAt } from "@utils/types"; import { FluxEvents } from "@vencord/discord-types"; @@ -35,27 +36,23 @@ import { FluxDispatcher } from "@webpack/common"; 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; -export const plugins = Plugins; -export { patches }; /** Whether we have subscribed to flux events of all the enabled plugins when FluxDispatcher was ready */ let enabledPluginsSubscribedFlux = false; const subscribedFluxEventsPlugins = new Set(); -const pluginsValues = Object.values(Plugins); -const settings = Settings.plugins; - export function isPluginEnabled(p: string) { return ( Plugins[p]?.required || Plugins[p]?.isDependency || - settings[p]?.enabled + Settings.plugins[p]?.enabled ) ?? false; } @@ -94,85 +91,6 @@ function isReporterTestable(p: Plugin, part: ReporterTestable) { : (p.reporterTestable & part) === part; } -const pluginKeysToBind: Array = [ - "onBeforeMessageEdit", "onBeforeMessageSend", "onMessageClick", - "renderChatBarButton", "renderMemberListDecorator", "renderMessageAccessory", "renderMessageDecoration", "renderMessagePopoverButton" -]; - -const neededApiPlugins = new Set(); - -// First round-trip to mark and force enable dependencies -// -// FIXME: might need to revisit this if there's ever nested (dependencies of dependencies) dependencies since this only -// goes for the top level and their children, but for now this works okay with the current API plugins -for (const p of pluginsValues) if (isPluginEnabled(p.name)) { - p.dependencies?.forEach(d => { - const dep = Plugins[d]; - - if (!dep) { - const error = new Error(`Plugin ${p.name} has unresolved dependency ${d}`); - - if (IS_DEV) { - throw error; - } - - logger.warn(error); - return; - } - - settings[d].enabled = true; - dep.isDependency = true; - }); - - if (p.commands?.length) neededApiPlugins.add("CommandsAPI"); - if (p.onBeforeMessageEdit || p.onBeforeMessageSend || p.onMessageClick) neededApiPlugins.add("MessageEventsAPI"); - if (p.renderChatBarButton) neededApiPlugins.add("ChatInputButtonAPI"); - if (p.renderMemberListDecorator) neededApiPlugins.add("MemberListDecoratorsAPI"); - if (p.renderMessageAccessory) neededApiPlugins.add("MessageAccessoriesAPI"); - if (p.renderMessageDecoration) neededApiPlugins.add("MessageDecorationsAPI"); - if (p.renderMessagePopoverButton) neededApiPlugins.add("MessagePopoverAPI"); - if (p.userProfileBadge) neededApiPlugins.add("BadgeAPI"); - - for (const key of pluginKeysToBind) { - p[key] &&= p[key].bind(p) as any; - } -} - -for (const p of neededApiPlugins) { - Plugins[p].isDependency = true; - settings[p].enabled = true; -} - -for (const p of pluginsValues) { - if (p.settings) { - p.options ??= {}; - - p.settings.pluginName = p.name; - for (const name in p.settings.def) { - const def = p.settings.def[name]; - const checks = p.settings.checks?.[name]; - p.options[name] = { ...def, ...checks }; - } - } - - if (p.options) { - for (const name in p.options) { - const opt = p.options[name]; - if (opt.onChange != null) { - SettingsStore.addChangeListener(`plugins.${p.name}.${name}`, opt.onChange); - } - } - } - - if (p.patches && isPluginEnabled(p.name)) { - if (!IS_REPORTER || isReporterTestable(p, ReporterTestable.Patches)) { - for (const patch of p.patches) { - addPatch(patch, p.name); - } - } - } -} - export const startAllPlugins = traceFunction("startAllPlugins", function startAllPlugins(target: StartAt) { logger.info(`Starting plugins (stage ${target})`); for (const name in Plugins) { @@ -188,6 +106,7 @@ export const startAllPlugins = traceFunction("startAllPlugins", function startAl }); export function startDependenciesRecursive(p: Plugin) { + const settings = Settings.plugins; let restartNeeded = false; const failures: string[] = []; @@ -379,3 +298,87 @@ export const stopPlugin = traceFunction("stopPlugin", function stopPlugin(p: Plu return true; }, p => `stopPlugin ${p.name}`); + +export const initPluginManager = onlyOnce(function init() { + const pluginsValues = Object.values(Plugins); + const settings = Settings.plugins; + + const pluginKeysToBind: Array = [ + "onBeforeMessageEdit", "onBeforeMessageSend", "onMessageClick", + "renderChatBarButton", "renderMemberListDecorator", "renderMessageAccessory", "renderMessageDecoration", "renderMessagePopoverButton" + ]; + + const neededApiPlugins = new Set(); + + // First round-trip to mark and force enable dependencies + // + // FIXME: might need to revisit this if there's ever nested (dependencies of dependencies) dependencies since this only + // goes for the top level and their children, but for now this works okay with the current API plugins + for (const p of pluginsValues) if (isPluginEnabled(p.name)) { + p.dependencies?.forEach(d => { + const dep = Plugins[d]; + + if (!dep) { + const error = new Error(`Plugin ${p.name} has unresolved dependency ${d}`); + + if (IS_DEV) { + throw error; + } + + logger.warn(error); + return; + } + + settings[d].enabled = true; + dep.isDependency = true; + }); + + if (p.commands?.length) neededApiPlugins.add("CommandsAPI"); + if (p.onBeforeMessageEdit || p.onBeforeMessageSend || p.onMessageClick) neededApiPlugins.add("MessageEventsAPI"); + if (p.renderChatBarButton) neededApiPlugins.add("ChatInputButtonAPI"); + if (p.renderMemberListDecorator) neededApiPlugins.add("MemberListDecoratorsAPI"); + if (p.renderMessageAccessory) neededApiPlugins.add("MessageAccessoriesAPI"); + if (p.renderMessageDecoration) neededApiPlugins.add("MessageDecorationsAPI"); + if (p.renderMessagePopoverButton) neededApiPlugins.add("MessagePopoverAPI"); + if (p.userProfileBadge) neededApiPlugins.add("BadgeAPI"); + + for (const key of pluginKeysToBind) { + p[key] &&= p[key].bind(p) as any; + } + } + + for (const p of neededApiPlugins) { + Plugins[p].isDependency = true; + settings[p].enabled = true; + } + + for (const p of pluginsValues) { + if (p.settings) { + p.options ??= {}; + + p.settings.pluginName = p.name; + for (const name in p.settings.def) { + const def = p.settings.def[name]; + const checks = p.settings.checks?.[name]; + p.options[name] = { ...def, ...checks }; + } + } + + if (p.options) { + for (const name in p.options) { + const opt = p.options[name]; + if (opt.onChange != null) { + SettingsStore.addChangeListener(`plugins.${p.name}.${name}`, opt.onChange); + } + } + } + + if (p.patches && isPluginEnabled(p.name)) { + if (!IS_REPORTER || isReporterTestable(p, ReporterTestable.Patches)) { + for (const patch of p.patches) { + addPatch(patch, p.name); + } + } + } + } +}); diff --git a/src/api/Settings.ts b/src/api/Settings.ts index 5c8965bfc..b4c2f770f 100644 --- a/src/api/Settings.ts +++ b/src/api/Settings.ts @@ -16,12 +16,9 @@ * along with this program. If not, see . */ -import { debounce } from "@shared/debounce"; import { SettingsStore as SettingsStoreClass } from "@shared/SettingsStore"; -import { localStorage } from "@utils/localStorage"; import { Logger } from "@utils/Logger"; import { mergeDefaults } from "@utils/mergeDefaults"; -import { putCloudSettings } from "@utils/settingsSync"; import { DefinedSettings, OptionType, SettingsChecks, SettingsDefinition } from "@utils/types"; import { React, useEffect } from "@webpack/common"; @@ -111,14 +108,6 @@ const DefaultSettings: Settings = { const settings = !IS_REPORTER ? VencordNative.settings.get() : {} as Settings; mergeDefaults(settings, DefaultSettings); -const saveSettingsOnFrequentAction = debounce(async () => { - if (Settings.cloud.settingsSync && Settings.cloud.authenticated) { - await putCloudSettings(); - delete localStorage.Vencord_settingsDirty; - } -}, 60_000); - - export const SettingsStore = new SettingsStoreClass(settings, { readOnly: true, getDefaultValue({ @@ -161,8 +150,6 @@ export const SettingsStore = new SettingsStoreClass(settings, { if (!IS_REPORTER) { SettingsStore.addGlobalChangeListener((_, path) => { SettingsStore.plain.cloud.settingsSyncVersion = Date.now(); - localStorage.Vencord_settingsDirty = true; - saveSettingsOnFrequentAction(); VencordNative.settings.set(SettingsStore.plain, path); }); } diff --git a/src/utils/cloud.tsx b/src/api/SettingsSync/cloudSetup.tsx similarity index 81% rename from src/utils/cloud.tsx rename to src/api/SettingsSync/cloudSetup.tsx index 3b482d4d8..8e77d5fbd 100644 --- a/src/utils/cloud.tsx +++ b/src/api/SettingsSync/cloudSetup.tsx @@ -1,31 +1,18 @@ /* - * Vencord, a modification for Discord's desktop app - * Copyright (c) 2023 Vendicated and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . -*/ + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ import * as DataStore from "@api/DataStore"; import { showNotification } from "@api/Notifications"; import { Settings } from "@api/Settings"; +import { Logger } from "@utils/Logger"; +import { openModal } from "@utils/modal"; +import { relaunch } from "@utils/native"; import { Alerts, OAuth2AuthorizeModal, UserStore } from "@webpack/common"; -import { Logger } from "./Logger"; -import { openModal } from "./modal"; -import { relaunch } from "./native"; - -export const cloudLogger = new Logger("Cloud", "#39b7e0"); +export const logger = new Logger("SettingsSync:CloudSetup", "#39b7e0"); export const getCloudUrl = () => new URL(Settings.cloud.url); const getCloudUrlOrigin = () => getCloudUrl().origin; @@ -137,7 +124,7 @@ export async function authorizeCloud() { }); const { secret } = await res.json(); if (secret) { - cloudLogger.info("Authorized with secret"); + logger.info("Authorized with secret"); await setAuthorization(secret); showNotification({ title: "Cloud Integration", @@ -152,7 +139,7 @@ export async function authorizeCloud() { Settings.cloud.authenticated = false; } } catch (e: any) { - cloudLogger.error("Failed to authorize", e); + logger.error("Failed to authorize", e); showNotification({ title: "Cloud Integration", body: `Setup failed (${e.toString()}).` diff --git a/src/utils/settingsSync.ts b/src/api/SettingsSync/cloudSync.ts similarity index 53% rename from src/utils/settingsSync.ts rename to src/api/SettingsSync/cloudSync.ts index c711aacd5..3784e3e50 100644 --- a/src/utils/settingsSync.ts +++ b/src/api/SettingsSync/cloudSync.ts @@ -1,116 +1,19 @@ /* - * Vencord, a modification for Discord's desktop app - * Copyright (c) 2022 Vendicated and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . -*/ + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ import { showNotification } from "@api/Notifications"; import { PlainSettings, Settings } from "@api/Settings"; -import { moment, Toasts } from "@webpack/common"; +import { Logger } from "@utils/Logger"; +import { relaunch } from "@utils/native"; import { deflateSync, inflateSync } from "fflate"; -import { checkCloudUrlCsp, getCloudAuth, getCloudUrl } from "./cloud"; -import { Logger } from "./Logger"; -import { relaunch } from "./native"; -import { chooseFile, saveFile } from "./web"; +import { checkCloudUrlCsp, deauthorizeCloud, getCloudAuth, getCloudUrl } from "./cloudSetup"; +import { exportSettings, importSettings } from "./offline"; -export async function importSettings(data: string) { - try { - var parsed = JSON.parse(data); - } catch (err) { - console.log(data); - throw new Error("Failed to parse JSON: " + String(err)); - } - - if ("settings" in parsed && "quickCss" in parsed) { - Object.assign(PlainSettings, parsed.settings); - await VencordNative.settings.set(parsed.settings); - await VencordNative.quickCss.set(parsed.quickCss); - } else - throw new Error("Invalid Settings. Is this even a Vencord Settings file?"); -} - -export async function exportSettings({ minify }: { minify?: boolean; } = {}) { - const settings = VencordNative.settings.get(); - const quickCss = await VencordNative.quickCss.get(); - return JSON.stringify({ settings, quickCss }, null, minify ? undefined : 4); -} - -export async function downloadSettingsBackup() { - const filename = `vencord-settings-backup-${moment().format("YYYY-MM-DD")}.json`; - const backup = await exportSettings(); - const data = new TextEncoder().encode(backup); - - if (IS_DISCORD_DESKTOP) { - DiscordNative.fileManager.saveWithDialog(data, filename); - } else { - saveFile(new File([data], filename, { type: "application/json" })); - } -} - -const toast = (type: string, message: string) => - Toasts.show({ - type, - message, - id: Toasts.genId() - }); - -const toastSuccess = () => - toast(Toasts.Type.SUCCESS, "Settings successfully imported. Restart to apply changes!"); - -const toastFailure = (err: any) => - toast(Toasts.Type.FAILURE, `Failed to import settings: ${String(err)}`); - -export async function uploadSettingsBackup(showToast = true): Promise { - if (IS_DISCORD_DESKTOP) { - const [file] = await DiscordNative.fileManager.openFiles({ - filters: [ - { name: "Vencord Settings Backup", extensions: ["json"] }, - { name: "all", extensions: ["*"] } - ] - }); - - if (file) { - try { - await importSettings(new TextDecoder().decode(file.data)); - if (showToast) toastSuccess(); - } catch (err) { - new Logger("SettingsSync").error(err); - if (showToast) toastFailure(err); - } - } - } else { - const file = await chooseFile("application/json"); - if (!file) return; - - const reader = new FileReader(); - reader.onload = async () => { - try { - await importSettings(reader.result as string); - if (showToast) toastSuccess(); - } catch (err) { - new Logger("SettingsSync").error(err); - if (showToast) toastFailure(err); - } - }; - reader.readAsText(file); - } -} - -// Cloud settings -const cloudSettingsLogger = new Logger("Cloud:Settings", "#39b7e0"); +const logger = new Logger("SettingsSync:Cloud", "#39b7e0"); export async function putCloudSettings(manual?: boolean) { const settings = await exportSettings({ minify: true }); @@ -124,11 +27,11 @@ export async function putCloudSettings(manual?: boolean) { Authorization: await getCloudAuth(), "Content-Type": "application/octet-stream" }, - body: deflateSync(new TextEncoder().encode(settings)) + body: deflateSync(new TextEncoder().encode(settings)) as Uint8Array }); if (!res.ok) { - cloudSettingsLogger.error(`Failed to sync up, API returned ${res.status}`); + logger.error(`Failed to sync up, API returned ${res.status}`); showNotification({ title: "Cloud Settings", body: `Could not synchronize settings to cloud (API returned ${res.status}).`, @@ -141,7 +44,7 @@ export async function putCloudSettings(manual?: boolean) { PlainSettings.cloud.settingsSyncVersion = written; VencordNative.settings.set(PlainSettings); - cloudSettingsLogger.info("Settings uploaded to cloud successfully"); + logger.info("Settings uploaded to cloud successfully"); if (manual) { showNotification({ @@ -151,7 +54,7 @@ export async function putCloudSettings(manual?: boolean) { }); } } catch (e: any) { - cloudSettingsLogger.error("Failed to sync up", e); + logger.error("Failed to sync up", e); showNotification({ title: "Cloud Settings", body: `Could not synchronize settings to the cloud (${e.toString()}).`, @@ -174,7 +77,7 @@ export async function getCloudSettings(shouldNotify = true, force = false) { }); if (res.status === 404) { - cloudSettingsLogger.info("No settings on the cloud"); + logger.info("No settings on the cloud"); if (shouldNotify) showNotification({ title: "Cloud Settings", @@ -185,7 +88,7 @@ export async function getCloudSettings(shouldNotify = true, force = false) { } if (res.status === 304) { - cloudSettingsLogger.info("Settings up to date"); + logger.info("Settings up to date"); if (shouldNotify) showNotification({ title: "Cloud Settings", @@ -196,7 +99,7 @@ export async function getCloudSettings(shouldNotify = true, force = false) { } if (!res.ok) { - cloudSettingsLogger.error(`Failed to sync down, API returned ${res.status}`); + logger.error(`Failed to sync down, API returned ${res.status}`); showNotification({ title: "Cloud Settings", body: `Could not synchronize settings from the cloud (API returned ${res.status}).`, @@ -228,7 +131,7 @@ export async function getCloudSettings(shouldNotify = true, force = false) { PlainSettings.cloud.settingsSyncVersion = written; VencordNative.settings.set(PlainSettings); - cloudSettingsLogger.info("Settings loaded from cloud successfully"); + logger.info("Settings loaded from cloud successfully"); if (shouldNotify) showNotification({ title: "Cloud Settings", @@ -240,7 +143,7 @@ export async function getCloudSettings(shouldNotify = true, force = false) { return true; } catch (e: any) { - cloudSettingsLogger.error("Failed to sync down", e); + logger.error("Failed to sync down", e); showNotification({ title: "Cloud Settings", body: `Could not synchronize settings from the cloud (${e.toString()}).`, @@ -261,7 +164,7 @@ export async function deleteCloudSettings() { }); if (!res.ok) { - cloudSettingsLogger.error(`Failed to delete, API returned ${res.status}`); + logger.error(`Failed to delete, API returned ${res.status}`); showNotification({ title: "Cloud Settings", body: `Could not delete settings (API returned ${res.status}).`, @@ -270,14 +173,14 @@ export async function deleteCloudSettings() { return; } - cloudSettingsLogger.info("Settings deleted from cloud successfully"); + logger.info("Settings deleted from cloud successfully"); showNotification({ title: "Cloud Settings", body: "Settings deleted from cloud!", color: "var(--green-360)" }); } catch (e: any) { - cloudSettingsLogger.error("Failed to delete", e); + logger.error("Failed to delete", e); showNotification({ title: "Cloud Settings", body: `Could not delete settings (${e.toString()}).`, @@ -285,3 +188,31 @@ export async function deleteCloudSettings() { }); } } + +export async function eraseAllCloudData() { + if (!await checkCloudUrlCsp()) return; + + const res = await fetch(new URL("/v1/", getCloudUrl()), { + method: "DELETE", + headers: { Authorization: await getCloudAuth() } + }); + + if (!res.ok) { + logger.error(`Failed to erase data, API returned ${res.status}`); + showNotification({ + title: "Cloud Integrations", + body: `Could not erase all data (API returned ${res.status}), please contact support.`, + color: "var(--red-360)" + }); + return; + } + + Settings.cloud.authenticated = false; + await deauthorizeCloud(); + + showNotification({ + title: "Cloud Integrations", + body: "Successfully erased all data.", + color: "var(--green-360)" + }); +} diff --git a/src/api/SettingsSync/offline.ts b/src/api/SettingsSync/offline.ts new file mode 100644 index 000000000..aced11e81 --- /dev/null +++ b/src/api/SettingsSync/offline.ts @@ -0,0 +1,95 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2025 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { PlainSettings } from "@api/Settings"; +import { Logger } from "@utils/Logger"; +import { chooseFile, saveFile } from "@utils/web"; +import { moment, Toasts } from "@webpack/common"; + +const toast = (type: string, message: string) => + Toasts.show({ + type, + message, + id: Toasts.genId() + }); + +const toastSuccess = () => + toast(Toasts.Type.SUCCESS, "Settings successfully imported. Restart to apply changes!"); + +const toastFailure = (err: any) => + toast(Toasts.Type.FAILURE, `Failed to import settings: ${String(err)}`); + +const logger = new Logger("SettingsSync:Offline", "#39b7e0"); + +export async function importSettings(data: string) { + try { + var parsed = JSON.parse(data); + } catch (err) { + console.log(data); + throw new Error("Failed to parse JSON: " + String(err)); + } + + if ("settings" in parsed && "quickCss" in parsed) { + Object.assign(PlainSettings, parsed.settings); + await VencordNative.settings.set(parsed.settings); + await VencordNative.quickCss.set(parsed.quickCss); + } else + throw new Error("Invalid Settings. Is this even a Vencord Settings file?"); +} + +export async function exportSettings({ minify }: { minify?: boolean; } = {}) { + const settings = VencordNative.settings.get(); + const quickCss = await VencordNative.quickCss.get(); + return JSON.stringify({ settings, quickCss }, null, minify ? undefined : 4); +} + +export async function downloadSettingsBackup() { + const filename = `vencord-settings-backup-${moment().format("YYYY-MM-DD")}.json`; + const backup = await exportSettings(); + const data = new TextEncoder().encode(backup); + + if (IS_DISCORD_DESKTOP) { + DiscordNative.fileManager.saveWithDialog(data, filename); + } else { + saveFile(new File([data], filename, { type: "application/json" })); + } +} + +export async function uploadSettingsBackup(showToast = true): Promise { + if (IS_DISCORD_DESKTOP) { + const [file] = await DiscordNative.fileManager.openFiles({ + filters: [ + { name: "Vencord Settings Backup", extensions: ["json"] }, + { name: "all", extensions: ["*"] } + ] + }); + + if (file) { + try { + await importSettings(new TextDecoder().decode(file.data)); + if (showToast) toastSuccess(); + } catch (err) { + logger.error(err); + if (showToast) toastFailure(err); + } + } + } else { + const file = await chooseFile("application/json"); + if (!file) return; + + const reader = new FileReader(); + reader.onload = async () => { + try { + await importSettings(reader.result as string); + if (showToast) toastSuccess(); + } catch (err) { + logger.error(err); + if (showToast) toastFailure(err); + } + }; + reader.readAsText(file); + } +} diff --git a/src/utils/quickCss.ts b/src/api/Themes.ts similarity index 88% rename from src/utils/quickCss.ts rename to src/api/Themes.ts index 689699203..9fdfdba5f 100644 --- a/src/utils/quickCss.ts +++ b/src/api/Themes.ts @@ -17,9 +17,8 @@ */ import { Settings, SettingsStore } from "@api/Settings"; -import { ThemeStore } from "@webpack/common"; - -import { createAndAppendStyle } from "./css"; +import { createAndAppendStyle } from "@utils/css"; +import { ThemeStore } from "@vencord/discord-types"; let style: HTMLStyleElement; let themesStyle: HTMLStyleElement; @@ -54,6 +53,8 @@ async function initThemes() { const { themeLinks, enabledThemes } = Settings; + const { ThemeStore } = require("@webpack/common/stores") as typeof import("@webpack/common/stores"); + // "darker" and "midnight" both count as dark // This function is first called on DOMContentLoaded, so ThemeStore may not have been loaded yet const activeTheme = ThemeStore == null @@ -102,16 +103,16 @@ document.addEventListener("DOMContentLoaded", () => { } }, { once: true }); -export function initQuickCssThemeStore() { +export function initQuickCssThemeStore(themeStore: ThemeStore) { if (IS_USERSCRIPT) return; initThemes(); - let currentTheme = ThemeStore.theme; - ThemeStore.addChangeListener(() => { - if (currentTheme === ThemeStore.theme) return; + let currentTheme = themeStore.theme; + themeStore.addChangeListener(() => { + if (currentTheme === themeStore.theme) return; - currentTheme = ThemeStore.theme; + currentTheme = themeStore.theme; initThemes(); }); } diff --git a/src/api/UserSettings.ts b/src/api/UserSettings.ts index 4de92a81a..9d68c1319 100644 --- a/src/api/UserSettings.ts +++ b/src/api/UserSettings.ts @@ -20,6 +20,8 @@ import { proxyLazy } from "@utils/lazy"; import { Logger } from "@utils/Logger"; import { findModuleId, proxyLazyWebpack, wreq } from "@webpack"; +import { isPluginEnabled } from "./PluginManager"; + interface UserSettingDefinition { /** * Get the setting value @@ -45,7 +47,7 @@ interface UserSettingDefinition { export const UserSettings: Record> | undefined = proxyLazyWebpack(() => { const modId = findModuleId('"textAndImages","renderSpoilers"'); - if (modId == null) return new Logger("UserSettingsAPI ").error("Didn't find settings module."); + if (modId == null) return new Logger("UserSettingsAPI").error("Didn't find settings module."); return wreq(modId as any); }); @@ -57,7 +59,7 @@ export const UserSettings: Record> | und * @param name The name of the setting */ export function getUserSetting(group: string, name: string): UserSettingDefinition | undefined { - if (!Vencord.Plugins.isPluginEnabled("UserSettingsAPI")) throw new Error("Cannot use UserSettingsAPI without setting as dependency."); + if (!isPluginEnabled("UserSettingsAPI")) throw new Error("Cannot use UserSettingsAPI without setting it as a dependency."); for (const key in UserSettings) { const userSetting = UserSettings[key]; diff --git a/src/api/index.ts b/src/api/index.ts index d4d7b4614..98d66db0d 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -29,9 +29,11 @@ import * as $MessagePopover from "./MessagePopover"; import * as $MessageUpdater from "./MessageUpdater"; import * as $Notices from "./Notices"; import * as $Notifications from "./Notifications"; +export * as PluginManager from "./PluginManager"; import * as $ServerList from "./ServerList"; import * as $Settings from "./Settings"; import * as $Styles from "./Styles"; +import * as $Themes from "./Themes"; import * as $UserSettings from "./UserSettings"; /** @@ -122,3 +124,8 @@ export const MessageUpdater = $MessageUpdater; * An API allowing you to get an user setting */ export const UserSettings = $UserSettings; + +/** + * Don't use this + */ +export const Themes = $Themes; diff --git a/src/components/settings/tabs/patchHelper/index.tsx b/src/components/settings/tabs/patchHelper/index.tsx index 17412bd08..2d33a0293 100644 --- a/src/components/settings/tabs/patchHelper/index.tsx +++ b/src/components/settings/tabs/patchHelper/index.tsx @@ -22,8 +22,8 @@ import { Flex } from "@components/Flex"; import { HeadingTertiary } from "@components/Heading"; import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab"; import { debounce } from "@shared/debounce"; +import { copyWithToast } from "@utils/discord"; import { Margins } from "@utils/margins"; -import { copyWithToast } from "@utils/misc"; import { stripIndent } from "@utils/text"; import { ReplaceFn } from "@utils/types"; import { search } from "@webpack"; diff --git a/src/components/settings/tabs/plugins/PluginCard.tsx b/src/components/settings/tabs/plugins/PluginCard.tsx index da8696d5c..a0c9cbc41 100644 --- a/src/components/settings/tabs/plugins/PluginCard.tsx +++ b/src/components/settings/tabs/plugins/PluginCard.tsx @@ -5,9 +5,9 @@ */ import { showNotice } from "@api/Notices"; +import { isPluginEnabled, startDependenciesRecursive, startPlugin, stopPlugin } from "@api/PluginManager"; import { CogWheel, InfoIcon } from "@components/Icons"; import { AddonCard } from "@components/settings/AddonCard"; -import { proxyLazy } from "@utils/lazy"; import { isObjectEmpty } from "@utils/misc"; import { Plugin } from "@utils/types"; import { React, showToast, Toasts } from "@webpack/common"; @@ -16,9 +16,6 @@ import { Settings } from "Vencord"; import { cl, logger } from "."; import { openPluginModal } from "./PluginModal"; -// Avoid circular dependency -const { startDependenciesRecursive, startPlugin, stopPlugin, isPluginEnabled } = proxyLazy(() => require("plugins") as typeof import("plugins")); - interface PluginCardProps extends React.HTMLProps { plugin: Plugin; disabled: boolean; diff --git a/src/components/settings/tabs/plugins/index.tsx b/src/components/settings/tabs/plugins/index.tsx index b9e721f12..cb8776ae3 100644 --- a/src/components/settings/tabs/plugins/index.tsx +++ b/src/components/settings/tabs/plugins/index.tsx @@ -19,6 +19,7 @@ import "./styles.css"; import * as DataStore from "@api/DataStore"; +import { isPluginEnabled } from "@api/PluginManager"; import { useSettings } from "@api/Settings"; import { classNameFactory } from "@api/Styles"; import { Divider } from "@components/Divider"; @@ -157,7 +158,7 @@ function PluginSettings() { const pluginFilter = (plugin: typeof Plugins[keyof typeof Plugins]) => { const { status } = searchValue; - const enabled = Vencord.Plugins.isPluginEnabled(plugin.name); + const enabled = isPluginEnabled(plugin.name); switch (status) { case SearchStatus.DISABLED: diff --git a/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx b/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx index 077b87923..2356c4c26 100644 --- a/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx +++ b/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx @@ -16,11 +16,11 @@ * along with this program. If not, see . */ +import { downloadSettingsBackup, uploadSettingsBackup } from "@api/SettingsSync/offline"; import { Flex } from "@components/Flex"; import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab"; import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; -import { downloadSettingsBackup, uploadSettingsBackup } from "@utils/settingsSync"; import { Button, Card, Text } from "@webpack/common"; function BackupAndRestoreTab() { diff --git a/src/components/settings/tabs/sync/CloudTab.tsx b/src/components/settings/tabs/sync/CloudTab.tsx index 175e76efc..73526bcdb 100644 --- a/src/components/settings/tabs/sync/CloudTab.tsx +++ b/src/components/settings/tabs/sync/CloudTab.tsx @@ -16,8 +16,9 @@ * along with this program. If not, see . */ -import { showNotification } from "@api/Notifications"; -import { Settings, useSettings } from "@api/Settings"; +import { useSettings } from "@api/Settings"; +import { authorizeCloud, deauthorizeCloud } from "@api/SettingsSync/cloudSetup"; +import { deleteCloudSettings, eraseAllCloudData, getCloudSettings, putCloudSettings } from "@api/SettingsSync/cloudSync"; import { CheckedTextInput } from "@components/CheckedTextInput"; import { Divider } from "@components/Divider"; import { FormSwitch } from "@components/FormSwitch"; @@ -25,9 +26,7 @@ import { Grid } from "@components/Grid"; import { Link } from "@components/Link"; import { Paragraph } from "@components/Paragraph"; import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab"; -import { authorizeCloud, checkCloudUrlCsp, cloudLogger, deauthorizeCloud, getCloudAuth, getCloudUrl } from "@utils/cloud"; import { Margins } from "@utils/margins"; -import { deleteCloudSettings, getCloudSettings, putCloudSettings } from "@utils/settingsSync"; import { Alerts, Button, Forms, Tooltip } from "@webpack/common"; function validateUrl(url: string) { @@ -39,34 +38,6 @@ function validateUrl(url: string) { } } -async function eraseAllData() { - if (!await checkCloudUrlCsp()) return; - - const res = await fetch(new URL("/v1/", getCloudUrl()), { - method: "DELETE", - headers: { Authorization: await getCloudAuth() } - }); - - if (!res.ok) { - cloudLogger.error(`Failed to erase data, API returned ${res.status}`); - showNotification({ - title: "Cloud Integrations", - body: `Could not erase all data (API returned ${res.status}), please contact support.`, - color: "var(--red-360)" - }); - return; - } - - Settings.cloud.authenticated = false; - await deauthorizeCloud(); - - showNotification({ - title: "Cloud Integrations", - body: "Successfully erased all data.", - color: "var(--green-360)" - }); -} - function SettingsSyncSection() { const { cloud } = useSettings(["cloud.authenticated", "cloud.settingsSync"]); const sectionEnabled = cloud.authenticated && cloud.settingsSync; @@ -181,7 +152,7 @@ function CloudTab() { onClick={() => Alerts.show({ title: "Are you sure?", body: "Once your data is erased, we cannot recover it. There's no going back!", - onConfirm: eraseAllData, + onConfirm: eraseAllCloudData, confirmText: "Erase it!", confirmColor: "vc-cloud-erase-data-danger-btn", cancelText: "Nevermind" diff --git a/src/components/settings/tabs/themes/LocalThemesTab.tsx b/src/components/settings/tabs/themes/LocalThemesTab.tsx index a958ab77a..cea4d7306 100644 --- a/src/components/settings/tabs/themes/LocalThemesTab.tsx +++ b/src/components/settings/tabs/themes/LocalThemesTab.tsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { isPluginEnabled } from "@api/PluginManager"; import { Settings, useSettings } from "@api/Settings"; import { classNameFactory } from "@api/Styles"; import { FolderIcon, PaintbrushIcon, PencilIcon, PlusIcon, RestartIcon } from "@components/Icons"; @@ -11,9 +12,9 @@ import { Link } from "@components/Link"; import { QuickAction, QuickActionCard } from "@components/settings/QuickAction"; import { openPluginModal } from "@components/settings/tabs/plugins/PluginModal"; import { UserThemeHeader } from "@main/themes"; +import ClientThemePlugin from "@plugins/clientTheme"; import { findLazy } from "@webpack"; import { Card, Forms, useEffect, useRef, useState } from "@webpack/common"; -import ClientThemePlugin from "plugins/clientTheme"; import type { ComponentType, Ref, SyntheticEvent } from "react"; import { ThemeCard } from "./ThemeCard"; @@ -140,7 +141,7 @@ export function LocalThemesTab() { Icon={PaintbrushIcon} /> - {Vencord.Plugins.isPluginEnabled(ClientThemePlugin.name) && ( + {isPluginEnabled(ClientThemePlugin.name) && ( openPluginModal(ClientThemePlugin)} diff --git a/src/components/settings/tabs/vencord/DonateButton.tsx b/src/components/settings/tabs/vencord/DonateButton.tsx index b9910e662..149753777 100644 --- a/src/components/settings/tabs/vencord/DonateButton.tsx +++ b/src/components/settings/tabs/vencord/DonateButton.tsx @@ -5,9 +5,9 @@ */ import DonateButton from "@components/settings/DonateButton"; +import BadgeAPI from "@plugins/_api/badges"; import { DONOR_ROLE_ID, VENCORD_GUILD_ID } from "@utils/constants"; import { Button, GuildMemberStore } from "@webpack/common"; -import BadgeAPI from "plugins/_api/badges"; export const isDonor = (userId: string) => !!( BadgeAPI.getDonorBadges(userId)?.length > 0 diff --git a/src/components/settings/tabs/vencord/index.tsx b/src/components/settings/tabs/vencord/index.tsx index d02f978d9..a4d637476 100644 --- a/src/components/settings/tabs/vencord/index.tsx +++ b/src/components/settings/tabs/vencord/index.tsx @@ -20,7 +20,7 @@ import { openNotificationLogModal } from "@api/Notifications/notificationLog"; import { useSettings } from "@api/Settings"; import { Divider } from "@components/Divider"; import { FormSwitch } from "@components/FormSwitch"; -import { FolderIcon, GithubIcon, LogIcon, PaintbrushIcon, RestartIcon } from "@components/index"; +import { FolderIcon, GithubIcon, LogIcon, PaintbrushIcon, RestartIcon } from "@components/Icons"; import { QuickAction, QuickActionCard } from "@components/settings/QuickAction"; import { SpecialCard } from "@components/settings/SpecialCard"; import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab"; diff --git a/src/debug/runReporter.ts b/src/debug/runReporter.ts index 39071a0c4..529123cd2 100644 --- a/src/debug/runReporter.ts +++ b/src/debug/runReporter.ts @@ -4,11 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { addPatch } from "@api/PluginManager"; import { Logger } from "@utils/Logger"; import * as Webpack from "@webpack"; -import { getBuildNumber, patchTimings } from "@webpack/patcher"; +import { getBuildNumber, patches, patchTimings } from "@webpack/patcher"; -import { addPatch, patches } from "../plugins"; import { loadLazyChunks } from "./loadLazyChunks"; async function runReporter() { diff --git a/src/plugins/_api/badges/index.tsx b/src/plugins/_api/badges/index.tsx index 4c346689f..d3109b75f 100644 --- a/src/plugins/_api/badges/index.tsx +++ b/src/plugins/_api/badges/index.tsx @@ -25,9 +25,10 @@ import { Heart } from "@components/Heart"; import DonateButton from "@components/settings/DonateButton"; import { openContributorModal } from "@components/settings/tabs"; import { Devs } from "@utils/constants"; +import { copyWithToast } from "@utils/discord"; import { Logger } from "@utils/Logger"; import { Margins } from "@utils/margins"; -import { copyWithToast, shouldShowContributorBadge } from "@utils/misc"; +import { shouldShowContributorBadge } from "@utils/misc"; import { closeModal, ModalContent, ModalFooter, ModalHeader, ModalRoot, openModal } from "@utils/modal"; import definePlugin from "@utils/types"; import { User } from "@vencord/discord-types"; diff --git a/src/plugins/_core/supportHelper.tsx b/src/plugins/_core/supportHelper.tsx index cdae5a3ad..b72050bf9 100644 --- a/src/plugins/_core/supportHelper.tsx +++ b/src/plugins/_core/supportHelper.tsx @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import { isPluginEnabled } from "@api/PluginManager"; import { definePluginSettings } from "@api/Settings"; import { getUserSettingLazy } from "@api/UserSettings"; import ErrorBoundary from "@components/ErrorBoundary"; @@ -95,7 +96,6 @@ async function generateDebugInfoMessage() { } const commonIssues = { - "NoRPC enabled": Vencord.Plugins.isPluginEnabled("NoRPC"), "Activity Sharing disabled": tryOrElse(() => !ShowCurrentGame.getSetting(), false), "Vencord DevBuild": !IS_STANDALONE, "Has UserPlugins": Object.values(PluginMeta).some(m => m.userPlugin), @@ -114,7 +114,7 @@ function generatePluginList() { const isApiPlugin = (plugin: string) => plugin.endsWith("API") || plugins[plugin].required; const enabledPlugins = Object.keys(plugins) - .filter(p => Vencord.Plugins.isPluginEnabled(p) && !isApiPlugin(p)); + .filter(p => isPluginEnabled(p) && !isApiPlugin(p)); const enabledStockPlugins = enabledPlugins.filter(p => !PluginMeta[p].userPlugin); const enabledUserPlugins = enabledPlugins.filter(p => PluginMeta[p].userPlugin); diff --git a/src/plugins/betterRoleDot/index.ts b/src/plugins/betterRoleDot/index.ts index bdafe02c9..9928a2a42 100644 --- a/src/plugins/betterRoleDot/index.ts +++ b/src/plugins/betterRoleDot/index.ts @@ -18,7 +18,7 @@ import { Settings } from "@api/Settings"; import { Devs } from "@utils/constants"; -import { copyWithToast } from "@utils/misc"; +import { copyWithToast } from "@utils/discord"; import definePlugin, { OptionType } from "@utils/types"; export default definePlugin({ diff --git a/src/plugins/betterSessions/components/RenameButton.tsx b/src/plugins/betterSessions/components/RenameButton.tsx index 4fd81f1fb..b9857f01d 100644 --- a/src/plugins/betterSessions/components/RenameButton.tsx +++ b/src/plugins/betterSessions/components/RenameButton.tsx @@ -5,9 +5,9 @@ */ import { Button } from "@components/Button"; +import { SessionInfo } from "@plugins/betterSessions/types"; import { openModal } from "@utils/modal"; -import { SessionInfo } from "../types"; import { RenameModal } from "./RenameModal"; export function RenameButton({ session, state }: { session: SessionInfo["session"], state: [string, React.Dispatch>]; }) { diff --git a/src/plugins/betterSessions/components/RenameModal.tsx b/src/plugins/betterSessions/components/RenameModal.tsx index 568e2632d..e3faa2091 100644 --- a/src/plugins/betterSessions/components/RenameModal.tsx +++ b/src/plugins/betterSessions/components/RenameModal.tsx @@ -16,13 +16,12 @@ * along with this program. If not, see . */ +import { SessionInfo } from "@plugins/betterSessions/types"; +import { getDefaultName, savedSessionsCache, saveSessionsToDataStore } from "@plugins/betterSessions/utils"; import { ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot } from "@utils/modal"; import { Button, Forms, React, TextInput } from "@webpack/common"; import { KeyboardEvent } from "react"; -import { SessionInfo } from "../types"; -import { getDefaultName, savedSessionsCache, saveSessionsToDataStore } from "../utils"; - export function RenameModal({ props, session, state }: { props: ModalProps, session: SessionInfo["session"], state: [string, React.Dispatch>]; }) { const [title, setTitle] = state; const [value, setValue] = React.useState(savedSessionsCache.get(session.id_hash)?.name ?? ""); diff --git a/src/plugins/betterSessions/utils.ts b/src/plugins/betterSessions/utils.ts index 3015dc47c..de9d70af2 100644 --- a/src/plugins/betterSessions/utils.ts +++ b/src/plugins/betterSessions/utils.ts @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { DataStore } from "@api/index"; +import * as DataStore from "@api/DataStore"; import { UserStore } from "@webpack/common"; import { ChromeIcon, DiscordIcon, EdgeIcon, FirefoxIcon, IEIcon, MobileIcon, OperaIcon, SafariIcon, UnknownIcon } from "./components/icons"; diff --git a/src/plugins/betterSettings/PluginsSubmenu.tsx b/src/plugins/betterSettings/PluginsSubmenu.tsx index 8a3e5b2a0..14f835f99 100644 --- a/src/plugins/betterSettings/PluginsSubmenu.tsx +++ b/src/plugins/betterSettings/PluginsSubmenu.tsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { isPluginEnabled } from "@api/PluginManager"; import { openPluginModal } from "@components/settings/tabs"; import { getIntlMessage } from "@utils/discord"; import { isObjectEmpty } from "@utils/misc"; @@ -28,7 +29,7 @@ export default function PluginsSubmenu() { const search = query.toLowerCase(); const include = (p: typeof Plugins[keyof typeof Plugins]) => ( - Vencord.Plugins.isPluginEnabled(p.name) + isPluginEnabled(p.name) && p.options && !isObjectEmpty(p.options) && ( p.name.toLowerCase().includes(search) diff --git a/src/plugins/clientTheme/components/Settings.tsx b/src/plugins/clientTheme/components/Settings.tsx index 9e7f867e1..7035387ec 100644 --- a/src/plugins/clientTheme/components/Settings.tsx +++ b/src/plugins/clientTheme/components/Settings.tsx @@ -6,13 +6,13 @@ import { classNameFactory } from "@api/Styles"; import { ErrorCard } from "@components/ErrorCard"; +import { relativeLuminance } from "@plugins/clientTheme/utils/colorUtils"; +import { createOrUpdateThemeColorVars } from "@plugins/clientTheme/utils/styleUtils"; import { Margins } from "@utils/margins"; import { findByCodeLazy, findStoreLazy } from "@webpack"; import { Button, ColorPicker, Forms, ThemeStore, useStateFromStores } from "@webpack/common"; import { settings } from ".."; -import { relativeLuminance } from "../utils/colorUtils"; -import { createOrUpdateThemeColorVars } from "../utils/styleUtils"; const saveClientTheme = findByCodeLazy('type:"UNSYNCED_USER_SETTINGS_UPDATE', '"system"==='); const NitroThemeStore = findStoreLazy("ClientThemesBackgroundStore"); diff --git a/src/plugins/consoleShortcuts/index.ts b/src/plugins/consoleShortcuts/index.ts index feeada9e0..884d3d5c5 100644 --- a/src/plugins/consoleShortcuts/index.ts +++ b/src/plugins/consoleShortcuts/index.ts @@ -170,7 +170,7 @@ function makeShortcuts() { openModal: { getter: () => ModalAPI.openModal }, openModalLazy: { getter: () => ModalAPI.openModalLazy }, - Stores: Webpack.fluxStores, + Stores: { getter: () => Object.fromEntries(Webpack.fluxStores) }, // e.g. "2024-05_desktop_visual_refresh", 0 setExperiment: (id: string, bucket: number) => { diff --git a/src/plugins/copyEmojiMarkdown/index.tsx b/src/plugins/copyEmojiMarkdown/index.tsx index 58e7303a3..e03197fec 100644 --- a/src/plugins/copyEmojiMarkdown/index.tsx +++ b/src/plugins/copyEmojiMarkdown/index.tsx @@ -6,7 +6,7 @@ import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; -import { copyWithToast } from "@utils/misc"; +import { copyWithToast } from "@utils/discord"; import definePlugin, { OptionType } from "@utils/types"; import { findByPropsLazy } from "@webpack"; import { Menu } from "@webpack/common"; diff --git a/src/plugins/copyFileContents/index.tsx b/src/plugins/copyFileContents/index.tsx index 28b5bb92d..5bb79515c 100644 --- a/src/plugins/copyFileContents/index.tsx +++ b/src/plugins/copyFileContents/index.tsx @@ -9,7 +9,7 @@ import "./style.css"; import ErrorBoundary from "@components/ErrorBoundary"; import { CopyIcon, NoEntrySignIcon } from "@components/Icons"; import { Devs } from "@utils/constants"; -import { copyWithToast } from "@utils/misc"; +import { copyWithToast } from "@utils/discord"; import definePlugin from "@utils/types"; import { Tooltip, useState } from "@webpack/common"; diff --git a/src/plugins/copyStickerLinks/index.tsx b/src/plugins/copyStickerLinks/index.tsx index eaccc9b7c..635b8d313 100644 --- a/src/plugins/copyStickerLinks/index.tsx +++ b/src/plugins/copyStickerLinks/index.tsx @@ -17,12 +17,13 @@ */ import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { isPluginEnabled } from "@api/PluginManager"; +import ExpressionClonerPlugin from "@plugins/expressionCloner"; import { Devs } from "@utils/constants"; -import { copyWithToast } from "@utils/misc"; +import { copyWithToast } from "@utils/discord"; import definePlugin from "@utils/types"; import { Message, Sticker } from "@vencord/discord-types"; import { Menu, React, StickersStore } from "@webpack/common"; -import ExpressionClonerPlugin from "plugins/expressionCloner"; const StickerExt = [, "png", "png", "json", "gif"] as const; @@ -79,7 +80,7 @@ const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { t const sticker = StickersStore.getStickerById(id); if (sticker) { - children.push(buildMenuItem(sticker, Vencord.Plugins.isPluginEnabled(ExpressionClonerPlugin.name))); + children.push(buildMenuItem(sticker, isPluginEnabled(ExpressionClonerPlugin.name))); } }; diff --git a/src/plugins/customIdle/index.ts b/src/plugins/customIdle/index.ts index 78f4f9d0e..225386a0d 100644 --- a/src/plugins/customIdle/index.ts +++ b/src/plugins/customIdle/index.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { Notices } from "@api/index"; +import { currentNotice, noticesQueue, popNotice, showNotice } from "@api/Notices"; import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import definePlugin, { makeRange, OptionType } from "@utils/types"; @@ -62,12 +62,12 @@ export default definePlugin({ const backOnlineMessage = "Welcome back! Click the button to go online. Click the X to stay idle until reload."; if ( - Notices.currentNotice?.[1] === backOnlineMessage || - Notices.noticesQueue.some(([, noticeMessage]) => noticeMessage === backOnlineMessage) + currentNotice?.[1] === backOnlineMessage || + noticesQueue.some(([, noticeMessage]) => noticeMessage === backOnlineMessage) ) return; - Notices.showNotice(backOnlineMessage, "Exit idle", () => { - Notices.popNotice(); + showNotice(backOnlineMessage, "Exit idle", () => { + popNotice(); FluxDispatcher.dispatch({ type: "IDLE", idle: false diff --git a/src/plugins/customRPC/RpcSettings.tsx b/src/plugins/customRPC/RpcSettings.tsx index 637d049e3..019cc431b 100644 --- a/src/plugins/customRPC/RpcSettings.tsx +++ b/src/plugins/customRPC/RpcSettings.tsx @@ -6,6 +6,7 @@ import "./settings.css"; +import { isPluginEnabled } from "@api/PluginManager"; import { classNameFactory } from "@api/Styles"; import { Divider } from "@components/Divider"; import { Heading } from "@components/Heading"; @@ -14,7 +15,7 @@ import { debounce } from "@shared/debounce"; import { ActivityType } from "@vencord/discord-types/enums"; import { Select, Text, TextInput, useState } from "@webpack/common"; -import { setRpc, settings, TimestampMode } from "."; +import CustomRPCPlugin, { setRpc, settings, TimestampMode } from "."; const cl = classNameFactory("vc-customRPC-settings-"); @@ -50,7 +51,7 @@ function isAppIdValid(value: string) { const updateRPC = debounce(() => { setRpc(true); - if (Vencord.Plugins.isPluginEnabled("CustomRPC")) setRpc(); + if (isPluginEnabled(CustomRPCPlugin.name)) setRpc(); }); function isStreamLinkDisabled() { diff --git a/src/plugins/decor/lib/stores/AuthorizationStore.tsx b/src/plugins/decor/lib/stores/AuthorizationStore.tsx index 7f3468fd0..a2e85a5de 100644 --- a/src/plugins/decor/lib/stores/AuthorizationStore.tsx +++ b/src/plugins/decor/lib/stores/AuthorizationStore.tsx @@ -4,14 +4,13 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { DataStore } from "@api/index"; +import * as DataStore from "@api/DataStore"; +import { AUTHORIZE_URL, CLIENT_ID } from "@plugins/decor/lib/constants"; import { proxyLazy } from "@utils/lazy"; import { Logger } from "@utils/Logger"; import { openModal } from "@utils/modal"; import { OAuth2AuthorizeModal, showToast, Toasts, UserStore, zustandCreate, zustandPersist } from "@webpack/common"; -import { AUTHORIZE_URL, CLIENT_ID } from "../constants"; - interface AuthorizationState { token: string | null; tokens: Record; diff --git a/src/plugins/decor/lib/stores/CurrentUserDecorationsStore.ts b/src/plugins/decor/lib/stores/CurrentUserDecorationsStore.ts index e2bba6c0a..780301ed4 100644 --- a/src/plugins/decor/lib/stores/CurrentUserDecorationsStore.ts +++ b/src/plugins/decor/lib/stores/CurrentUserDecorationsStore.ts @@ -4,11 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { Decoration, deleteDecoration, getUserDecoration, getUserDecorations, NewDecoration, setUserDecoration } from "@plugins/decor/lib/api"; +import { decorationToAsset } from "@plugins/decor/lib/utils/decoration"; import { proxyLazy } from "@utils/lazy"; import { UserStore, zustandCreate } from "@webpack/common"; -import { Decoration, deleteDecoration, getUserDecoration, getUserDecorations, NewDecoration, setUserDecoration } from "../api"; -import { decorationToAsset } from "../utils/decoration"; import { useUsersDecorationsStore } from "./UsersDecorationsStore"; interface UserDecorationsState { diff --git a/src/plugins/decor/lib/stores/UsersDecorationsStore.ts b/src/plugins/decor/lib/stores/UsersDecorationsStore.ts index 588bbdf97..3adb9847e 100644 --- a/src/plugins/decor/lib/stores/UsersDecorationsStore.ts +++ b/src/plugins/decor/lib/stores/UsersDecorationsStore.ts @@ -4,15 +4,14 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { AvatarDecoration } from "@plugins/decor"; +import { getUsersDecorations } from "@plugins/decor/lib/api"; +import { DECORATION_FETCH_COOLDOWN, SKU_ID } from "@plugins/decor/lib/constants"; import { debounce } from "@shared/debounce"; import { proxyLazy } from "@utils/lazy"; import { User } from "@vencord/discord-types"; import { useEffect, useState, zustandCreate } from "@webpack/common"; -import { AvatarDecoration } from "../../"; -import { getUsersDecorations } from "../api"; -import { DECORATION_FETCH_COOLDOWN, SKU_ID } from "../constants"; - interface UserDecorationData { asset: string | null; fetchedAt: Date; diff --git a/src/plugins/decor/lib/utils/decoration.ts b/src/plugins/decor/lib/utils/decoration.ts index 176507ef8..265e8f584 100644 --- a/src/plugins/decor/lib/utils/decoration.ts +++ b/src/plugins/decor/lib/utils/decoration.ts @@ -4,9 +4,9 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { AvatarDecoration } from "../../"; -import { Decoration } from "../api"; -import { SKU_ID } from "../constants"; +import { AvatarDecoration } from "@plugins/decor"; +import { Decoration } from "@plugins/decor/lib/api"; +import { SKU_ID } from "@plugins/decor/lib/constants"; export function decorationToAsset(decoration: Decoration) { return `${decoration.animated ? "a_" : ""}${decoration.hash}`; diff --git a/src/plugins/decor/settings.tsx b/src/plugins/decor/settings.tsx index 361ecf898..6b94a7b66 100644 --- a/src/plugins/decor/settings.tsx +++ b/src/plugins/decor/settings.tsx @@ -12,13 +12,14 @@ import { closeAllModals } from "@utils/modal"; import { OptionType } from "@utils/types"; import { FluxDispatcher, Forms } from "@webpack/common"; +import DecorPlugin from "."; import DecorSection from "./ui/components/DecorSection"; export const settings = definePluginSettings({ changeDecoration: { type: OptionType.COMPONENT, component() { - if (!Vencord.Plugins.plugins.Decor.started) return + if (!DecorPlugin.started) return Enable Decor and restart your client to change your avatar decoration. ; diff --git a/src/plugins/decor/ui/components/DecorDecorationGridDecoration.tsx b/src/plugins/decor/ui/components/DecorDecorationGridDecoration.tsx index deaeef630..b5693a453 100644 --- a/src/plugins/decor/ui/components/DecorDecorationGridDecoration.tsx +++ b/src/plugins/decor/ui/components/DecorDecorationGridDecoration.tsx @@ -4,11 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { Decoration } from "@plugins/decor/lib/api"; +import { decorationToAvatarDecoration } from "@plugins/decor/lib/utils/decoration"; import { ContextMenuApi } from "@webpack/common"; import type { HTMLProps } from "react"; -import { Decoration } from "../../lib/api"; -import { decorationToAvatarDecoration } from "../../lib/utils/decoration"; import { DecorationGridDecoration } from "."; import DecorationContextMenu from "./DecorationContextMenu"; diff --git a/src/plugins/decor/ui/components/DecorSection.tsx b/src/plugins/decor/ui/components/DecorSection.tsx index 912652855..5fe6cba5a 100644 --- a/src/plugins/decor/ui/components/DecorSection.tsx +++ b/src/plugins/decor/ui/components/DecorSection.tsx @@ -6,14 +6,13 @@ import { Button } from "@components/Button"; import { Flex } from "@components/Flex"; +import { useAuthorizationStore } from "@plugins/decor/lib/stores/AuthorizationStore"; +import { useCurrentUserDecorationsStore } from "@plugins/decor/lib/stores/CurrentUserDecorationsStore"; +import { cl } from "@plugins/decor/ui"; +import { openChangeDecorationModal } from "@plugins/decor/ui/modals/ChangeDecorationModal"; import { findComponentByCodeLazy } from "@webpack"; import { useEffect } from "@webpack/common"; -import { useAuthorizationStore } from "../../lib/stores/AuthorizationStore"; -import { useCurrentUserDecorationsStore } from "../../lib/stores/CurrentUserDecorationsStore"; -import { cl } from "../"; -import { openChangeDecorationModal } from "../modals/ChangeDecorationModal"; - const CustomizationSection = findComponentByCodeLazy(".customizationSectionBackground"); export interface DecorSectionProps { diff --git a/src/plugins/decor/ui/components/DecorationContextMenu.tsx b/src/plugins/decor/ui/components/DecorationContextMenu.tsx index db3f00908..71b700448 100644 --- a/src/plugins/decor/ui/components/DecorationContextMenu.tsx +++ b/src/plugins/decor/ui/components/DecorationContextMenu.tsx @@ -5,13 +5,12 @@ */ import { CopyIcon, DeleteIcon } from "@components/Icons"; +import { Decoration } from "@plugins/decor/lib/api"; +import { useCurrentUserDecorationsStore } from "@plugins/decor/lib/stores/CurrentUserDecorationsStore"; +import { cl } from "@plugins/decor/ui"; import { copyToClipboard } from "@utils/clipboard"; import { Alerts, ContextMenuApi, Menu, UserStore } from "@webpack/common"; -import { Decoration } from "../../lib/api"; -import { useCurrentUserDecorationsStore } from "../../lib/stores/CurrentUserDecorationsStore"; -import { cl } from "../"; - export default function DecorationContextMenu({ decoration }: { decoration: Decoration; }) { const { delete: deleteDecoration } = useCurrentUserDecorationsStore(); diff --git a/src/plugins/decor/ui/components/Grid.tsx b/src/plugins/decor/ui/components/Grid.tsx index 62d7b4baa..a43d6868c 100644 --- a/src/plugins/decor/ui/components/Grid.tsx +++ b/src/plugins/decor/ui/components/Grid.tsx @@ -4,11 +4,10 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { cl } from "@plugins/decor/ui"; import { React } from "@webpack/common"; import { JSX } from "react"; -import { cl } from "../"; - export interface GridProps { renderItem: (item: ItemT) => JSX.Element; getItemKey: (item: ItemT) => string; diff --git a/src/plugins/decor/ui/components/SectionedGridList.tsx b/src/plugins/decor/ui/components/SectionedGridList.tsx index b5dc792ee..4352faddc 100644 --- a/src/plugins/decor/ui/components/SectionedGridList.tsx +++ b/src/plugins/decor/ui/components/SectionedGridList.tsx @@ -4,12 +4,12 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { cl } from "@plugins/decor/ui"; import { classes } from "@utils/misc"; import { findByPropsLazy } from "@webpack"; import { React } from "@webpack/common"; import { JSX } from "react"; -import { cl } from "../"; import Grid, { GridProps } from "./Grid"; const ScrollerClasses = findByPropsLazy("managedReactiveScroller"); diff --git a/src/plugins/decor/ui/components/index.ts b/src/plugins/decor/ui/components/index.ts index 8fe41fc92..71b9c6707 100644 --- a/src/plugins/decor/ui/components/index.ts +++ b/src/plugins/decor/ui/components/index.ts @@ -4,12 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { AvatarDecoration } from "@plugins/decor"; import { findComponentByCode, LazyComponentWebpack } from "@webpack"; import { React } from "@webpack/common"; import type { ComponentType, HTMLProps, PropsWithChildren } from "react"; -import { AvatarDecoration } from "../.."; - type DecorationGridItemComponent = ComponentType> & { onSelect: () => void, isSelected: boolean, diff --git a/src/plugins/decor/ui/modals/ChangeDecorationModal.tsx b/src/plugins/decor/ui/modals/ChangeDecorationModal.tsx index 6b5720556..df50c02a6 100644 --- a/src/plugins/decor/ui/modals/ChangeDecorationModal.tsx +++ b/src/plugins/decor/ui/modals/ChangeDecorationModal.tsx @@ -7,26 +7,25 @@ import { Button as NewButton } from "@components/Button"; import ErrorBoundary from "@components/ErrorBoundary"; import { Flex } from "@components/Flex"; -import { openInviteModal } from "@utils/discord"; +import { Decoration, getPresets, Preset } from "@plugins/decor/lib/api"; +import { GUILD_ID, INVITE_KEY } from "@plugins/decor/lib/constants"; +import { useAuthorizationStore } from "@plugins/decor/lib/stores/AuthorizationStore"; +import { useCurrentUserDecorationsStore } from "@plugins/decor/lib/stores/CurrentUserDecorationsStore"; +import { decorationToAvatarDecoration } from "@plugins/decor/lib/utils/decoration"; +import { settings } from "@plugins/decor/settings"; +import { cl, DecorationModalStyles, requireAvatarDecorationModal } from "@plugins/decor/ui"; +import { AvatarDecorationModalPreview } from "@plugins/decor/ui/components"; +import DecorationGridCreate from "@plugins/decor/ui/components/DecorationGridCreate"; +import DecorationGridNone from "@plugins/decor/ui/components/DecorationGridNone"; +import DecorDecorationGridDecoration from "@plugins/decor/ui/components/DecorDecorationGridDecoration"; +import SectionedGridList from "@plugins/decor/ui/components/SectionedGridList"; +import { copyWithToast, openInviteModal } from "@utils/discord"; import { Margins } from "@utils/margins"; -import { copyWithToast } from "@utils/misc"; import { closeAllModals, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; import { Queue } from "@utils/Queue"; import { User } from "@vencord/discord-types"; import { Alerts, Button, FluxDispatcher, Forms, GuildStore, NavigationRouter, Parser, Text, Tooltip, useEffect, UserStore, UserSummaryItem, UserUtils, useState } from "@webpack/common"; -import { Decoration, getPresets, Preset } from "../../lib/api"; -import { GUILD_ID, INVITE_KEY } from "../../lib/constants"; -import { useAuthorizationStore } from "../../lib/stores/AuthorizationStore"; -import { useCurrentUserDecorationsStore } from "../../lib/stores/CurrentUserDecorationsStore"; -import { decorationToAvatarDecoration } from "../../lib/utils/decoration"; -import { settings } from "../../settings"; -import { cl, DecorationModalStyles, requireAvatarDecorationModal } from "../"; -import { AvatarDecorationModalPreview } from "../components"; -import DecorationGridCreate from "../components/DecorationGridCreate"; -import DecorationGridNone from "../components/DecorationGridNone"; -import DecorDecorationGridDecoration from "../components/DecorDecorationGridDecoration"; -import SectionedGridList from "../components/SectionedGridList"; import { openCreateDecorationModal } from "./CreateDecorationModal"; import { openGuidelinesModal } from "./GuidelinesModal"; diff --git a/src/plugins/decor/ui/modals/CreateDecorationModal.tsx b/src/plugins/decor/ui/modals/CreateDecorationModal.tsx index 9c9ac371b..e668f65ae 100644 --- a/src/plugins/decor/ui/modals/CreateDecorationModal.tsx +++ b/src/plugins/decor/ui/modals/CreateDecorationModal.tsx @@ -6,17 +6,16 @@ import ErrorBoundary from "@components/ErrorBoundary"; import { Link } from "@components/Link"; +import { GUILD_ID, INVITE_KEY, RAW_SKU_ID } from "@plugins/decor/lib/constants"; +import { useCurrentUserDecorationsStore } from "@plugins/decor/lib/stores/CurrentUserDecorationsStore"; +import { cl, DecorationModalStyles, requireAvatarDecorationModal, requireCreateStickerModal } from "@plugins/decor/ui"; +import { AvatarDecorationModalPreview } from "@plugins/decor/ui/components"; import { openInviteModal } from "@utils/discord"; import { Margins } from "@utils/margins"; import { closeAllModals, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; import { filters, findComponentByCodeLazy, mapMangledModuleLazy } from "@webpack"; import { Button, FluxDispatcher, Forms, GuildStore, NavigationRouter, Text, TextInput, useEffect, useMemo, UserStore, useState } from "@webpack/common"; -import { GUILD_ID, INVITE_KEY, RAW_SKU_ID } from "../../lib/constants"; -import { useCurrentUserDecorationsStore } from "../../lib/stores/CurrentUserDecorationsStore"; -import { cl, DecorationModalStyles, requireAvatarDecorationModal, requireCreateStickerModal } from "../"; -import { AvatarDecorationModalPreview } from "../components"; - const FileUpload = findComponentByCodeLazy(".fileUpload),"); const { HelpMessage, HelpMessageTypes } = mapMangledModuleLazy('POSITIVE="positive', { diff --git a/src/plugins/decor/ui/modals/GuidelinesModal.tsx b/src/plugins/decor/ui/modals/GuidelinesModal.tsx index 49a816dba..a4d6624d5 100644 --- a/src/plugins/decor/ui/modals/GuidelinesModal.tsx +++ b/src/plugins/decor/ui/modals/GuidelinesModal.tsx @@ -6,11 +6,11 @@ import { Flex } from "@components/Flex"; import { Link } from "@components/Link"; +import { settings } from "@plugins/decor/settings"; +import { cl, DecorationModalStyles, requireAvatarDecorationModal } from "@plugins/decor/ui"; import { ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; import { Button, Forms, Text } from "@webpack/common"; -import { settings } from "../../settings"; -import { cl, DecorationModalStyles, requireAvatarDecorationModal } from "../"; import { openCreateDecorationModal } from "./CreateDecorationModal"; function GuidelinesModal(props: ModalProps) { diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx index bb9a6daaf..9621b3e05 100644 --- a/src/plugins/fakeNitro/index.tsx +++ b/src/plugins/fakeNitro/index.tsx @@ -18,8 +18,8 @@ import { addMessagePreEditListener, addMessagePreSendListener, removeMessagePreEditListener, removeMessagePreSendListener } from "@api/MessageEvents"; import { definePluginSettings } from "@api/Settings"; +import { ApngBlendOp, ApngDisposeOp, parseAPNG } from "@utils/apng"; import { Devs } from "@utils/constants"; -import { ApngBlendOp, ApngDisposeOp, importApngJs } from "@utils/dependencies"; import { getCurrentGuild, getEmojiURL } from "@utils/discord"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType, Patch } from "@utils/types"; @@ -706,9 +706,10 @@ export default definePlugin({ }, async sendAnimatedSticker(stickerLink: string, stickerId: string, channelId: string) { - const { parseURL } = importApngJs(); - const { frames, width, height } = await parseURL(stickerLink); + const { frames, width, height } = await fetch(stickerLink) + .then(res => res.arrayBuffer()) + .then(parseAPNG); const gif = GIFEncoder(); const resolution = settings.store.stickerSize; @@ -757,7 +758,7 @@ export default definePlugin({ gif.finish(); - const file = new File([gif.bytesView()], `${stickerId}.gif`, { type: "image/gif" }); + const file = new File([gif.bytesView() as Uint8Array], `${stickerId}.gif`, { type: "image/gif" }); UploadHandler.promptToUpload([file], ChannelStore.getChannel(channelId), DraftType.ChannelMessage); }, diff --git a/src/plugins/fakeProfileThemes/index.tsx b/src/plugins/fakeProfileThemes/index.tsx index f69e24c72..e6de5df03 100644 --- a/src/plugins/fakeProfileThemes/index.tsx +++ b/src/plugins/fakeProfileThemes/index.tsx @@ -17,15 +17,15 @@ */ // This plugin is a port from Alyxia's Vendetta plugin -import "./index.css"; +import "./styles.css"; import { definePluginSettings } from "@api/Settings"; import { Divider } from "@components/Divider"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; -import { fetchUserProfile } from "@utils/discord"; +import { copyWithToast, fetchUserProfile } from "@utils/discord"; import { Margins } from "@utils/margins"; -import { classes, copyWithToast } from "@utils/misc"; +import { classes } from "@utils/misc"; import { useAwaiter } from "@utils/react"; import definePlugin, { OptionType } from "@utils/types"; import { User, UserProfile } from "@vencord/discord-types"; diff --git a/src/plugins/fakeProfileThemes/index.css b/src/plugins/fakeProfileThemes/styles.css similarity index 100% rename from src/plugins/fakeProfileThemes/index.css rename to src/plugins/fakeProfileThemes/styles.css diff --git a/src/plugins/imageZoom/components/Magnifier.tsx b/src/plugins/imageZoom/components/Magnifier.tsx index d68f916ec..dbe196072 100644 --- a/src/plugins/imageZoom/components/Magnifier.tsx +++ b/src/plugins/imageZoom/components/Magnifier.tsx @@ -18,12 +18,11 @@ import { classNameFactory } from "@api/Styles"; import ErrorBoundary from "@components/ErrorBoundary"; +import { settings } from "@plugins/imageZoom"; +import { ELEMENT_ID } from "@plugins/imageZoom/constants"; +import { waitFor } from "@plugins/imageZoom/utils/waitFor"; import { FluxDispatcher, useLayoutEffect, useMemo, useRef, useState } from "@webpack/common"; -import { ELEMENT_ID } from "../constants"; -import { settings } from "../index"; -import { waitFor } from "../utils/waitFor"; - interface Vec2 { x: number, y: number; diff --git a/src/plugins/invisibleChat.desktop/components/DecryptionModal.tsx b/src/plugins/invisibleChat.desktop/components/DecryptionModal.tsx deleted file mode 100644 index b4bf6eb93..000000000 --- a/src/plugins/invisibleChat.desktop/components/DecryptionModal.tsx +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Vencord, a modification for Discord's desktop app - * Copyright (c) 2023 Vendicated and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . -*/ - -import { - ModalContent, - ModalFooter, - ModalHeader, - ModalRoot, - openModal, -} from "@utils/modal"; -import { Button, Forms, React, TextInput } from "@webpack/common"; - -import { decrypt } from "../index"; - -export function DecModal(props: any) { - const encryptedMessage: string = props?.message?.content; - const [password, setPassword] = React.useState("password"); - - return ( - - - Decrypt Message - - - - Message with Encryption - - Password - - - - - - - - - ); -} - -export function buildDecModal(msg: any): any { - openModal((props: any) => ); -} diff --git a/src/plugins/invisibleChat.desktop/components/EncryptionModal.tsx b/src/plugins/invisibleChat.desktop/components/EncryptionModal.tsx deleted file mode 100644 index ecc0c1366..000000000 --- a/src/plugins/invisibleChat.desktop/components/EncryptionModal.tsx +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Vencord, a modification for Discord's desktop app - * Copyright (c) 2023 Vendicated and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . -*/ - -import { FormSwitch } from "@components/FormSwitch"; -import { insertTextIntoChatInputBox } from "@utils/discord"; -import { - ModalContent, - ModalFooter, - ModalHeader, - ModalProps, - ModalRoot, - openModal, -} from "@utils/modal"; -import { Button, Forms, React, TextInput } from "@webpack/common"; - -import { encrypt } from "../index"; - -function EncModal(props: ModalProps) { - const [secret, setSecret] = React.useState(""); - const [cover, setCover] = React.useState(""); - const [password, setPassword] = React.useState("password"); - const [noCover, setNoCover] = React.useState(false); - - const isValid = secret && (noCover || (cover && cover.trim().split(" ").length > 1)); - - return ( - - - Encrypt Message - - - - Secret - { - setSecret(e); - }} - /> - Cover (2 or more Words!!) - { - setCover(e); - }} - /> - Password - { - setPassword(e); - }} - /> - { - setNoCover(e); - }} - /> - - - - - - - - ); -} - -export function buildEncModal(): any { - openModal(props => ); -} diff --git a/src/plugins/invisibleChat.desktop/index.tsx b/src/plugins/invisibleChat.desktop/index.tsx deleted file mode 100644 index e6ba63e45..000000000 --- a/src/plugins/invisibleChat.desktop/index.tsx +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Vencord, a modification for Discord's desktop app - * Copyright (c) 2023 Vendicated and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . -*/ - -import { ChatBarButton, ChatBarButtonFactory } from "@api/ChatButtons"; -import { updateMessage } from "@api/MessageUpdater"; -import { definePluginSettings } from "@api/Settings"; -import ErrorBoundary from "@components/ErrorBoundary"; -import { Devs } from "@utils/constants"; -import { getStegCloak } from "@utils/dependencies"; -import definePlugin, { OptionType, ReporterTestable } from "@utils/types"; -import { Message } from "@vencord/discord-types"; -import { ChannelStore, Constants, RestAPI, Tooltip } from "@webpack/common"; - -import { buildDecModal } from "./components/DecryptionModal"; -import { buildEncModal } from "./components/EncryptionModal"; - -let steggo: any; - -function PopOverIcon() { - return ( - - - - - ); -} - - -function Indicator() { - return ( - - {({ onMouseEnter, onMouseLeave }) => ( - - )} - - - ); - -} - -const ChatBarIcon: ChatBarButtonFactory = ({ isMainChat }) => { - if (!isMainChat) return null; - - return ( - buildEncModal()} - buttonProps={{ - "aria-haspopup": "dialog", - }} - > - - - - - ); -}; - -const settings = definePluginSettings({ - savedPasswords: { - type: OptionType.STRING, - default: "password, Password", - description: "Saved Passwords (Seperated with a , )" - } -}); - -export default definePlugin({ - name: "InvisibleChat", - description: "Encrypt your Messages in a non-suspicious way!", - authors: [Devs.SammCheese], - dependencies: ["MessageUpdaterAPI"], - reporterTestable: ReporterTestable.Patches, - settings, - - patches: [ - { - // Indicator - find: ".SEND_FAILED,", - replacement: { - match: /let\{className:\i,message:\i[^}]*\}=(\i)/, - replace: "try {$1 && $self.INV_REGEX.test($1.message.content) ? $1.content.push($self.indicator()) : null } catch {};$&" - } - }, - ], - - EMBED_API_URL: "https://embed.sammcheese.net", - INV_REGEX: new RegExp(/( \u200c|\u200d |[\u2060-\u2064])[^\u200b]/), - URL_REGEX: new RegExp( - /(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/, - ), - async start() { - const { default: StegCloak } = await getStegCloak(); - steggo = new StegCloak(true, false); - }, - - renderMessagePopoverButton(message) { - return this.INV_REGEX.test(message?.content) - ? { - label: "Decrypt Message", - icon: this.popOverIcon, - message: message, - channel: ChannelStore.getChannel(message.channel_id), - onClick: async () => { - const res = await iteratePasswords(message); - - if (res) - this.buildEmbed(message, res); - else - buildDecModal({ message }); - } - } - : null; - }, - - renderChatBarButton: ChatBarIcon, - - colorCodeFromNumber(color: number): string { - return `#${[color >> 16, color >> 8, color] - .map(x => (x & 0xFF).toString(16)) - .join("")}`; - }, - - // Gets the Embed of a Link - async getEmbed(url: URL): Promise { - const { body } = await RestAPI.post({ - url: Constants.Endpoints.UNFURL_EMBED_URLS, - body: { - urls: [url] - } - }); - // The endpoint returns the color as a number, but Discord expects a string - body.embeds[0].color = this.colorCodeFromNumber(body.embeds[0].color); - return await body.embeds[0]; - }, - - async buildEmbed(message: any, revealed: string): Promise { - const urlCheck = revealed.match(this.URL_REGEX); - - message.embeds.push({ - type: "rich", - rawTitle: "Decrypted Message", - color: "#45f5f5", - rawDescription: revealed, - footer: { - text: "Made with ❤️ by c0dine and Sammy!", - }, - }); - - if (urlCheck?.length) { - const embed = await this.getEmbed(new URL(urlCheck[0])); - if (embed) - message.embeds.push(embed); - } - - updateMessage(message.channel_id, message.id, { embeds: message.embeds }); - }, - - popOverIcon: () => , - indicator: ErrorBoundary.wrap(Indicator, { noop: true }) -}); - -export function encrypt(secret: string, password: string, cover: string): string { - return steggo.hide(secret + "\u200b", password, cover); -} - -export function decrypt(encrypted: string, password: string, removeIndicator: boolean): string { - const decrypted = steggo.reveal(encrypted, password); - return removeIndicator ? decrypted.replace("\u200b", "") : decrypted; -} - -export function isCorrectPassword(result: string): boolean { - return result.endsWith("\u200b"); -} - -export async function iteratePasswords(message: Message): Promise { - const passwords = settings.store.savedPasswords.split(",").map(s => s.trim()); - - if (!message?.content || !passwords?.length) return false; - - let { content } = message; - - // we use an extra variable so we dont have to edit the message content directly - if (/^\W/.test(message.content)) content = `d ${message.content}d`; - - for (let i = 0; i < passwords.length; i++) { - const result = decrypt(content, passwords[i], false); - if (isCorrectPassword(result)) { - return result; - } - } - - return false; -} diff --git a/src/plugins/messageClickActions/index.ts b/src/plugins/messageClickActions/index.ts index 148998f8e..6404bd6f3 100644 --- a/src/plugins/messageClickActions/index.ts +++ b/src/plugins/messageClickActions/index.ts @@ -16,13 +16,14 @@ * along with this program. If not, see . */ +import { isPluginEnabled } from "@api/PluginManager"; import { definePluginSettings } from "@api/Settings"; +import NoReplyMentionPlugin from "@plugins/noReplyMention"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import { MessageFlags } from "@vencord/discord-types/enums"; import { findByPropsLazy } from "@webpack"; import { FluxDispatcher, MessageTypeSets, PermissionsBits, PermissionStore, UserStore, WindowStore } from "@webpack/common"; -import NoReplyMentionPlugin from "plugins/noReplyMention"; const MessageActions = findByPropsLazy("deleteMessage", "startEditMessage"); const EditStore = findByPropsLazy("isEditing", "isEditingAny"); @@ -93,7 +94,7 @@ export default definePlugin({ if (!MessageTypeSets.REPLYABLE.has(msg.type) || msg.hasFlag(MessageFlags.EPHEMERAL)) return; const isShiftPress = event.shiftKey && !settings.store.requireModifier; - const shouldMention = Vencord.Plugins.isPluginEnabled(NoReplyMentionPlugin.name) + const shouldMention = isPluginEnabled(NoReplyMentionPlugin.name) ? NoReplyMentionPlugin.shouldMention(msg, isShiftPress) : !isShiftPress; diff --git a/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx b/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx index 0b28f1173..996b25f11 100644 --- a/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx +++ b/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx @@ -19,6 +19,7 @@ import ErrorBoundary from "@components/ErrorBoundary"; import { Flex } from "@components/Flex"; import { InfoIcon, OwnerCrownIcon } from "@components/Icons"; +import { cl, getGuildPermissionSpecMap } from "@plugins/permissionsViewer/utils"; import { copyToClipboard } from "@utils/clipboard"; import { getIntlMessage, getUniqueUsername } from "@utils/discord"; import { ModalCloseButton, ModalContent, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; @@ -27,7 +28,6 @@ import { findByCodeLazy } from "@webpack"; import { ContextMenuApi, FluxDispatcher, GuildMemberStore, GuildRoleStore, i18n, Menu, PermissionsBits, ScrollerThin, Text, Tooltip, useEffect, useMemo, UserStore, useState, useStateFromStores } from "@webpack/common"; import { settings } from ".."; -import { cl, getGuildPermissionSpecMap } from "../utils"; import { PermissionAllowedIcon, PermissionDefaultIcon, PermissionDeniedIcon } from "./icons"; export const enum PermissionType { diff --git a/src/plugins/permissionsViewer/components/UserPermissions.tsx b/src/plugins/permissionsViewer/components/UserPermissions.tsx index e5bb27222..1219d2fc7 100644 --- a/src/plugins/permissionsViewer/components/UserPermissions.tsx +++ b/src/plugins/permissionsViewer/components/UserPermissions.tsx @@ -18,6 +18,7 @@ import ErrorBoundary from "@components/ErrorBoundary"; import { HeadingTertiary } from "@components/Heading"; +import { cl, getGuildPermissionSpecMap, getSortedRolesForMember, sortUserRoles } from "@plugins/permissionsViewer/utils"; import { getIntlMessage } from "@utils/discord"; import { classes } from "@utils/misc"; import type { Guild, GuildMember } from "@vencord/discord-types"; @@ -25,7 +26,6 @@ import { filters, findBulk, proxyLazyWebpack } from "@webpack"; import { PermissionsBits, Text, Tooltip, useMemo, UserStore } from "@webpack/common"; import { PermissionsSortOrder, settings } from ".."; -import { cl, getGuildPermissionSpecMap, getSortedRolesForMember, sortUserRoles } from "../utils"; import openRolesAndUsersPermissionsModal, { PermissionType, type RoleOrUserPermission } from "./RolesAndUsersPermissions"; interface UserPermission { diff --git a/src/plugins/pinDms/components/CreateCategoryModal.tsx b/src/plugins/pinDms/components/CreateCategoryModal.tsx index 61f564ecc..e18ad2ab9 100644 --- a/src/plugins/pinDms/components/CreateCategoryModal.tsx +++ b/src/plugins/pinDms/components/CreateCategoryModal.tsx @@ -6,13 +6,12 @@ import { classNameFactory } from "@api/Styles"; import { Divider } from "@components/Divider"; +import { DEFAULT_COLOR, SWATCHES } from "@plugins/pinDms/constants"; +import { categoryLen, createCategory, getCategory } from "@plugins/pinDms/data"; import { ModalContent, ModalFooter, ModalHeader, ModalProps, ModalRoot, openModalLazy } from "@utils/modal"; import { extractAndLoadChunksLazy, findComponentByCodeLazy } from "@webpack"; import { Button, ColorPicker, Forms, Text, TextInput, Toasts, useMemo, useState } from "@webpack/common"; -import { DEFAULT_COLOR, SWATCHES } from "../constants"; -import { categoryLen, createCategory, getCategory } from "../data"; - interface ColorPickerWithSwatchesProps { defaultColor: number; colors: number[]; diff --git a/src/plugins/pinDms/components/contextMenu.tsx b/src/plugins/pinDms/components/contextMenu.tsx index 6fc4e6743..5a2415241 100644 --- a/src/plugins/pinDms/components/contextMenu.tsx +++ b/src/plugins/pinDms/components/contextMenu.tsx @@ -5,10 +5,10 @@ */ import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { PinOrder, settings } from "@plugins/pinDms"; +import { addChannelToCategory, canMoveChannelInDirection, currentUserCategories, isPinned, moveChannel, removeChannelFromCategory } from "@plugins/pinDms/data"; import { Menu } from "@webpack/common"; -import { addChannelToCategory, canMoveChannelInDirection, currentUserCategories, isPinned, moveChannel, removeChannelFromCategory } from "../data"; -import { PinOrder, settings } from "../index"; import { openCategoryModal } from "./CreateCategoryModal"; function createPinMenuItem(channelId: string) { diff --git a/src/plugins/pinDms/data.ts b/src/plugins/pinDms/data.ts index 187822999..7671b54f3 100644 --- a/src/plugins/pinDms/data.ts +++ b/src/plugins/pinDms/data.ts @@ -4,11 +4,10 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { PinOrder, PrivateChannelSortStore, settings } from "@plugins/pinDms"; import { useForceUpdater } from "@utils/react"; import { UserStore } from "@webpack/common"; -import { PinOrder, PrivateChannelSortStore, settings } from "./index"; - export interface Category { id: string; name: string; diff --git a/src/plugins/quickReply/index.ts b/src/plugins/quickReply/index.ts index f620be411..6dc34deea 100644 --- a/src/plugins/quickReply/index.ts +++ b/src/plugins/quickReply/index.ts @@ -16,14 +16,15 @@ * along with this program. If not, see . */ +import { isPluginEnabled } from "@api/PluginManager"; import { definePluginSettings } from "@api/Settings"; +import NoBlockedMessagesPlugin from "@plugins/noBlockedMessages"; +import NoReplyMentionPlugin from "@plugins/noReplyMention"; import { Devs, IS_MAC } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; import { Message } from "@vencord/discord-types"; import { MessageFlags } from "@vencord/discord-types/enums"; import { ChannelStore, ComponentDispatch, FluxDispatcher as Dispatcher, MessageActions, MessageStore, MessageTypeSets, PermissionsBits, PermissionStore, RelationshipStore, SelectedChannelStore, UserStore } from "@webpack/common"; -import NoBlockedMessagesPlugin from "plugins/noBlockedMessages"; -import NoReplyMentionPlugin from "plugins/noReplyMention"; let currentlyReplyingId: string | null = null; let currentlyEditingId: string | null = null; @@ -134,7 +135,7 @@ function getNextMessage(isUp: boolean, isReply: boolean) { let messages: Message[] = MessageStore.getMessages(SelectedChannelStore.getChannelId())._array; const meId = UserStore.getCurrentUser().id; - const hasNoBlockedMessages = Vencord.Plugins.isPluginEnabled(NoBlockedMessagesPlugin.name); + const hasNoBlockedMessages = isPluginEnabled(NoBlockedMessagesPlugin.name); messages = messages.filter(m => { if (m.deleted) return false; @@ -170,7 +171,7 @@ function getNextMessage(isUp: boolean, isReply: boolean) { function shouldMention(message: Message) { switch (settings.store.shouldMention) { case MentionOptions.NO_REPLY_MENTION_PLUGIN: - if (!Vencord.Plugins.isPluginEnabled(NoReplyMentionPlugin.name)) return true; + if (!isPluginEnabled(NoReplyMentionPlugin.name)) return true; return NoReplyMentionPlugin.shouldMention(message, false); case MentionOptions.DISABLED: return false; diff --git a/src/plugins/relationshipNotifier/utils.ts b/src/plugins/relationshipNotifier/utils.ts index 78371f13d..206cb63c7 100644 --- a/src/plugins/relationshipNotifier/utils.ts +++ b/src/plugins/relationshipNotifier/utils.ts @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -import { DataStore, Notices } from "@api/index"; +import * as DataStore from "@api/DataStore"; +import { popNotice, showNotice } from "@api/Notices"; import { showNotification } from "@api/Notifications"; import { getUniqueUsername, openUserProfile } from "@utils/discord"; import { FluxStore } from "@vencord/discord-types"; @@ -111,7 +112,7 @@ export async function syncAndRunChecks() { export function notify(text: string, icon?: string, onClick?: () => void) { if (settings.store.notices) - Notices.showNotice(text, "OK", () => Notices.popNotice()); + showNotice(text, "OK", () => popNotice()); showNotification({ title: "Relationship Notifier", diff --git a/src/plugins/reviewDB/auth.tsx b/src/plugins/reviewDB/auth.tsx index 8d9789dd7..e25119e51 100644 --- a/src/plugins/reviewDB/auth.tsx +++ b/src/plugins/reviewDB/auth.tsx @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { DataStore } from "@api/index"; +import * as DataStore from "@api/DataStore"; import { Logger } from "@utils/Logger"; import { openModal } from "@utils/modal"; import { OAuth2AuthorizeModal, showToast, Toasts, UserStore } from "@webpack/common"; diff --git a/src/plugins/reviewDB/components/BlockedUserModal.tsx b/src/plugins/reviewDB/components/BlockedUserModal.tsx index 8b8271746..5ad489486 100644 --- a/src/plugins/reviewDB/components/BlockedUserModal.tsx +++ b/src/plugins/reviewDB/components/BlockedUserModal.tsx @@ -4,16 +4,15 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { Auth } from "@plugins/reviewDB/auth"; +import { ReviewDBUser } from "@plugins/reviewDB/entities"; +import { fetchBlocks, unblockUser } from "@plugins/reviewDB/reviewDbApi"; +import { cl } from "@plugins/reviewDB/utils"; import { Logger } from "@utils/Logger"; import { ModalCloseButton, ModalContent, ModalHeader, ModalRoot, openModal } from "@utils/modal"; import { useAwaiter } from "@utils/react"; import { Forms, Tooltip, useState } from "@webpack/common"; -import { Auth } from "../auth"; -import { ReviewDBUser } from "../entities"; -import { fetchBlocks, unblockUser } from "../reviewDbApi"; -import { cl } from "../utils"; - function UnblockButton(props: { onClick?(): void; }) { return ( diff --git a/src/plugins/reviewDB/components/ReviewBadge.tsx b/src/plugins/reviewDB/components/ReviewBadge.tsx index 665b9bb09..dc2485594 100644 --- a/src/plugins/reviewDB/components/ReviewBadge.tsx +++ b/src/plugins/reviewDB/components/ReviewBadge.tsx @@ -16,12 +16,11 @@ * along with this program. If not, see . */ +import { Badge } from "@plugins/reviewDB/entities"; +import { cl } from "@plugins/reviewDB/utils"; import { MaskedLink, React, Tooltip } from "@webpack/common"; import { HTMLAttributes } from "react"; -import { Badge } from "../entities"; -import { cl } from "../utils"; - export default function ReviewBadge(badge: Badge & { onClick?(): void; }) { const Wrapper = badge.redirectURL ? MaskedLink diff --git a/src/plugins/reviewDB/components/ReviewComponent.tsx b/src/plugins/reviewDB/components/ReviewComponent.tsx index 3922cc7f3..effd5c4ee 100644 --- a/src/plugins/reviewDB/components/ReviewComponent.tsx +++ b/src/plugins/reviewDB/components/ReviewComponent.tsx @@ -16,17 +16,17 @@ * along with this program. If not, see . */ +import { Auth, getToken } from "@plugins/reviewDB/auth"; +import { Review, ReviewType } from "@plugins/reviewDB/entities"; +import { blockUser, deleteReview, reportReview, unblockUser } from "@plugins/reviewDB/reviewDbApi"; +import { settings } from "@plugins/reviewDB/settings"; +import { canBlockReviewAuthor, canDeleteReview, canReportReview, cl, showToast } from "@plugins/reviewDB/utils"; import { openUserProfile } from "@utils/discord"; import { classes } from "@utils/misc"; import { LazyComponent } from "@utils/react"; import { filters, findBulk } from "@webpack"; import { Alerts, Parser, Timestamp, useState } from "@webpack/common"; -import { Auth, getToken } from "../auth"; -import { Review, ReviewType } from "../entities"; -import { blockUser, deleteReview, reportReview, unblockUser } from "../reviewDbApi"; -import { settings } from "../settings"; -import { canBlockReviewAuthor, canDeleteReview, canReportReview, cl, showToast } from "../utils"; import { openBlockModal } from "./BlockedUserModal"; import { BlockButton, DeleteButton, ReportButton } from "./MessageButton"; import ReviewBadge from "./ReviewBadge"; diff --git a/src/plugins/reviewDB/components/ReviewModal.tsx b/src/plugins/reviewDB/components/ReviewModal.tsx index 1485022da..9cc1e577d 100644 --- a/src/plugins/reviewDB/components/ReviewModal.tsx +++ b/src/plugins/reviewDB/components/ReviewModal.tsx @@ -17,14 +17,14 @@ */ import ErrorBoundary from "@components/ErrorBoundary"; +import { Auth } from "@plugins/reviewDB/auth"; +import { ReviewType } from "@plugins/reviewDB/entities"; +import { Response, REVIEWS_PER_PAGE } from "@plugins/reviewDB/reviewDbApi"; +import { cl } from "@plugins/reviewDB/utils"; import { ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalRoot, ModalSize, openModal } from "@utils/modal"; import { useForceUpdater } from "@utils/react"; import { Paginator, Text, useRef, useState } from "@webpack/common"; -import { Auth } from "../auth"; -import { ReviewType } from "../entities"; -import { Response, REVIEWS_PER_PAGE } from "../reviewDbApi"; -import { cl } from "../utils"; import ReviewComponent from "./ReviewComponent"; import ReviewsView, { ReviewsInputComponent } from "./ReviewsView"; diff --git a/src/plugins/reviewDB/components/ReviewsView.tsx b/src/plugins/reviewDB/components/ReviewsView.tsx index 42ab09381..7de4044a7 100644 --- a/src/plugins/reviewDB/components/ReviewsView.tsx +++ b/src/plugins/reviewDB/components/ReviewsView.tsx @@ -16,15 +16,15 @@ * along with this program. If not, see . */ +import { Auth, authorize } from "@plugins/reviewDB/auth"; +import { Review, ReviewType } from "@plugins/reviewDB/entities"; +import { addReview, getReviews, Response, REVIEWS_PER_PAGE } from "@plugins/reviewDB/reviewDbApi"; +import { settings } from "@plugins/reviewDB/settings"; +import { cl, showToast } from "@plugins/reviewDB/utils"; import { useAwaiter, useForceUpdater } from "@utils/react"; import { findByCodeLazy, findByPropsLazy, findComponentByCodeLazy } from "@webpack"; import { Forms, React, RelationshipStore, useRef, UserStore } from "@webpack/common"; -import { Auth, authorize } from "../auth"; -import { Review, ReviewType } from "../entities"; -import { addReview, getReviews, Response, REVIEWS_PER_PAGE } from "../reviewDbApi"; -import { settings } from "../settings"; -import { cl, showToast } from "../utils"; import ReviewComponent from "./ReviewComponent"; const Transforms = findByPropsLazy("insertNodes", "textToText"); diff --git a/src/plugins/seeSummaries/index.tsx b/src/plugins/seeSummaries/index.tsx index a5af9bc44..faa642fc7 100644 --- a/src/plugins/seeSummaries/index.tsx +++ b/src/plugins/seeSummaries/index.tsx @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { DataStore } from "@api/index"; +import * as DataStore from "@api/DataStore"; import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import { hasGuildFeature } from "@utils/discord"; diff --git a/src/plugins/shikiCodeblocks.desktop/api/shiki.ts b/src/plugins/shikiCodeblocks.desktop/api/shiki.ts index 91e179b72..8ca9662ed 100644 --- a/src/plugins/shikiCodeblocks.desktop/api/shiki.ts +++ b/src/plugins/shikiCodeblocks.desktop/api/shiki.ts @@ -16,12 +16,12 @@ * along with this program. If not, see . */ +import { dispatchTheme } from "@plugins/shikiCodeblocks.desktop/hooks/useTheme"; +import type { ShikiSpec } from "@plugins/shikiCodeblocks.desktop/types"; import { shikiOnigasmSrc, shikiWorkerSrc } from "@utils/dependencies"; import { WorkerClient } from "@vap/core/ipc"; import type { IShikiTheme, IThemedToken } from "@vap/shiki"; -import { dispatchTheme } from "../hooks/useTheme"; -import type { ShikiSpec } from "../types"; import { getGrammar, languages, loadLanguages, resolveLang } from "./languages"; import { themes } from "./themes"; diff --git a/src/plugins/shikiCodeblocks.desktop/components/ButtonRow.tsx b/src/plugins/shikiCodeblocks.desktop/components/ButtonRow.tsx index 408de1543..efbf947e6 100644 --- a/src/plugins/shikiCodeblocks.desktop/components/ButtonRow.tsx +++ b/src/plugins/shikiCodeblocks.desktop/components/ButtonRow.tsx @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -import { cl } from "../utils/misc"; +import { cl } from "@plugins/shikiCodeblocks.desktop/utils/misc"; + import { CopyButton } from "./CopyButton"; export interface ButtonRowProps { diff --git a/src/plugins/shikiCodeblocks.desktop/components/Code.tsx b/src/plugins/shikiCodeblocks.desktop/components/Code.tsx index 2794234df..5c924f8e9 100644 --- a/src/plugins/shikiCodeblocks.desktop/components/Code.tsx +++ b/src/plugins/shikiCodeblocks.desktop/components/Code.tsx @@ -16,11 +16,11 @@ * along with this program. If not, see . */ +import { cl } from "@plugins/shikiCodeblocks.desktop/utils/misc"; import type { IThemedToken } from "@vap/shiki"; import { hljs } from "@webpack/common"; import { JSX } from "react"; -import { cl } from "../utils/misc"; import { ThemeBase } from "./Highlighter"; export interface CodeProps { diff --git a/src/plugins/shikiCodeblocks.desktop/components/CopyButton.tsx b/src/plugins/shikiCodeblocks.desktop/components/CopyButton.tsx index 153b3cddb..6ec811054 100644 --- a/src/plugins/shikiCodeblocks.desktop/components/CopyButton.tsx +++ b/src/plugins/shikiCodeblocks.desktop/components/CopyButton.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { useCopyCooldown } from "../hooks/useCopyCooldown"; +import { useCopyCooldown } from "@plugins/shikiCodeblocks.desktop/hooks/useCopyCooldown"; export interface CopyButtonProps extends React.DetailedHTMLProps, HTMLButtonElement> { content: string; diff --git a/src/plugins/shikiCodeblocks.desktop/components/Header.tsx b/src/plugins/shikiCodeblocks.desktop/components/Header.tsx index 320dde973..7f2888c5a 100644 --- a/src/plugins/shikiCodeblocks.desktop/components/Header.tsx +++ b/src/plugins/shikiCodeblocks.desktop/components/Header.tsx @@ -16,9 +16,9 @@ * along with this program. If not, see . */ -import { Language } from "../api/languages"; -import { DeviconSetting } from "../types"; -import { cl } from "../utils/misc"; +import { Language } from "@plugins/shikiCodeblocks.desktop/api/languages"; +import { DeviconSetting } from "@plugins/shikiCodeblocks.desktop/types"; +import { cl } from "@plugins/shikiCodeblocks.desktop/utils/misc"; export interface HeaderProps { langName?: string; diff --git a/src/plugins/shikiCodeblocks.desktop/components/Highlighter.tsx b/src/plugins/shikiCodeblocks.desktop/components/Highlighter.tsx index b4682240c..8bacf0cb8 100644 --- a/src/plugins/shikiCodeblocks.desktop/components/Highlighter.tsx +++ b/src/plugins/shikiCodeblocks.desktop/components/Highlighter.tsx @@ -17,15 +17,15 @@ */ import ErrorBoundary from "@components/ErrorBoundary"; +import { resolveLang } from "@plugins/shikiCodeblocks.desktop/api/languages"; +import { shiki } from "@plugins/shikiCodeblocks.desktop/api/shiki"; +import { useShikiSettings } from "@plugins/shikiCodeblocks.desktop/hooks/useShikiSettings"; +import { useTheme } from "@plugins/shikiCodeblocks.desktop/hooks/useTheme"; +import { hex2Rgb } from "@plugins/shikiCodeblocks.desktop/utils/color"; +import { cl, shouldUseHljs } from "@plugins/shikiCodeblocks.desktop/utils/misc"; import { useAwaiter, useIntersection } from "@utils/react"; import { hljs, React } from "@webpack/common"; -import { resolveLang } from "../api/languages"; -import { shiki } from "../api/shiki"; -import { useShikiSettings } from "../hooks/useShikiSettings"; -import { useTheme } from "../hooks/useTheme"; -import { hex2Rgb } from "../utils/color"; -import { cl, shouldUseHljs } from "../utils/misc"; import { ButtonRow } from "./ButtonRow"; import { Code } from "./Code"; import { Header } from "./Header"; diff --git a/src/plugins/shikiCodeblocks.desktop/hooks/useShikiSettings.ts b/src/plugins/shikiCodeblocks.desktop/hooks/useShikiSettings.ts index 020d77dba..5413db0e6 100644 --- a/src/plugins/shikiCodeblocks.desktop/hooks/useShikiSettings.ts +++ b/src/plugins/shikiCodeblocks.desktop/hooks/useShikiSettings.ts @@ -16,11 +16,10 @@ * along with this program. If not, see . */ +import { shiki } from "@plugins/shikiCodeblocks.desktop/api/shiki"; +import { settings as pluginSettings, ShikiSettings } from "@plugins/shikiCodeblocks.desktop/settings"; import { React } from "@webpack/common"; -import { shiki } from "../api/shiki"; -import { settings as pluginSettings, ShikiSettings } from "../settings"; - export function useShikiSettings(settingKeys: F[]) { const settings = pluginSettings.use([...settingKeys, "customTheme", "theme"]); const [isLoading, setLoading] = React.useState(false); diff --git a/src/plugins/shikiCodeblocks.desktop/utils/misc.ts b/src/plugins/shikiCodeblocks.desktop/utils/misc.ts index 1319a2f24..ee782ec05 100644 --- a/src/plugins/shikiCodeblocks.desktop/utils/misc.ts +++ b/src/plugins/shikiCodeblocks.desktop/utils/misc.ts @@ -17,12 +17,11 @@ */ import { classNameFactory } from "@api/Styles"; +import { resolveLang } from "@plugins/shikiCodeblocks.desktop/api/languages"; +import { HighlighterProps } from "@plugins/shikiCodeblocks.desktop/components/Highlighter"; +import { HljsSetting } from "@plugins/shikiCodeblocks.desktop/types"; import { hljs } from "@webpack/common"; -import { resolveLang } from "../api/languages"; -import { HighlighterProps } from "../components/Highlighter"; -import { HljsSetting } from "../types"; - export const cl = classNameFactory("vc-shiki-"); export const shouldUseHljs = ({ diff --git a/src/plugins/showConnections/index.tsx b/src/plugins/showConnections/index.tsx index c0080a68e..ee15fc5ab 100644 --- a/src/plugins/showConnections/index.tsx +++ b/src/plugins/showConnections/index.tsx @@ -18,17 +18,18 @@ import "./styles.css"; +import { isPluginEnabled } from "@api/PluginManager"; import { definePluginSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Flex } from "@components/Flex"; import { CopyIcon, LinkIcon } from "@components/Icons"; +import OpenInAppPlugin from "@plugins/openInApp"; import { Devs } from "@utils/constants"; -import { copyWithToast } from "@utils/misc"; +import { copyWithToast } from "@utils/discord"; import definePlugin, { OptionType } from "@utils/types"; import { ConnectedAccount, User } from "@vencord/discord-types"; import { findByCodeLazy, findByPropsLazy } from "@webpack"; import { Tooltip, UserProfileStore } from "@webpack/common"; -import OpenInAppPlugin from "plugins/openInApp"; import { VerifiedIcon } from "./VerifiedIcon"; @@ -133,7 +134,7 @@ function CompactConnectionComponent({ connection, theme }: { connection: Connect target="_blank" rel="noreferrer" onClick={e => { - if (Vencord.Plugins.isPluginEnabled("OpenInApp")) { + if (isPluginEnabled(OpenInAppPlugin.name)) { // handleLink will .preventDefault() if applicable OpenInAppPlugin.handleLink(e.currentTarget, e); } diff --git a/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx b/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx index 4543301b7..7dec55ac6 100644 --- a/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx +++ b/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx @@ -16,16 +16,18 @@ * along with this program. If not, see . */ +import { isPluginEnabled } from "@api/PluginManager"; import { Settings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; +import PermissionsViewerPlugin from "@plugins/permissionsViewer"; +import openRolesAndUsersPermissionsModal, { PermissionType, RoleOrUserPermission } from "@plugins/permissionsViewer/components/RolesAndUsersPermissions"; +import { sortPermissionOverwrites } from "@plugins/permissionsViewer/utils"; import { classes } from "@utils/misc"; import { formatDuration } from "@utils/text"; import type { Channel } from "@vencord/discord-types"; import { findByPropsLazy, findComponentByCodeLazy } from "@webpack"; import { EmojiStore, FluxDispatcher, GuildMemberStore, GuildStore, Parser, PermissionsBits, PermissionStore, SnowflakeUtils, Text, Timestamp, Tooltip, useEffect, useState } from "@webpack/common"; -import openRolesAndUsersPermissionsModal, { PermissionType, RoleOrUserPermission } from "../../permissionsViewer/components/RolesAndUsersPermissions"; -import { sortPermissionOverwrites } from "../../permissionsViewer/utils"; import { cl, settings } from ".."; const enum SortOrderTypes { @@ -274,7 +276,7 @@ function HiddenChannelLockScreen({ channel }: { channel: ExtendedChannel; }) { }
- {Vencord.Plugins.isPluginEnabled("PermissionsViewer") && ( + {isPluginEnabled(PermissionsViewerPlugin.name) && ( {({ onMouseLeave, onMouseEnter }) => ( + - - - You can import and export your Vencord settings as a JSON file. - This allows you to easily transfer your settings to another device, - or recover your settings after reinstalling Vencord or Discord. - - - Settings Export contains: -
    -
  • — Custom QuickCSS
  • -
  • — Theme Links
  • -
  • — Plugin Settings
  • -
-
- - - - + ); } diff --git a/src/components/settings/tabs/themes/CspErrorCard.tsx b/src/components/settings/tabs/themes/CspErrorCard.tsx index f6486374d..685b9a91a 100644 --- a/src/components/settings/tabs/themes/CspErrorCard.tsx +++ b/src/components/settings/tabs/themes/CspErrorCard.tsx @@ -50,7 +50,7 @@ export function CspErrorCard() { const hasImgurHtmlDomain = errors.some(isImgurHtmlDomain); return ( - + Blocked Resources Some images, styles, or fonts were blocked because they come from disallowed domains. It is highly recommended to move them to GitHub or Imgur. But you may also allow domains if you fully trust them. diff --git a/src/components/settings/tabs/themes/LocalThemesTab.tsx b/src/components/settings/tabs/themes/LocalThemesTab.tsx index cea4d7306..02554b680 100644 --- a/src/components/settings/tabs/themes/LocalThemesTab.tsx +++ b/src/components/settings/tabs/themes/LocalThemesTab.tsx @@ -7,6 +7,8 @@ import { isPluginEnabled } from "@api/PluginManager"; import { Settings, useSettings } from "@api/Settings"; import { classNameFactory } from "@api/Styles"; +import { Card } from "@components/Card"; +import { Flex } from "@components/Flex"; import { FolderIcon, PaintbrushIcon, PencilIcon, PlusIcon, RestartIcon } from "@components/Icons"; import { Link } from "@components/Link"; import { QuickAction, QuickActionCard } from "@components/settings/QuickAction"; @@ -14,7 +16,7 @@ import { openPluginModal } from "@components/settings/tabs/plugins/PluginModal"; import { UserThemeHeader } from "@main/themes"; import ClientThemePlugin from "@plugins/clientTheme"; import { findLazy } from "@webpack"; -import { Card, Forms, useEffect, useRef, useState } from "@webpack/common"; +import { Forms, useEffect, useRef, useState } from "@webpack/common"; import type { ComponentType, Ref, SyntheticEvent } from "react"; import { ThemeCard } from "./ThemeCard"; @@ -82,8 +84,8 @@ export function LocalThemesTab() { } return ( - <> - + + Find Themes:
@@ -94,7 +96,7 @@ export function LocalThemesTab() { If using the BD site, click on "Download" and place the downloaded .theme.css file into your themes folder. - + External Resources For security reasons, loading resources (styles, fonts, images, ...) from most sites is blocked. Make sure all your assets are hosted on GitHub, GitLab, Codeberg, Imgur, Discord or Google Fonts. @@ -167,6 +169,6 @@ export function LocalThemesTab() { ))}
- +
); } diff --git a/src/components/settings/tabs/themes/OnlineThemesTab.tsx b/src/components/settings/tabs/themes/OnlineThemesTab.tsx index 7db955fd9..c314b872a 100644 --- a/src/components/settings/tabs/themes/OnlineThemesTab.tsx +++ b/src/components/settings/tabs/themes/OnlineThemesTab.tsx @@ -5,9 +5,9 @@ */ import { useSettings } from "@api/Settings"; -import { Margins } from "@utils/margins"; -import { classes } from "@utils/misc"; -import { Card, Forms, TextArea, useState } from "@webpack/common"; +import { Card } from "@components/Card"; +import { Flex } from "@components/Flex"; +import { Forms, TextArea, useState } from "@webpack/common"; export function OnlineThemesTab() { const settings = useSettings(["themeLinks"]); @@ -26,14 +26,14 @@ export function OnlineThemesTab() { } return ( - <> - + + This section is for advanced users. If you are having difficulties using it, use the Local Themes tab instead. - + Paste links to css files here One link per line You can prefix lines with @light or @dark to toggle them based on your Discord theme @@ -52,6 +52,6 @@ export function OnlineThemesTab() { rows={10} /> - + ); } diff --git a/src/components/settings/tabs/themes/index.tsx b/src/components/settings/tabs/themes/index.tsx index 40653a4c3..7d2234459 100644 --- a/src/components/settings/tabs/themes/index.tsx +++ b/src/components/settings/tabs/themes/index.tsx @@ -18,10 +18,11 @@ import "./styles.css"; +import { Card } from "@components/Card"; import { Link } from "@components/Link"; import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab"; import { getStylusWebStoreUrl } from "@utils/web"; -import { Card, Forms, React, TabBar, useState } from "@webpack/common"; +import { Forms, React, TabBar, useState } from "@webpack/common"; import { CspErrorCard } from "./CspErrorCard"; import { LocalThemesTab } from "./LocalThemesTab"; @@ -69,7 +70,7 @@ function ThemesTab() { function UserscriptThemesTab() { return ( - + Themes are not supported on the Userscript! diff --git a/src/components/settings/tabs/updater/Components.tsx b/src/components/settings/tabs/updater/Components.tsx index adc7e1908..f30587d59 100644 --- a/src/components/settings/tabs/updater/Components.tsx +++ b/src/components/settings/tabs/updater/Components.tsx @@ -4,6 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { Card } from "@components/Card"; import { ErrorCard } from "@components/ErrorCard"; import { Flex } from "@components/Flex"; import { Link } from "@components/Link"; @@ -11,7 +12,7 @@ import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; import { relaunch } from "@utils/native"; import { changes, checkForUpdates, update, updateError } from "@utils/updater"; -import { Alerts, Button, Card, Forms, React, Toasts, useState } from "@webpack/common"; +import { Alerts, Button, Forms, React, Toasts, useState } from "@webpack/common"; import { runWithDispatch } from "./runWithDispatch"; @@ -30,7 +31,7 @@ export function HashLink({ repo, hash, disabled = false }: { repo: string, hash: export function Changes({ updates, repo, repoPending }: CommonProps & { updates: typeof changes; }) { return ( - + {updates.map(({ hash, author, message }) => (
- Updater Settings + Updater Settings + Please do not private message Vencord plugin developers for support!
Instead, use the Vencord support channel: {Parser.parse("https://discord.com/channels/1015060230222131221/1026515880080842772")} diff --git a/src/plugins/fakeProfileThemes/index.tsx b/src/plugins/fakeProfileThemes/index.tsx index e6de5df03..76826d9d8 100644 --- a/src/plugins/fakeProfileThemes/index.tsx +++ b/src/plugins/fakeProfileThemes/index.tsx @@ -22,6 +22,7 @@ import "./styles.css"; import { definePluginSettings } from "@api/Settings"; import { Divider } from "@components/Divider"; import ErrorBoundary from "@components/ErrorBoundary"; +import { Flex } from "@components/Flex"; import { Devs } from "@utils/constants"; import { copyWithToast, fetchUserProfile } from "@utils/discord"; import { Margins } from "@utils/margins"; @@ -30,7 +31,7 @@ import { useAwaiter } from "@utils/react"; import definePlugin, { OptionType } from "@utils/types"; import { User, UserProfile } from "@vencord/discord-types"; import { findComponentByCodeLazy } from "@webpack"; -import { Button, ColorPicker, Flex, Forms, React, Text, UserProfileStore, UserStore, useState } from "@webpack/common"; +import { Button, ColorPicker, Forms, React, Text, UserProfileStore, UserStore, useState } from "@webpack/common"; import virtualMerge from "virtual-merge"; interface Colors { @@ -119,23 +120,19 @@ function SettingsAboutComponent() { After enabling this plugin, you will see custom colors in the profiles of other people using compatible plugins.{" "} -
- To set your own colors: +
+ + To set your own profile theme colors:
    -
  • - • use the color pickers below to choose your colors -
  • -
  • • click the "Copy 3y3" button
  • -
  • • paste the invisible text anywhere in your bio
  • -

+
  • — use the color pickers below to choose your colors
  • +
  • — click the "Copy 3y3" button
  • +
  • — paste the invisible text anywhere in your bio
  • + Color pickers - + Copy 3y3 diff --git a/src/plugins/replaceGoogleSearch/index.tsx b/src/plugins/replaceGoogleSearch/index.tsx index bfa9b1768..515db54ff 100644 --- a/src/plugins/replaceGoogleSearch/index.tsx +++ b/src/plugins/replaceGoogleSearch/index.tsx @@ -6,9 +6,10 @@ import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; import { definePluginSettings } from "@api/Settings"; +import { Flex } from "@components/Flex"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -import { Flex, Menu } from "@webpack/common"; +import { Menu } from "@webpack/common"; const DefaultEngines = { Google: "https://www.google.com/search?q=", @@ -93,7 +94,7 @@ function makeSearchItem(src: string) { key={key} id={key} label={ - + - + diff --git a/src/plugins/voiceMessages/index.tsx b/src/plugins/voiceMessages/index.tsx index 68751a0fe..4210d89ca 100644 --- a/src/plugins/voiceMessages/index.tsx +++ b/src/plugins/voiceMessages/index.tsx @@ -19,6 +19,7 @@ import "./styles.css"; import { NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { Card } from "@components/Card"; import { Microphone } from "@components/Icons"; import { Link } from "@components/Link"; import { Paragraph } from "@components/Paragraph"; @@ -31,7 +32,7 @@ import { chooseFile } from "@utils/web"; import { CloudUpload as TCloudUpload } from "@vencord/discord-types"; import { CloudUploadPlatform } from "@vencord/discord-types/enums"; import { findByPropsLazy, findLazy, findStoreLazy } from "@webpack"; -import { Button, Card, Constants, FluxDispatcher, Forms, lodash, Menu, MessageActions, PermissionsBits, PermissionStore, RestAPI, SelectedChannelStore, showToast, SnowflakeUtils, Toasts, useEffect, useState } from "@webpack/common"; +import { Button, Constants, FluxDispatcher, Forms, lodash, Menu, MessageActions, PermissionsBits, PermissionStore, RestAPI, SelectedChannelStore, showToast, SnowflakeUtils, Toasts, useEffect, useState } from "@webpack/common"; import { ComponentType } from "react"; import { VoiceRecorderDesktop } from "./DesktopRecorder"; @@ -226,7 +227,7 @@ function Modal({ modalProps }: { modalProps: ModalProps; }) { )} {isUnsupportedFormat && ( - + Voice Messages have to be OggOpus to be playable on iOS. This file is {blob.type} so it will not be playable on iOS. diff --git a/src/webpack/common/components.ts b/src/webpack/common/components.ts index cc282fd91..659cd8dfd 100644 --- a/src/webpack/common/components.ts +++ b/src/webpack/common/components.ts @@ -30,7 +30,9 @@ import { waitForComponent } from "./internal"; export const Forms = { // TODO: Stop using this and use Heading/Paragraph directly + /** @deprecated use Heading from Vencord */ FormTitle: Heading, + /** @deprecated use Paragraph from Vencord */ FormText: Paragraph, /** @deprecated don't use this */ FormSection: "section" as never, // Backwards compat since Vesktop uses this @@ -39,12 +41,15 @@ export const Forms = { }; // TODO: Stop using this and use Paragraph/Span directly +/** @deprecated use Paragraph, Span, or BaseText from Vencord */ export const Text = TextCompat; +/** @deprecated use Button from Vencord */ export const Button = ButtonCompat; /** @deprecated Use FormSwitch from Vencord */ export const Switch = FormSwitchCompat as never; -export const Card = waitForComponent("Card", filters.componentByCode(".editable),", ".outline:")); +/** @deprecated Use Card from Vencord */ +export const Card = waitForComponent("Card", filters.componentByCode(".editable),", ".outline:")); export const Checkbox = waitForComponent("Checkbox", filters.componentByCode(".checkboxWrapperDisabled:")); const Tooltips = mapMangledModuleLazy(".tooltipTop,bottom:", { @@ -55,6 +60,7 @@ const Tooltips = mapMangledModuleLazy(".tooltipTop,bottom:", { TooltipContainer: t.TooltipContainer; }; +// TODO: if these finds break, they should just return their children export const Tooltip = LazyComponent(() => Tooltips.Tooltip); export const TooltipContainer = LazyComponent(() => Tooltips.TooltipContainer); @@ -67,6 +73,7 @@ export const Popout = waitForComponent("Popout", filters.componentByCo export const Dialog = waitForComponent("Dialog", filters.componentByCode('role:"dialog",tabIndex:-1')); export const TabBar = waitForComponent("TabBar", filters.componentByCode("ref:this.tabBarRef,className:")); export const Paginator = waitForComponent("Paginator", filters.componentByCode('rel:"prev",children:')); +// TODO: remake this component export const Clickable = waitForComponent("Clickable", filters.componentByCode("this.context?this.renderNonInteractive():")); export const Avatar = waitForComponent("Avatar", filters.componentByCode(".size-1.375*")); @@ -106,7 +113,6 @@ waitFor(m => { export const MaskedLink = waitForComponent("MaskedLink", filters.componentByCode("MASKED_LINK)")); export const Timestamp = waitForComponent("Timestamp", filters.componentByCode("#{intl::MESSAGE_EDITED_TIMESTAMP_A11Y_LABEL}")); -export const Flex = waitForComponent("Flex", ["Justify", "Align", "Wrap"]); export const OAuth2AuthorizeModal = waitForComponent("OAuth2AuthorizeModal", filters.componentByCode(".authorize,children:", ".contentBackground")); export const Animations = mapMangledModuleLazy(".assign({colorNames:", { From ddc1b341503cb00787b20ef6e48313be425e473e Mon Sep 17 00:00:00 2001 From: Vendicated Date: Wed, 19 Nov 2025 02:37:16 +0100 Subject: [PATCH 5/7] Plugin settings: add api/user plugins filter --- .../settings/tabs/plugins/index.tsx | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/components/settings/tabs/plugins/index.tsx b/src/components/settings/tabs/plugins/index.tsx index 56cfe582f..135ecd3cf 100644 --- a/src/components/settings/tabs/plugins/index.tsx +++ b/src/components/settings/tabs/plugins/index.tsx @@ -29,6 +29,7 @@ import { HeadingTertiary } from "@components/Heading"; import { Paragraph } from "@components/Paragraph"; import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab"; import { ChangeList } from "@utils/ChangeList"; +import { isTruthy } from "@utils/guards"; import { Logger } from "@utils/Logger"; import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; @@ -36,7 +37,7 @@ import { useAwaiter, useCleanupEffect } from "@utils/react"; import { Alerts, Button, lodash, Parser, React, Select, TextInput, Tooltip, useMemo, useState } from "@webpack/common"; import { JSX } from "react"; -import Plugins, { ExcludedPlugins } from "~plugins"; +import Plugins, { ExcludedPlugins, PluginMeta } from "~plugins"; import { PluginCard } from "./PluginCard"; @@ -73,12 +74,16 @@ const enum SearchStatus { ALL, ENABLED, DISABLED, - NEW + NEW, + USER_PLUGINS, + API_PLUGINS } function ExcludedPluginsList({ search }: { search: string; }) { - const matchingExcludedPlugins = Object.entries(ExcludedPlugins) - .filter(([name]) => name.toLowerCase().includes(search)); + const matchingExcludedPlugins = search + ? Object.entries(ExcludedPlugins) + .filter(([name]) => name.toLowerCase().includes(search)) + : []; const ExcludedReasons: Record<"web" | "discordDesktop" | "vesktop" | "desktop" | "dev", string> = { desktop: "Discord Desktop app or Vesktop", @@ -151,6 +156,8 @@ function PluginSettings() { [] ); + const hasUserPlugins = useMemo(() => !IS_STANDALONE && Object.values(PluginMeta).some(m => m.userPlugin), []); + const [searchValue, setSearchValue] = useState({ value: "", status: SearchStatus.ALL }); const search = searchValue.value.toLowerCase(); @@ -171,6 +178,12 @@ function PluginSettings() { case SearchStatus.NEW: if (!newPlugins?.includes(plugin.name)) return false; break; + case SearchStatus.USER_PLUGINS: + if (!PluginMeta[plugin.name]?.userPlugin) return false; + break; + case SearchStatus.API_PLUGINS: + if (!plugin.name.endsWith("API")) return false; + break; } if (!search.length) return true; @@ -202,7 +215,7 @@ function PluginSettings() { const plugins = [] as JSX.Element[]; const requiredPlugins = [] as JSX.Element[]; - const showApi = searchValue.value.includes("API"); + const showApi = searchValue.status === SearchStatus.API_PLUGINS; for (const p of sortedPlugins) { if (p.hidden || (!p.options && p.name.endsWith("API") && !showApi)) continue; @@ -262,8 +275,10 @@ function PluginSettings() { { label: "Show All", value: SearchStatus.ALL, default: true }, { label: "Show Enabled", value: SearchStatus.ENABLED }, { label: "Show Disabled", value: SearchStatus.DISABLED }, - { label: "Show New", value: SearchStatus.NEW } - ]} + { label: "Show New", value: SearchStatus.NEW }, + hasUserPlugins && { label: "Show UserPlugins", value: SearchStatus.USER_PLUGINS }, + { label: "Show API Plugins", value: SearchStatus.API_PLUGINS }, + ].filter(isTruthy)} serialize={String} select={onStatusChange} isSelected={v => v === searchValue.status} From f91c6d983aef1f2fceabe7e2764935791d9a159f Mon Sep 17 00:00:00 2001 From: Vendicated Date: Wed, 19 Nov 2025 02:57:12 +0100 Subject: [PATCH 6/7] upgrade dependencies --- eslint.config.mjs | 4 +- package.json | 36 +- patches/eslint@9.20.1.patch | 49 - pnpm-lock.yaml | 1708 ++++++++++------- scripts/generateReport.ts | 2 +- src/api/Styles.ts | 9 +- .../settings/tabs/plugins/styles.css | 2 +- src/components/settings/tabs/styles.css | 2 +- .../settings/tabs/themes/styles.css | 4 +- src/globals.d.ts | 9 +- .../messageLogger/deleteStyleOverlay.css | 4 +- tsconfig.json | 2 +- 12 files changed, 1070 insertions(+), 761 deletions(-) delete mode 100644 patches/eslint@9.20.1.patch diff --git a/eslint.config.mjs b/eslint.config.mjs index d59c37532..99fb1fb2a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -90,7 +90,7 @@ export default tseslint.config( "@stylistic/no-extra-semi": "error", // TS Rules - "@stylistic/func-call-spacing": ["error", "never"], + "@stylistic/function-call-spacing": ["error", "never"], // ESLint Rules "yoda": "error", @@ -115,7 +115,7 @@ export default tseslint.config( "no-useless-escape": [ "error", { - "extra": "i" + "allowRegexCharacters": ["i"] } ], "no-fallthrough": "error", diff --git a/package.json b/package.json index 2fe739f55..e267b04c1 100644 --- a/package.json +++ b/package.json @@ -40,49 +40,47 @@ "@vap/shiki": "0.10.5", "fflate": "^0.8.2", "gifenc": "github:mattdesl/gifenc#64842fca317b112a8590f8fef2bf3825da8f6fe3", - "monaco-editor": "^0.52.2", - "nanoid": "^5.1.5", + "monaco-editor": "^0.54.0", + "nanoid": "^5.1.6", "virtual-merge": "^1.0.1" }, "devDependencies": { - "@stylistic/eslint-plugin": "^4.2.0", - "@types/chrome": "^0.0.312", - "@types/diff": "^7.0.2", - "@types/lodash": "^4.17.14", + "@stylistic/eslint-plugin": "^5.6.0", + "@types/chrome": "^0.1.30", + "@types/lodash": "^4.17.20", "@types/node": "^24.10.1", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", - "@types/yazl": "^2.4.5", + "@types/yazl": "^3.3.0", "@vencord/discord-types": "link:packages/discord-types", - "diff": "^7.0.0", - "esbuild": "^0.25.1", - "eslint": "9.20.1", + "diff": "^8.0.2", + "esbuild": "^0.27.0", + "eslint": "9.39.1", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-path-alias": "2.1.0", - "eslint-plugin-react": "^7.37.3", + "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.1.4", + "eslint-plugin-unused-imports": "^4.3.0", "highlight.js": "11.11.1", "html-minifier-terser": "^7.2.0", "moment": "^2.22.2", - "puppeteer-core": "^24.4.0", + "puppeteer-core": "^24.30.0", "standalone-electron-types": "^34.2.0", - "stylelint": "^16.17.0", - "stylelint-config-standard": "^37.0.0", + "stylelint": "^16.25.0", + "stylelint-config-standard": "^39.0.1", "ts-patch": "^3.3.0", "ts-pattern": "^5.6.0", - "tsx": "^4.19.3", - "type-fest": "^4.38.0", + "tsx": "^4.20.6", + "type-fest": "^5.2.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.28.0", + "typescript-eslint": "^8.47.0", "typescript-transform-paths": "^3.5.5", "zip-local": "^0.3.5" }, "packageManager": "pnpm@10.4.1", "pnpm": { "patchedDependencies": { - "eslint@9.20.1": "patches/eslint@9.20.1.patch", "eslint-plugin-path-alias@2.1.0": "patches/eslint-plugin-path-alias@2.1.0.patch" }, "peerDependencyRules": { diff --git a/patches/eslint@9.20.1.patch b/patches/eslint@9.20.1.patch deleted file mode 100644 index c91e45d56..000000000 --- a/patches/eslint@9.20.1.patch +++ /dev/null @@ -1,49 +0,0 @@ -diff --git a/lib/rules/no-useless-escape.js b/lib/rules/no-useless-escape.js -index 0e0f6f09f2c35f3276173c08f832cde9f2cf56a0..7dc22851715f3574d935f513c1b5e35552985711 100644 ---- a/lib/rules/no-useless-escape.js -+++ b/lib/rules/no-useless-escape.js -@@ -65,13 +65,31 @@ module.exports = { - escapeBackslash: "Replace the `\\` with `\\\\` to include the actual backslash character." - }, - -- schema: [] -+ schema: [{ -+ type: "object", -+ properties: { -+ extra: { -+ type: "string", -+ default: "" -+ }, -+ extraCharClass: { -+ type: "string", -+ default: "" -+ }, -+ }, -+ additionalProperties: false -+ }] - }, - - create(context) { -+ const options = context.options[0] || {}; -+ const { extra, extraCharClass } = options; - const sourceCode = context.sourceCode; - const parser = new RegExpParser(); - -+ const NON_CHARCLASS_ESCAPES = union(REGEX_NON_CHARCLASS_ESCAPES, new Set(extra)); -+ const CHARCLASS_ESCAPES = union(REGEX_GENERAL_ESCAPES, new Set(extraCharClass)); -+ - /** - * Reports a node - * @param {ASTNode} node The node to report -@@ -200,9 +218,9 @@ module.exports = { - let allowedEscapes; - - if (characterClassStack.length) { -- allowedEscapes = unicodeSets ? REGEX_CLASSSET_CHARACTER_ESCAPES : REGEX_GENERAL_ESCAPES; -+ allowedEscapes = unicodeSets ? REGEX_CLASSSET_CHARACTER_ESCAPES : CHARCLASS_ESCAPES; - } else { -- allowedEscapes = REGEX_NON_CHARCLASS_ESCAPES; -+ allowedEscapes = NON_CHARCLASS_ESCAPES; - } - if (allowedEscapes.has(escapedChar)) { - return; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74de81971..92c50e4e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ patchedDependencies: eslint-plugin-path-alias@2.1.0: hash: 87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727 path: patches/eslint-plugin-path-alias@2.1.0.patch - eslint@9.20.1: - hash: 4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215 - path: patches/eslint@9.20.1.patch importers: @@ -32,27 +29,24 @@ importers: specifier: github:mattdesl/gifenc#64842fca317b112a8590f8fef2bf3825da8f6fe3 version: https://codeload.github.com/mattdesl/gifenc/tar.gz/64842fca317b112a8590f8fef2bf3825da8f6fe3 monaco-editor: - specifier: ^0.52.2 - version: 0.52.2 + specifier: ^0.54.0 + version: 0.54.0 nanoid: - specifier: ^5.1.5 - version: 5.1.5 + specifier: ^5.1.6 + version: 5.1.6 virtual-merge: specifier: ^1.0.1 version: 1.0.2 devDependencies: '@stylistic/eslint-plugin': - specifier: ^4.2.0 - version: 4.2.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) + specifier: ^5.6.0 + version: 5.6.0(eslint@9.39.1) '@types/chrome': - specifier: ^0.0.312 - version: 0.0.312 - '@types/diff': - specifier: ^7.0.2 - version: 7.0.2 + specifier: ^0.1.30 + version: 0.1.30 '@types/lodash': - specifier: ^4.17.14 - version: 4.17.15 + specifier: ^4.17.20 + version: 4.17.20 '@types/node': specifier: ^24.10.1 version: 24.10.1 @@ -63,38 +57,38 @@ importers: specifier: ^19.0.4 version: 19.0.4(@types/react@19.0.12) '@types/yazl': - specifier: ^2.4.5 - version: 2.4.6 + specifier: ^3.3.0 + version: 3.3.0 '@vencord/discord-types': specifier: link:packages/discord-types version: link:packages/discord-types diff: - specifier: ^7.0.0 - version: 7.0.0 + specifier: ^8.0.2 + version: 8.0.2 esbuild: - specifier: ^0.25.1 - version: 0.25.1 + specifier: ^0.27.0 + version: 0.27.0 eslint: - specifier: 9.20.1 - version: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + specifier: 9.39.1 + version: 9.39.1 eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))) + 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)) eslint-plugin-path-alias: specifier: 2.1.0 - version: 2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + version: 2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.39.1) eslint-plugin-react: - specifier: ^7.37.3 - version: 7.37.4(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + specifier: ^7.37.5 + version: 7.37.5(eslint@9.39.1) eslint-plugin-simple-header: specifier: ^1.2.1 - version: 1.2.2(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + version: 1.2.2(eslint@9.39.1) eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + version: 12.1.1(eslint@9.39.1) eslint-plugin-unused-imports: - specifier: ^4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + 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) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -105,17 +99,17 @@ importers: specifier: ^2.22.2 version: 2.30.1 puppeteer-core: - specifier: ^24.4.0 - version: 24.4.0 + specifier: ^24.30.0 + version: 24.30.0 standalone-electron-types: specifier: ^34.2.0 version: 34.2.0 stylelint: - specifier: ^16.17.0 - version: 16.17.0(typescript@5.9.3) + specifier: ^16.25.0 + version: 16.25.0(typescript@5.9.3) stylelint-config-standard: - specifier: ^37.0.0 - version: 37.0.0(stylelint@16.17.0(typescript@5.9.3)) + specifier: ^39.0.1 + version: 39.0.1(stylelint@16.25.0(typescript@5.9.3)) ts-patch: specifier: ^3.3.0 version: 3.3.0 @@ -123,17 +117,17 @@ importers: specifier: ^5.6.0 version: 5.6.2 tsx: - specifier: ^4.19.3 - version: 4.19.3 + specifier: ^4.20.6 + version: 4.20.6 type-fest: - specifier: ^4.38.0 - version: 4.38.0 + specifier: ^5.2.0 + version: 5.2.0 typescript: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.28.0 - version: 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) + specifier: ^8.47.0 + version: 8.47.0(eslint@9.39.1)(typescript@5.9.3) typescript-transform-paths: specifier: ^3.5.5 version: 3.5.5(typescript@5.9.3) @@ -195,30 +189,36 @@ importers: packages: - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + '@cacheable/memory@2.0.5': + resolution: {integrity: sha512-fkiAxCvssEyJZ5fxX4tcdZFRmW9JehSTGvvqmXn6rTzG5cH6V/3C4ad8yb01vOjp2xBydHkHrgpW0qeGtzt6VQ==} + + '@cacheable/utils@2.3.1': + resolution: {integrity: sha512-38NJXjIr4W1Sghun8ju+uYWD8h2c61B4dKwfnQHVDFpAJ9oS28RpfqZQJ6Dgd3RceGkILDY9YT+72HJR3LoeSQ==} + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@csstools/media-query-list-parser@4.0.2': - resolution: {integrity: sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==} + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 '@csstools/selector-specificity@5.0.0': resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} @@ -226,215 +226,373 @@ packages: peerDependencies: postcss-selector-parser: ^7.0.0 - '@dual-bundle/import-meta-resolve@4.1.0': - resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + '@dual-bundle/import-meta-resolve@4.2.1': + resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + 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/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.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@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/core@0.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.20.0': - resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + '@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.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@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.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@intrnl/xxhash64@0.1.2': @@ -461,8 +619,14 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@keyv/serialize@1.0.3': - resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} + '@keyv/bigmap@1.3.0': + resolution: {integrity: sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.5.4 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -476,16 +640,16 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@puppeteer/browsers@2.8.0': - resolution: {integrity: sha512-yTwt2KWRmCQAfhvbCRjebaSX8pV1//I0Y3g+A7f/eS7gf0l4eRJoUCvcYdVtboeU4CTOZQuqYbZNS8aBYb8ROQ==} + '@puppeteer/browsers@2.10.13': + resolution: {integrity: sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==} engines: {node: '>=18'} hasBin: true '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@stylistic/eslint-plugin@4.2.0': - resolution: {integrity: sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==} + '@stylistic/eslint-plugin@5.6.0': + resolution: {integrity: sha512-owEc4B8ME+O/xyZOkLVyLqPMsUgJXIM4XzCm5Vt3WvRXpyoOfYxgA+JkEiFqXPCI8+Nc2BzAT+KGAK7QleGs8Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -493,14 +657,11 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/chrome@0.0.312': - resolution: {integrity: sha512-m204djOoU/YqF1dRw3YLk2L3tcDTYREUERDQDUAmROK3Rv94nLbMJ4uvjzr/Yj/A7SyEpTrpoCuXBKTuerEdqg==} + '@types/chrome@0.1.30': + resolution: {integrity: sha512-rcP14i+ip4s3SLG6JzNOWIDd+0i8Bg+kBslHl8d4g6m/e2kEbWnR90AtlOPUZj9ONVRbKxnQUqsInxFzXyqLdA==} - '@types/diff@7.0.2': - resolution: {integrity: sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==} - - '@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==} @@ -526,6 +687,9 @@ 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/node@22.13.13': resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} @@ -555,54 +719,66 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@types/yazl@2.4.6': - resolution: {integrity: sha512-/ifFjQtcKaoZOjl5NNCQRR0fAKafB3Foxd7J/WvFPTMea46zekapcR30uzkwIkKAAuq5T6d0dkwz754RFH27hg==} + '@types/yazl@3.3.0': + resolution: {integrity: sha512-mFL6lGkk2N5u5nIxpNV/K5LW3qVSbxhJrMxYGOOxZndWxMgCamr/iCsq/1t9kd8pEwhuNP91LC5qZm/qS9pOEw==} - '@typescript-eslint/eslint-plugin@8.28.0': - resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==} + '@typescript-eslint/eslint-plugin@8.47.0': + resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.47.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.28.0': - resolution: {integrity: sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==} + '@typescript-eslint/parser@8.47.0': + resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.28.0': - resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} + '@typescript-eslint/project-service@8.47.0': + resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.47.0': + resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.28.0': - resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==} + '@typescript-eslint/tsconfig-utils@8.47.0': + resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.47.0': + resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.28.0': - resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} + '@typescript-eslint/types@8.47.0': + resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.28.0': - resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} + '@typescript-eslint/typescript-estree@8.47.0': + resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.28.0': - resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} + '@typescript-eslint/utils@8.47.0': + resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.28.0': - resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} + '@typescript-eslint/visitor-keys@8.47.0': + resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vap/core@0.0.12': @@ -626,8 +802,13 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} ajv@6.12.6: @@ -659,10 +840,6 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -727,8 +904,13 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -736,11 +918,16 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - bare-events@2.5.4: - resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true - bare-fs@4.0.2: - resolution: {integrity: sha512-S5mmkMesiduMqnz51Bfh0Et9EX0aTCJxhsI4bvzFFLs8Z1AV8RDHadfY5CyLwdoLHgXbNBEN1gQcbEtGwuvixw==} + bare-fs@4.5.1: + resolution: {integrity: sha512-zGUCsm3yv/ePt2PHNbVxjjn0nNB1MkIaR4wOCxJ2ig5pCf5cCVAYJXVhQg/3OhhJV6DB1ts7Hv0oUaElc2TPQg==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -748,15 +935,15 @@ packages: bare-buffer: optional: true - bare-os@3.6.1: - resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.5: - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} peerDependencies: bare-buffer: '*' bare-events: '*' @@ -766,8 +953,8 @@ packages: bare-events: optional: true - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} @@ -777,8 +964,8 @@ packages: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -793,15 +980,12 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} - cacheable@1.8.9: - resolution: {integrity: sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==} + cacheable@2.2.0: + resolution: {integrity: sha512-LEJxRqfeomiiRd2t0uON6hxAtgOoWDfY3fugebbz+J3vDLO+SkdfFChQcOHTZhj9SYa9iwE9MGYNX72dKiOE4w==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -826,8 +1010,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chromium-bidi@2.1.2: - resolution: {integrity: sha512-vtRWBK2uImo5/W2oG6/cDkkHSm+2t6VHgnj+Rcwhb0pP74OoUb4GipyRX/T/y39gYQPhioP0DPShn+A7P6CHNw==} + chromium-bidi@11.0.0: + resolution: {integrity: sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==} peerDependencies: devtools-protocol: '*' @@ -938,8 +1122,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -978,11 +1162,11 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - devtools-protocol@0.0.1413902: - resolution: {integrity: sha512-yRtvFD8Oyk7C9Os3GmnFZLu53yAfsnyw1s+mLmHHUK0GQEc9zthHWvS1r67Zqzm5t7v56PILHIVZ7kmFMaL2yQ==} + devtools-protocol@0.0.1521046: + resolution: {integrity: sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==} - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -993,6 +1177,9 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dompurify@3.1.7: + resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} + dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -1003,8 +1190,8 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} @@ -1014,12 +1201,8 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} - engines: {node: '>= 0.4'} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} @@ -1053,8 +1236,13 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} engines: {node: '>=18'} hasBin: true @@ -1116,8 +1304,8 @@ packages: peerDependencies: eslint: ^8.0.0 - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -1132,8 +1320,8 @@ packages: peerDependencies: eslint: '>=5.0.0' - eslint-plugin-unused-imports@4.1.4: - resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} + eslint-plugin-unused-imports@4.3.0: + resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} 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 @@ -1141,20 +1329,20 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.20.1: - resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1163,8 +1351,8 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -1191,6 +1379,9 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} @@ -1224,8 +1415,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} @@ -1240,8 +1431,8 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@10.0.7: - resolution: {integrity: sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==} + file-entry-cache@10.1.4: + resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -1267,8 +1458,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.7: - resolution: {integrity: sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==} + flat-cache@6.1.19: + resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -1304,6 +1495,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1327,8 +1522,11 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - get-uri@6.0.4: - resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} get-value@2.0.6: @@ -1431,6 +1629,10 @@ 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==} + engines: {node: '>=20'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1443,8 +1645,8 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookified@1.8.1: - resolution: {integrity: sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==} + hookified@1.13.0: + resolution: {integrity: sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==} html-minifier-terser@7.2.0: resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} @@ -1463,15 +1665,12 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.3: - resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -1493,8 +1692,8 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} is-accessor-descriptor@1.0.1: @@ -1571,8 +1770,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -1675,13 +1874,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -1717,8 +1913,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.3.2: - resolution: {integrity: sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==} + keyv@5.5.4: + resolution: {integrity: sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==} kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} @@ -1732,8 +1928,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.35.0: - resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + 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==} @@ -1771,6 +1967,11 @@ packages: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} + marked@14.0.0: + resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} + engines: {node: '>= 18'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1813,8 +2014,8 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - monaco-editor@0.52.2: - resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + monaco-editor@0.54.0: + resolution: {integrity: sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -1827,8 +2028,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.5: - resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true @@ -1971,8 +2172,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} possible-typed-array-names@1.1.0: @@ -1995,8 +2196,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2017,15 +2218,15 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.4.0: - resolution: {integrity: sha512-eFw66gCnWo0X8Hyf9KxxJtms7a61NJVMiSaWfItsFPzFBsjsWdmcNlBdsA1WVwln6neoHhsG+uTVesKmTREn/g==} + puppeteer-core@24.30.0: + resolution: {integrity: sha512-2S3Smy0t0W4wJnNvDe7W0bE7wDmZjfZ3ljfMgJd6hn2Hq/f0jgN+x9PULZo2U3fu5UUIJ+JP8cNUGllu8P91Pg==} engines: {node: '>=18'} q@1.5.1: @@ -2036,6 +2237,10 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + qified@0.5.2: + resolution: {integrity: sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==} + engines: {node: '>=20'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2134,6 +2339,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2198,8 +2408,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.4: - resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} source-map-js@1.2.1: @@ -2229,9 +2439,6 @@ packages: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} - 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==} @@ -2243,8 +2450,8 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamx@2.22.0: - resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -2281,20 +2488,20 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - stylelint-config-recommended@15.0.0: - resolution: {integrity: sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA==} + stylelint-config-recommended@17.0.0: + resolution: {integrity: sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==} engines: {node: '>=18.12.0'} peerDependencies: - stylelint: ^16.13.0 + stylelint: ^16.23.0 - stylelint-config-standard@37.0.0: - resolution: {integrity: sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA==} + stylelint-config-standard@39.0.1: + resolution: {integrity: sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A==} engines: {node: '>=18.12.0'} peerDependencies: - stylelint: ^16.13.0 + stylelint: ^16.23.0 - stylelint@16.17.0: - resolution: {integrity: sha512-I9OwVIWRMqVm2Br5iTbrfSqGRPWQUlvm6oXO1xZuYYu0Gpduy67N8wXOZv15p6E/JdlZiAtQaIoLKZEWk5hrjw==} + stylelint@16.25.0: + resolution: {integrity: sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -2317,8 +2524,12 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tar-fs@3.0.8: - resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -2367,6 +2578,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2379,6 +2595,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.2.0: + resolution: {integrity: sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==} + engines: {node: '>=20'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -2398,12 +2618,12 @@ packages: typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - typescript-eslint@8.28.0: - resolution: {integrity: sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==} + typescript-eslint@8.47.0: + resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' typescript-transform-paths@3.5.5: resolution: {integrity: sha512-RMK86wKe/4+ad+3kMT9SKAs3K0tUHLe7hF+MLbD6VpC9VUmFuKorhf3pHz+qO5GdS4mUp2ncNUo14j6ws9UvBQ==} @@ -2463,6 +2683,9 @@ 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==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -2508,8 +2731,8 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2542,169 +2765,260 @@ packages: zip-local@0.3.5: resolution: {integrity: sha512-GRV3D5TJY+/PqyeRm5CYBs7xVrKTKzljBoEXvocZu0HJ7tPEcgpSOYa2zFIsCZWgKWMuc4U3yMFgFkERGFIB9w==} - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + '@cacheable/memory@2.0.5': dependencies: - '@csstools/css-tokenizer': 3.0.3 + '@cacheable/utils': 2.3.1 + '@keyv/bigmap': 1.3.0(keyv@5.5.4) + hookified: 1.13.0 + keyv: 5.5.4 - '@csstools/css-tokenizer@3.0.3': {} - - '@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@cacheable/utils@2.3.1': dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + hashery: 1.2.0 + keyv: 5.5.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@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)': + dependencies: + '@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)': dependencies: postcss-selector-parser: 7.1.0 - '@dual-bundle/import-meta-resolve@4.1.0': {} + '@dual-bundle/import-meta-resolve@4.2.1': {} - '@esbuild/aix-ppc64@0.25.1': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.1': + '@esbuild/aix-ppc64@0.27.0': optional: true - '@esbuild/android-arm@0.25.1': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-x64@0.25.1': + '@esbuild/android-arm64@0.27.0': optional: true - '@esbuild/darwin-arm64@0.25.1': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.1': + '@esbuild/android-arm@0.27.0': optional: true - '@esbuild/freebsd-arm64@0.25.1': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.1': + '@esbuild/android-x64@0.27.0': optional: true - '@esbuild/linux-arm64@0.25.1': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.1': + '@esbuild/darwin-arm64@0.27.0': optional: true - '@esbuild/linux-ia32@0.25.1': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.1': + '@esbuild/darwin-x64@0.27.0': optional: true - '@esbuild/linux-mips64el@0.25.1': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.1': + '@esbuild/freebsd-arm64@0.27.0': optional: true - '@esbuild/linux-riscv64@0.25.1': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.1': + '@esbuild/freebsd-x64@0.27.0': optional: true - '@esbuild/linux-x64@0.25.1': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.1': + '@esbuild/linux-arm64@0.27.0': optional: true - '@esbuild/netbsd-x64@0.25.1': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.1': + '@esbuild/linux-arm@0.27.0': optional: true - '@esbuild/openbsd-x64@0.25.1': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/sunos-x64@0.25.1': + '@esbuild/linux-ia32@0.27.0': optional: true - '@esbuild/win32-arm64@0.25.1': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/win32-ia32@0.25.1': + '@esbuild/linux-loong64@0.27.0': optional: true - '@esbuild/win32-x64@0.25.1': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))': + '@esbuild/linux-mips64el@0.27.0': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.0': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.0': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.0': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.0': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.0': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.0': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.0': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.0': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.0': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.0': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.0': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': dependencies: - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + eslint: 9.39.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.11.0': + '@eslint/config-helpers@0.4.2': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 0.17.0 - '@eslint/core@0.12.0': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + 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.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.20.0': {} + '@eslint/js@9.39.1': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.17.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@intrnl/xxhash64@0.1.2': {} @@ -2730,9 +3044,13 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@keyv/serialize@1.0.3': + '@keyv/bigmap@1.3.0(keyv@5.5.4)': dependencies: - buffer: 6.0.3 + hashery: 1.2.0 + hookified: 1.13.0 + keyv: 5.5.4 + + '@keyv/serialize@1.1.1': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2746,43 +3064,41 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@puppeteer/browsers@2.8.0': + '@puppeteer/browsers@2.10.13': dependencies: - debug: 4.4.0 + debug: 4.4.3 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.1 - tar-fs: 3.0.8 + semver: 7.7.3 + tar-fs: 3.1.1 yargs: 17.7.2 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color '@rtsao/scc@1.1.0': {} - '@stylistic/eslint-plugin@4.2.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': + '@stylistic/eslint-plugin@5.6.0(eslint@9.39.1)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@typescript-eslint/types': 8.47.0 + eslint: 9.39.1 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.2 - transitivePeerDependencies: - - supports-color - - typescript + picomatch: 4.0.3 '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/chrome@0.0.312': + '@types/chrome@0.1.30': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 - '@types/diff@7.0.2': {} - - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/filesystem@0.0.36': dependencies: @@ -2807,6 +3123,8 @@ snapshots: '@types/lodash@4.17.15': {} + '@types/lodash@4.17.20': {} + '@types/node@22.13.13': dependencies: undici-types: 6.20.0 @@ -2843,86 +3161,102 @@ snapshots: '@types/node': 24.10.1 optional: true - '@types/yazl@2.4.6': + '@types/yazl@3.3.0': dependencies: '@types/node': 24.10.1 - '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': + '@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)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.28.0 - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + '@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 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': + '@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.28.0 - debug: 4.4.0 - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + '@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.3 + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.28.0': + '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/visitor-keys': 8.28.0 + '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) + '@typescript-eslint/types': 8.47.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.47.0': dependencies: - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - debug: 4.4.0 - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + '@typescript-eslint/types': 8.47.0 + '@typescript-eslint/visitor-keys': 8.47.0 + + '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': + 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.3 + eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.28.0': {} + '@typescript-eslint/types@8.47.0': {} - '@typescript-eslint/typescript-estree@8.28.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/visitor-keys': 8.28.0 - debug: 4.4.0 + '@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.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3)': + '@typescript-eslint/utils@8.47.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.9.3) - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + '@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 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.28.0': + '@typescript-eslint/visitor-keys@8.47.0': dependencies: - '@typescript-eslint/types': 8.28.0 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.47.0 + eslint-visitor-keys: 4.2.1 '@vap/core@0.0.12': dependencies: @@ -2940,13 +3274,15 @@ snapshots: moment: 2.30.1 type-fest: 4.41.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn@8.14.1: {} - agent-base@7.1.3: {} + acorn@8.15.0: {} + + agent-base@7.1.4: {} ajv@6.12.6: dependencies: @@ -2958,7 +3294,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -2979,15 +3315,6 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - array-includes@3.1.9: dependencies: call-bind: 1.0.8 @@ -3007,7 +3334,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -3026,21 +3353,21 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -3049,7 +3376,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -3072,38 +3399,48 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - b4a@1.6.7: {} + b4a@1.7.3: {} balanced-match@1.0.2: {} balanced-match@2.0.0: {} - bare-events@2.5.4: - optional: true + bare-events@2.8.2: {} - bare-fs@4.0.2: + bare-fs@4.5.1: dependencies: - bare-events: 2.5.4 + bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.5.4) + bare-stream: 2.7.0(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a optional: true - bare-os@3.6.1: + bare-os@3.6.2: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.6.1 + bare-os: 3.6.2 optional: true - bare-stream@2.6.5(bare-events@2.5.4): + bare-stream@2.7.0(bare-events@2.8.2): dependencies: - streamx: 2.22.0 + streamx: 2.23.0 optionalDependencies: - bare-events: 2.5.4 + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a optional: true - base64-js@1.5.1: {} + bare-url@2.3.2: + dependencies: + bare-path: 3.0.0 + optional: true base@0.11.2: dependencies: @@ -3117,7 +3454,7 @@ snapshots: basic-ftp@5.0.5: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -3134,11 +3471,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - cache-base@1.0.1: dependencies: collection-visit: 1.0.0 @@ -3151,10 +3483,13 @@ snapshots: union-value: 1.0.1 unset-value: 1.0.0 - cacheable@1.8.9: + cacheable@2.2.0: dependencies: - hookified: 1.8.1 - keyv: 5.3.2 + '@cacheable/memory': 2.0.5 + '@cacheable/utils': 2.3.1 + hookified: 1.13.0 + keyv: 5.5.4 + qified: 0.5.2 call-bind-apply-helpers@1.0.2: dependencies: @@ -3185,11 +3520,11 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chromium-bidi@2.1.2(devtools-protocol@0.0.1413902): + chromium-bidi@11.0.0(devtools-protocol@0.0.1521046): dependencies: - devtools-protocol: 0.0.1413902 + devtools-protocol: 0.0.1521046 mitt: 3.0.1 - zod: 3.24.2 + zod: 3.25.76 class-utils@0.3.6: dependencies: @@ -3235,7 +3570,7 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: typescript: 5.9.3 @@ -3287,7 +3622,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.3: dependencies: ms: 2.1.3 @@ -3326,9 +3661,9 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - devtools-protocol@0.0.1413902: {} + devtools-protocol@0.0.1521046: {} - diff@7.0.0: {} + diff@8.0.2: {} dir-glob@3.0.1: dependencies: @@ -3338,6 +3673,8 @@ snapshots: dependencies: esutils: 2.0.3 + dompurify@3.1.7: {} + dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -3351,7 +3688,7 @@ snapshots: emoji-regex@8.0.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -3359,64 +3696,10 @@ snapshots: env-paths@2.2.1: {} - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - 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-regex: 1.2.1 - 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 - 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.19 - es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -3483,7 +3766,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -3518,33 +3801,63 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.1: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.0: + 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 escalade@3.2.0: {} @@ -3558,9 +3871,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.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))): + 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)): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + 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-node@0.3.9: dependencies: @@ -3570,17 +3883,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + 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): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + '@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 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -3589,9 +3902,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) + 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) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3603,30 +3916,30 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) + '@typescript-eslint/parser': 8.47.0(eslint@9.39.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-path-alias@2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-plugin-path-alias@2.1.0(patch_hash=87545cb13985b338c8fa2ea7b0a3c75c57ad7fbc81c56b38d6c9438329957727)(eslint@9.39.1): dependencies: - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + eslint: 9.39.1 find-pkg: 2.0.0 get-tsconfig: 4.10.0 nanomatch: 1.2.13 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.4(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-plugin-react@7.37.5(eslint@9.39.1): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + eslint: 9.39.1 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -3640,51 +3953,51 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-header@1.2.2(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-plugin-simple-header@1.2.2(eslint@9.39.1): dependencies: - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + eslint: 9.39.1 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.39.1): dependencies: - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + eslint: 9.39.1 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)): + 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): dependencies: - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + eslint: 9.39.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) + '@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-scope@8.3.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215): + eslint@9.39.1: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/core': 0.11.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@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.20.0 - '@eslint/plugin-kit': 0.2.7 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.39.1 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -3702,11 +4015,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -3724,6 +4037,12 @@ snapshots: eventemitter3@4.0.7: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 @@ -3739,7 +4058,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -3763,7 +4082,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fastest-levenshtein@1.0.16: {} @@ -3777,9 +4096,9 @@ snapshots: fflate@0.8.2: {} - file-entry-cache@10.0.7: + file-entry-cache@10.1.4: dependencies: - flat-cache: 6.1.7 + flat-cache: 6.1.19 file-entry-cache@8.0.0: dependencies: @@ -3807,11 +4126,11 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.7: + flat-cache@6.1.19: dependencies: - cacheable: 1.8.9 + cacheable: 2.2.0 flatted: 3.3.3 - hookified: 1.8.1 + hookified: 1.13.0 flatted@3.3.3: {} @@ -3847,6 +4166,8 @@ snapshots: functions-have-names@1.2.3: {} + generator-function@2.0.1: {} + get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -3869,7 +4190,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.2 + pump: 3.0.3 get-symbol-description@1.1.0: dependencies: @@ -3881,11 +4202,15 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.4: + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-uri@6.0.5: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -3992,6 +4317,10 @@ snapshots: is-number: 3.0.0 kind-of: 4.0.0 + hashery@1.2.0: + dependencies: + hookified: 1.13.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -4002,7 +4331,7 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hookified@1.8.1: {} + hookified@1.13.0: {} html-minifier-terser@7.2.0: dependencies: @@ -4018,23 +4347,21 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.3 - debug: 4.4.0 + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.3 - debug: 4.4.0 + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - ieee754@1.2.1: {} - ignore@5.3.2: {} - ignore@7.0.3: {} + ignore@7.0.5: {} import-fresh@3.3.1: dependencies: @@ -4053,10 +4380,7 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ip-address@10.1.0: {} is-accessor-descriptor@1.0.1: dependencies: @@ -4134,9 +4458,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -4232,12 +4557,10 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -4262,7 +4585,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -4275,9 +4598,9 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.3.2: + keyv@5.5.4: dependencies: - '@keyv/serialize': 1.0.3 + '@keyv/serialize': 1.1.1 kind-of@3.2.2: dependencies: @@ -4289,7 +4612,7 @@ snapshots: kind-of@6.0.3: {} - known-css-properties@0.35.0: {} + known-css-properties@0.37.0: {} levn@0.4.1: dependencies: @@ -4322,6 +4645,8 @@ snapshots: dependencies: object-visit: 1.0.1 + marked@14.0.0: {} + math-intrinsics@1.1.0: {} mathml-tag-names@2.1.3: {} @@ -4339,7 +4664,7 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: @@ -4356,7 +4681,10 @@ snapshots: moment@2.30.1: {} - monaco-editor@0.52.2: {} + monaco-editor@0.54.0: + dependencies: + dompurify: 3.1.7 + marked: 14.0.0 ms@2.0.0: {} @@ -4364,7 +4692,7 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.5: {} + nanoid@5.1.6: {} nanomatch@1.2.13: dependencies: @@ -4429,7 +4757,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: @@ -4479,9 +4807,9 @@ snapshots: pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.3 - debug: 4.4.0 - get-uri: 6.0.4 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 pac-resolver: 7.0.1 @@ -4507,8 +4835,8 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4535,15 +4863,15 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} possible-typed-array-names@1.1.0: {} postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@7.0.1(postcss@8.5.3): + postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser@7.1.0: dependencies: @@ -4552,7 +4880,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.3: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -4570,8 +4898,8 @@ snapshots: proxy-agent@6.5.0: dependencies: - agent-base: 7.1.3 - debug: 4.4.0 + agent-base: 7.1.4 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -4583,29 +4911,36 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} - puppeteer-core@24.4.0: + puppeteer-core@24.30.0: dependencies: - '@puppeteer/browsers': 2.8.0 - chromium-bidi: 2.1.2(devtools-protocol@0.0.1413902) - debug: 4.4.0 - devtools-protocol: 0.0.1413902 + '@puppeteer/browsers': 2.10.13 + chromium-bidi: 11.0.0(devtools-protocol@0.0.1521046) + debug: 4.4.3 + devtools-protocol: 0.0.1521046 typed-query-selector: 2.12.0 - ws: 8.18.1 + webdriver-bidi-protocol: 0.3.8 + ws: 8.18.3 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil + - react-native-b4a - supports-color - utf-8-validate q@1.5.1: {} + qified@0.5.2: + dependencies: + hookified: 1.13.0 + queue-microtask@1.2.3: {} react-is@16.13.1: {} @@ -4614,7 +4949,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -4707,6 +5042,8 @@ snapshots: semver@7.7.1: {} + semver@7.7.3: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -4797,15 +5134,15 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.3 - debug: 4.4.0 - socks: 2.8.4 + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 transitivePeerDependencies: - supports-color - socks@2.8.4: + socks@2.8.7: dependencies: - ip-address: 9.0.5 + ip-address: 10.1.0 smart-buffer: 4.2.0 source-map-js@1.2.1: {} @@ -4833,8 +5170,6 @@ snapshots: dependencies: extend-shallow: 3.0.2 - sprintf-js@1.1.3: {} - standalone-electron-types@34.2.0: dependencies: '@types/node': 22.19.1 @@ -4849,12 +5184,14 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamx@2.22.0: + streamx@2.23.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.5.4 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-width@4.2.3: dependencies: @@ -4867,7 +5204,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -4881,7 +5218,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -4889,7 +5226,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -4914,47 +5251,47 @@ snapshots: strip-json-comments@3.1.1: {} - stylelint-config-recommended@15.0.0(stylelint@16.17.0(typescript@5.9.3)): + stylelint-config-recommended@17.0.0(stylelint@16.25.0(typescript@5.9.3)): dependencies: - stylelint: 16.17.0(typescript@5.9.3) + stylelint: 16.25.0(typescript@5.9.3) - stylelint-config-standard@37.0.0(stylelint@16.17.0(typescript@5.9.3)): + stylelint-config-standard@39.0.1(stylelint@16.25.0(typescript@5.9.3)): dependencies: - stylelint: 16.17.0(typescript@5.9.3) - stylelint-config-recommended: 15.0.0(stylelint@16.17.0(typescript@5.9.3)) + stylelint: 16.25.0(typescript@5.9.3) + stylelint-config-recommended: 17.0.0(stylelint@16.25.0(typescript@5.9.3)) - stylelint@16.17.0(typescript@5.9.3): + stylelint@16.25.0(typescript@5.9.3): dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 - '@csstools/media-query-list-parser': 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@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.1.0 + '@dual-bundle/import-meta-resolve': 4.2.1 balanced-match: 2.0.0 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.9.3) css-functions-list: 3.2.3 css-tree: 3.1.0 - debug: 4.4.0 + debug: 4.4.3 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.0.7 + file-entry-cache: 10.1.4 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 html-tags: 3.3.1 - ignore: 7.0.3 + ignore: 7.0.5 imurmurhash: 0.1.4 is-plain-object: 5.0.0 - known-css-properties: 0.35.0 + known-css-properties: 0.37.0 mathml-tag-names: 2.1.3 meow: 13.2.0 micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.6 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.5.3) + postcss-safe-parser: 7.0.1(postcss@8.5.6) postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -4988,21 +5325,28 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tar-fs@3.0.8: + tagged-tag@1.0.0: {} + + tar-fs@3.1.1: dependencies: - pump: 3.0.2 + pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.0.2 + bare-fs: 4.5.1 bare-path: 3.0.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a tar-stream@3.1.7: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 fast-fifo: 1.3.2 - streamx: 2.22.0 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a terser@5.39.0: dependencies: @@ -5013,7 +5357,9 @@ snapshots: text-decoder@1.2.3: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a to-object-path@0.3.0: dependencies: @@ -5056,11 +5402,18 @@ snapshots: tsx@4.19.3: dependencies: - esbuild: 0.25.1 + esbuild: 0.25.12 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 + tsx@4.20.6: + dependencies: + esbuild: 0.25.12 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -5069,6 +5422,10 @@ snapshots: type-fest@4.41.0: {} + type-fest@5.2.0: + dependencies: + tagged-tag: 1.0.0 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -5104,12 +5461,13 @@ snapshots: typed-query-selector@2.12.0: {} - typescript-eslint@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3): + typescript-eslint@8.47.0(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3))(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - '@typescript-eslint/parser': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215))(typescript@5.9.3) - eslint: 9.20.1(patch_hash=4f22e92770bf528b2448fbec0984b9c0761dd588ed0e83dcc41edfc9af711215) + '@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 transitivePeerDependencies: - supports-color @@ -5164,6 +5522,8 @@ snapshots: vscode-textmate@5.2.0: {} + webdriver-bidi-protocol@0.3.8: {} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -5180,7 +5540,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -5232,7 +5592,7 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.18.1: {} + ws@8.18.3: {} y18n@5.0.8: {} @@ -5262,4 +5622,4 @@ snapshots: jszip: 2.7.0 q: 1.5.1 - zod@3.24.2: {} + zod@3.25.76: {} diff --git a/scripts/generateReport.ts b/scripts/generateReport.ts index 4aad058cb..03884862d 100644 --- a/scripts/generateReport.ts +++ b/scripts/generateReport.ts @@ -339,7 +339,7 @@ page.on("console", async e => { }); page.on("error", e => logStderr("[Error]", e.message)); -page.on("pageerror", e => { +page.on("pageerror", (e: any) => { if (e.message.includes("Sentry successfully disabled")) return; if (!e.message.startsWith("Object") && !e.message.includes("Cannot find module") && !/^.{1,2}$/.test(e.message)) { diff --git a/src/api/Styles.ts b/src/api/Styles.ts index 6b0ac2cdf..fb40f72d8 100644 --- a/src/api/Styles.ts +++ b/src/api/Styles.ts @@ -16,9 +16,12 @@ * along with this program. If not, see . */ -import type { MapValue } from "type-fest/source/entry"; - -export type Style = MapValue; +export interface Style { + name: string; + source: string; + classNames: Record; + dom: HTMLStyleElement | null; +} export const styleMap = window.VencordStyles ??= new Map(); diff --git a/src/components/settings/tabs/plugins/styles.css b/src/components/settings/tabs/plugins/styles.css index 522987e4c..951e24443 100644 --- a/src/components/settings/tabs/plugins/styles.css +++ b/src/components/settings/tabs/plugins/styles.css @@ -19,7 +19,7 @@ .vc-plugins-grid { margin-top: 16px; display: grid; - grid-gap: 16px; + gap: 16px; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); } diff --git a/src/components/settings/tabs/styles.css b/src/components/settings/tabs/styles.css index f2828b31c..e9aa67769 100644 --- a/src/components/settings/tabs/styles.css +++ b/src/components/settings/tabs/styles.css @@ -42,7 +42,7 @@ .vc-cloud-settings-sync-grid { display: grid; grid-template-columns: repeat(3, 1fr); - grid-gap: 1em; + gap: 1em; } .vc-cloud-erase-data-danger-btn { diff --git a/src/components/settings/tabs/themes/styles.css b/src/components/settings/tabs/themes/styles.css index b47174063..18dff2b00 100644 --- a/src/components/settings/tabs/themes/styles.css +++ b/src/components/settings/tabs/themes/styles.css @@ -1,6 +1,6 @@ .vc-settings-theme-grid { display: grid; - grid-gap: 16px; + gap: 16px; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); } @@ -49,4 +49,4 @@ } --custom-button-button-md-height: 26px; -} +} \ No newline at end of file diff --git a/src/globals.d.ts b/src/globals.d.ts index 6edc2a0a4..66ee2203d 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +import { Style } from "@api/Styles"; + declare global { /** * This exists only at build time, so references to it in patches should insert it @@ -45,12 +47,7 @@ declare global { export var VencordNative: typeof import("./VencordNative").default; export var Vencord: typeof import("./Vencord"); - export var VencordStyles: Map; - dom: HTMLStyleElement | null; - }>; + export var VencordStyles: Map; export var appSettings: { set(setting: string, v: any): void; }; diff --git a/src/plugins/messageLogger/deleteStyleOverlay.css b/src/plugins/messageLogger/deleteStyleOverlay.css index 59e4ac666..3da3fa998 100644 --- a/src/plugins/messageLogger/deleteStyleOverlay.css +++ b/src/plugins/messageLogger/deleteStyleOverlay.css @@ -1,3 +1,3 @@ .messagelogger-deleted { - background-color: hsla(var(--red-430-hsl, 0 85% 61%) / 15%) !important; -} + background-color: hsl(var(--red-430-hsl, 0 85% 61%) / 15%) !important; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index c5bac7b17..2e75625c5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "esnext.symbol" ], "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "strict": true, "noImplicitAny": false, "target": "ESNEXT", From bb3f333ac8adb7926d17c49476713e01dc01d476 Mon Sep 17 00:00:00 2001 From: sadan4 <117494111+sadan4@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:59:51 -0500 Subject: [PATCH 7/7] fix ShowConnections (#3790) --- src/plugins/showConnections/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/showConnections/index.tsx b/src/plugins/showConnections/index.tsx index ee15fc5ab..8ac76d32e 100644 --- a/src/plugins/showConnections/index.tsx +++ b/src/plugins/showConnections/index.tsx @@ -165,7 +165,7 @@ export default definePlugin({ { find: ".hasAvatarForGuild(null==", replacement: { - match: /currentUser:\i,guild:\i}\)(?<=user:(\i),bio:null==(\i)\?.+?)/, + match: /currentUser:\i,guild:\i[^}]*?\}\)(?=])(?<=user:(\i),bio:null==(\i)\?.+?)/, replace: "$&,$self.profilePopoutComponent({ user: $1, displayProfile: $2 })" } }