From c6354ab0d3106fc2b933a99f1463d294556a9b07 Mon Sep 17 00:00:00 2001 From: Arjun Patel Date: Mon, 1 Jun 2026 12:46:14 -0700 Subject: [PATCH] wip --- js/desktop/.eslintrc.json | 18 +- js/desktop/.prettierrc | 8 + js/desktop/package.json | 7 +- js/desktop/src/autoplay_window/renderer.tsx | 4 +- .../attachments/attachment-lightbox.tsx | 6 +- js/desktop/src/features/network-root.tsx | 9 +- js/desktop/src/features/network-settings.tsx | 17 +- .../particles/particle-view-resolver.tsx | 3 +- .../src/features/particles/reaction-bar.tsx | 4 +- js/desktop/src/hooks/use-billing.ts | 7 +- js/desktop/src/hooks/use-channel.ts | 19 +- js/desktop/src/hooks/use-download-url.ts | 7 +- js/desktop/src/hooks/use-link-metadata.ts | 5 +- js/desktop/src/hooks/use-network-usage.ts | 7 +- .../src/hooks/use-stream-navigation-keys.ts | 1 - js/desktop/src/hooks/use-stream-playback.ts | 2 +- js/desktop/src/huddle_window/HuddleApp.tsx | 22 +- js/desktop/src/huddle_window/renderer.tsx | 4 +- js/desktop/src/lib/firestore-particles.ts | 4 +- js/desktop/src/lib/image-thumbnail.ts | 3 +- js/desktop/src/lib/platform/web.ts | 2 + js/desktop/src/lib/pusher-client.ts | 15 +- js/desktop/src/lib/pusher-provider.tsx | 27 +- js/desktop/src/lib/sound-effects/engine.ts | 2 +- js/desktop/src/main.ts | 1 - js/desktop/src/renderer.tsx | 4 +- .../src/screen_record_window/renderer.tsx | 4 +- js/desktop/src/web/renderer.tsx | 4 +- js/desktop/yarn.lock | 497 +++++++++++++----- 29 files changed, 491 insertions(+), 222 deletions(-) create mode 100644 js/desktop/.prettierrc diff --git a/js/desktop/.eslintrc.json b/js/desktop/.eslintrc.json index a5691c8..9506742 100644 --- a/js/desktop/.eslintrc.json +++ b/js/desktop/.eslintrc.json @@ -4,6 +4,21 @@ "es6": true, "node": true }, + "settings": { + "import/resolver": { + "typescript": {} + } + }, + "rules": { + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ] + }, "extends": [ "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", @@ -11,7 +26,8 @@ "plugin:import/recommended", "plugin:import/electron", "plugin:import/typescript", - "plugin:react-hooks/recommended" + "plugin:react-hooks/recommended", + "prettier" ], "parser": "@typescript-eslint/parser" } diff --git a/js/desktop/.prettierrc b/js/desktop/.prettierrc new file mode 100644 index 0000000..2ff2460 --- /dev/null +++ b/js/desktop/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "jsxSingleQuote": false +} diff --git a/js/desktop/package.json b/js/desktop/package.json index 624a475..e841565 100644 --- a/js/desktop/package.json +++ b/js/desktop/package.json @@ -14,6 +14,7 @@ "publish:mac": "echo '\n⚠️ Have you bumped the version in package.json? (current: '$(node -p \"require('./package.json').version\")') [y/N]' && read -r answer && [ \"$answer\" = \"y\" ] && APP_ENV=prod electron-forge publish --arch=arm64 && APP_ENV=prod electron-forge publish --arch=x64", "invalidate-gcs-cache": "gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/darwin/arm64/RELEASES.json && gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/darwin/x64/RELEASES.json && gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/win32/x64/RELEASES", "lint": "eslint --ext .ts,.tsx .", + "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css,md}\"", "compile": "npx tsc --noEmit 2>&1 | grep '^src/'", "web:dev": "cross-env APP_ENV=dev vite --config vite.web.config.mts", "web:build": "cross-env APP_ENV=prod vite build --config vite.web.config.mts", @@ -44,15 +45,17 @@ "@types/node": "^25.3.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", "@vitejs/plugin-react": "^5.1.4", "cross-env": "^10.1.0", "electron": "40.6.0", "eslint": "^8.57.1", + "eslint-config-prettier": "^10.1.8", + "eslint-import-resolver-typescript": "^4.4.5", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react-hooks": "^7.0.1", + "prettier": "^3.8.3", "typescript": "^5.9.3", + "typescript-eslint": "^8.60.0", "vite": "^5.4.21" }, "dependencies": { diff --git a/js/desktop/src/autoplay_window/renderer.tsx b/js/desktop/src/autoplay_window/renderer.tsx index f9493f7..29fdbf9 100644 --- a/js/desktop/src/autoplay_window/renderer.tsx +++ b/js/desktop/src/autoplay_window/renderer.tsx @@ -5,5 +5,7 @@ import '@/styles/globals.css'; initSentryRenderer(); -const root = createRoot(document.getElementById('root')!); +const container = document.getElementById('root'); +if (!container) throw new Error('Root element #root not found'); +const root = createRoot(container); root.render(); diff --git a/js/desktop/src/features/attachments/attachment-lightbox.tsx b/js/desktop/src/features/attachments/attachment-lightbox.tsx index 8bdcc3a..77ea49e 100644 --- a/js/desktop/src/features/attachments/attachment-lightbox.tsx +++ b/js/desktop/src/features/attachments/attachment-lightbox.tsx @@ -62,6 +62,8 @@ export function AttachmentLightbox({ : null; const isOpen = current !== null; const hasMultiple = items.length > 1; + // 1-based position for the "x / N" counter; null when nothing is open. + const position = openIndex !== null ? openIndex + 1 : null; // Remote items resolve through the signed-URL cache; disabled when not remote. const remoteObjectId = @@ -107,7 +109,7 @@ export function AttachmentLightbox({ if (wasLast) { onOpenChange(null); } else if (wasAtEnd) { - onOpenChange(openIndex! - 1); + onOpenChange(items.length - 2); } // Otherwise openIndex stays — the next item shifts into its place. }; @@ -187,7 +189,7 @@ export function AttachmentLightbox({ )} {hasMultiple && ( - {openIndex! + 1} / {items.length} + {position} / {items.length} )} diff --git a/js/desktop/src/features/network-root.tsx b/js/desktop/src/features/network-root.tsx index a385e26..b00e0da 100644 --- a/js/desktop/src/features/network-root.tsx +++ b/js/desktop/src/features/network-root.tsx @@ -17,8 +17,9 @@ import { useStreamKeyboardNav } from "@/hooks/use-stream-keyboard-nav"; */ export default function NetworkRoot() { const { networkId } = useParams(); + if (!networkId) throw new Error("NetworkRoot requires a :networkId route param"); const navigate = useNavigate(); - const path = particlePath(networkId!, []); + const path = particlePath(networkId, []); const [composeActive, setComposeActive] = useState(false); const [searchParams, setSearchParams] = useSearchParams(); @@ -68,7 +69,7 @@ export default function NetworkRoot() {
- + {!composeActive && (
- +
)}
diff --git a/js/desktop/src/features/network-settings.tsx b/js/desktop/src/features/network-settings.tsx index 4a4ba62..6e3e581 100644 --- a/js/desktop/src/features/network-settings.tsx +++ b/js/desktop/src/features/network-settings.tsx @@ -179,14 +179,15 @@ function Section({ children }: { children: React.ReactNode }) { export default function NetworkSettingsPage() { const navigate = useNavigate(); const { networkId } = useParams<{ networkId: string }>(); + if (!networkId) throw new Error("NetworkSettingsPage requires a :networkId route param"); const [searchParams] = useSearchParams(); const { data: networks } = useNetworks(); const network = networks?.find((n) => n.id === networkId); - const { data: invitations, error: invitationsError } = useNetworkInvitations(networkId!); + const { data: invitations, error: invitationsError } = useNetworkInvitations(networkId); const currentUser = useAuthStore((s) => s.user); const isAdmin = currentUser?.id === network?.admin_human.id; const [memberToRemove, setMemberToRemove] = useState(null); - const removeMember = useRemoveMember(networkId!); + const removeMember = useRemoveMember(networkId); const billingRef = useRef(null); @@ -279,7 +280,7 @@ export default function NetworkSettingsPage() { } /> - + {invitationsError && ( <> @@ -288,7 +289,7 @@ export default function NetworkSettingsPage() {

)} - {pendingCount > 0 && ( + {invitations && invitations.length > 0 && ( <>
@@ -296,13 +297,13 @@ export default function NetworkSettingsPage() { Pending
- {invitations!.map((inv, index) => ( + {invitations.map((inv, index) => (
- {index < invitations!.length - 1 && ( + {index < invitations.length - 1 && ( )}
@@ -324,7 +325,7 @@ export default function NetworkSettingsPage() { } /> - +
diff --git a/js/desktop/src/features/particles/particle-view-resolver.tsx b/js/desktop/src/features/particles/particle-view-resolver.tsx index 36a1c7b..70c3a2f 100644 --- a/js/desktop/src/features/particles/particle-view-resolver.tsx +++ b/js/desktop/src/features/particles/particle-view-resolver.tsx @@ -17,8 +17,9 @@ import { FolderView } from "@/features/particles/folder-view"; */ export default function ParticleViewResolver() { const { networkId, "*": rest } = useParams(); + if (!networkId) throw new Error("ParticleViewResolver requires a :networkId route param"); const segments = (rest ?? "").split("/").filter(Boolean); - const path = particlePath(networkId!, segments); // path of current container particle + const path = particlePath(networkId, segments); // path of current container particle const { particle, isLoading, error } = useLiveParticle(path); diff --git a/js/desktop/src/features/particles/reaction-bar.tsx b/js/desktop/src/features/particles/reaction-bar.tsx index 4243542..2991488 100644 --- a/js/desktop/src/features/particles/reaction-bar.tsx +++ b/js/desktop/src/features/particles/reaction-bar.tsx @@ -61,7 +61,7 @@ export function ReactionBar({
{/* Emoji reaction pills */} {activeEmojis.map((emoji) => { - const reactors = reactions![emoji]; + const reactors = reactions?.[emoji] ?? []; const isMine = reactors.includes(currentHumanId); return ( @@ -88,7 +88,7 @@ export function ReactionBar({ {/* Text reaction pills */} {activeTextReactions.map((text) => { - const reactors = reactions![text]; + const reactors = reactions?.[text] ?? []; const isMine = reactors.includes(currentHumanId); const firstReactor = resolveHumanDisplay(reactors[0], humans); const reactorList = getReactorList(reactors, humans, currentHumanId); diff --git a/js/desktop/src/hooks/use-billing.ts b/js/desktop/src/hooks/use-billing.ts index 0ef195a..4b4597a 100644 --- a/js/desktop/src/hooks/use-billing.ts +++ b/js/desktop/src/hooks/use-billing.ts @@ -1,12 +1,13 @@ -import { useQuery, useMutation } from "@tanstack/react-query"; +import { useQuery, useMutation, skipToken } from "@tanstack/react-query"; import { apiClient } from "@/api/client"; import type { BillingCadence } from "@/api/types"; export function useNetworkBilling(networkId: string | undefined) { return useQuery({ queryKey: ["network-billing", networkId], - queryFn: () => apiClient.getNetworkBilling(networkId!), - enabled: !!networkId, + queryFn: networkId + ? () => apiClient.getNetworkBilling(networkId) + : skipToken, // Refetch on window focus so the UI catches up after the user returns // from Stripe Checkout (webhook may land a second or two later). // FIX: doesn't work with electron diff --git a/js/desktop/src/hooks/use-channel.ts b/js/desktop/src/hooks/use-channel.ts index 2971ed4..2ebb3c8 100644 --- a/js/desktop/src/hooks/use-channel.ts +++ b/js/desktop/src/hooks/use-channel.ts @@ -36,11 +36,11 @@ export function useChannel(channelId: string | null): UseChannelResult { }; const onJoin = (msg: { humanId?: string }) => { - if (msg.humanId) { - setPresence((prev) => - prev.includes(msg.humanId!) ? prev : [...prev, msg.humanId!], - ); - } + const humanId = msg.humanId; + if (!humanId) return; + setPresence((prev) => + prev.includes(humanId) ? prev : [...prev, humanId], + ); }; const onLeave = (msg: { humanId?: string }) => { @@ -50,12 +50,9 @@ export function useChannel(channelId: string | null): UseChannelResult { }; const onMessage = (msg: { humanId?: string; payload?: unknown }) => { - if (msg.humanId) { - setMessages((prev) => [ - ...prev, - { humanId: msg.humanId!, payload: msg.payload }, - ]); - } + const humanId = msg.humanId; + if (!humanId) return; + setMessages((prev) => [...prev, { humanId, payload: msg.payload }]); }; client.on(channelId, "subscribed", onSubscribed); diff --git a/js/desktop/src/hooks/use-download-url.ts b/js/desktop/src/hooks/use-download-url.ts index 80709c3..8b0955d 100644 --- a/js/desktop/src/hooks/use-download-url.ts +++ b/js/desktop/src/hooks/use-download-url.ts @@ -1,11 +1,12 @@ -import { useQuery } from "@tanstack/react-query"; +import { useQuery, skipToken } from "@tanstack/react-query"; import { apiClient } from "@/api/client"; export function useDownloadUrl(objectId?: string) { return useQuery({ queryKey: ["download-url", objectId], - queryFn: () => apiClient.getParticleDownloadUrl(objectId!), - enabled: !!objectId, + queryFn: objectId + ? () => apiClient.getParticleDownloadUrl(objectId) + : skipToken, staleTime: 1000 * 60 * 60, // 1 hour — signed URLs valid for 24h }); } diff --git a/js/desktop/src/hooks/use-link-metadata.ts b/js/desktop/src/hooks/use-link-metadata.ts index c76ac8a..f8b9714 100644 --- a/js/desktop/src/hooks/use-link-metadata.ts +++ b/js/desktop/src/hooks/use-link-metadata.ts @@ -1,12 +1,11 @@ -import { useQueries, useQuery } from "@tanstack/react-query"; +import { useQueries, useQuery, skipToken } from "@tanstack/react-query"; import { extractUrls, type LinkMetadata } from "@/lib/link-metadata"; import { platform } from "@/lib/platform"; export function useLinkMetadata(url: string | null) { return useQuery({ queryKey: ["link-metadata", url], - queryFn: () => platform.link.fetchMetadata(url!), - enabled: !!url, + queryFn: url ? () => platform.link.fetchMetadata(url) : skipToken, staleTime: Infinity, gcTime: 30 * 60 * 1000, retry: 1, diff --git a/js/desktop/src/hooks/use-network-usage.ts b/js/desktop/src/hooks/use-network-usage.ts index b3e6f92..a6c60e7 100644 --- a/js/desktop/src/hooks/use-network-usage.ts +++ b/js/desktop/src/hooks/use-network-usage.ts @@ -1,4 +1,4 @@ -import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useQuery, useQueryClient, skipToken } from "@tanstack/react-query"; import { useCallback } from "react"; import { apiClient } from "@/api/client"; import type { NetworkUsage } from "@/api/types"; @@ -9,8 +9,9 @@ export const networkUsageQueryKey = (networkId: string | undefined) => export function useNetworkUsage(networkId: string | undefined) { return useQuery({ queryKey: networkUsageQueryKey(networkId), - queryFn: () => apiClient.getNetworkUsage(networkId!), - enabled: !!networkId, + queryFn: networkId + ? () => apiClient.getNetworkUsage(networkId) + : skipToken, // Refetch whenever a consumer mounts (billing settings, compose indicator) // so users land on fresh quota state without listener wiring. refetchOnMount: "always", diff --git a/js/desktop/src/hooks/use-stream-navigation-keys.ts b/js/desktop/src/hooks/use-stream-navigation-keys.ts index 7235cd1..4527247 100644 --- a/js/desktop/src/hooks/use-stream-navigation-keys.ts +++ b/js/desktop/src/hooks/use-stream-navigation-keys.ts @@ -1,7 +1,6 @@ import { useEffect, type RefObject } from "react"; import { useNavigate } from "react-router-dom"; import type { MediaParticleHandle } from "@/features/particles/media-particle-view"; -import { selectIsPaused, usePlaybackPauseStore } from "@/stores/playback-pause-store"; import { isTypingTarget } from "@/lib/keyboard"; const SEEK_DELTA_SEC = 5; diff --git a/js/desktop/src/hooks/use-stream-playback.ts b/js/desktop/src/hooks/use-stream-playback.ts index 3b6ce5a..24d7435 100644 --- a/js/desktop/src/hooks/use-stream-playback.ts +++ b/js/desktop/src/hooks/use-stream-playback.ts @@ -181,7 +181,7 @@ export function useStreamPlayback( lastPersistedMarkerRef.current = currentTime; const streamDocPath = toFirestoreDocPath(path); updateStreamPlaybackMarker(streamDocPath, userId, currentTime); - }, [currentParticle?.id, state.initialized, userId, path]); + }, [currentParticle, streamParticle.playback_markers, state.initialized, userId, path]); // --- Navigation callbacks --- const next = useCallback(() => { diff --git a/js/desktop/src/huddle_window/HuddleApp.tsx b/js/desktop/src/huddle_window/HuddleApp.tsx index 3f85480..c5a9160 100644 --- a/js/desktop/src/huddle_window/HuddleApp.tsx +++ b/js/desktop/src/huddle_window/HuddleApp.tsx @@ -110,7 +110,7 @@ function HuddleContent() { lastAutoPin.current = null; } }, [ - screenShareTracks.map((t) => `${t.publication.trackSid}_${t.publication.isSubscribed}`).join(), + layoutContext.pin, screenShareTracks ]); // Sync isSharing state with actual track state @@ -125,6 +125,15 @@ function HuddleContent() { }; }, [room]); + const stopScreenShare = useCallback(async () => { + const pub = room.localParticipant.getTrackPublication(Track.Source.ScreenShare); + if (pub?.track) { + await room.localParticipant.unpublishTrack(pub.track.mediaStreamTrack); + pub.track.stop(); + } + setIsSharing(false); + }, [room]); + const handleScreenShare = useCallback( async (sourceId: string) => { setShowPicker(false); @@ -148,18 +157,9 @@ function HuddleContent() { logError(err, { scope: "huddle.screenShare" }); } }, - [room], + [room, stopScreenShare], ); - const stopScreenShare = useCallback(async () => { - const pub = room.localParticipant.getTrackPublication(Track.Source.ScreenShare); - if (pub?.track) { - await room.localParticipant.unpublishTrack(pub.track.mediaStreamTrack); - pub.track.stop(); - } - setIsSharing(false); - }, [room]); - return (
diff --git a/js/desktop/src/huddle_window/renderer.tsx b/js/desktop/src/huddle_window/renderer.tsx index 2d16877..4fa91df 100644 --- a/js/desktop/src/huddle_window/renderer.tsx +++ b/js/desktop/src/huddle_window/renderer.tsx @@ -5,5 +5,7 @@ import '@/styles/globals.css'; initSentryRenderer(); -const root = createRoot(document.getElementById('root')!); +const container = document.getElementById('root'); +if (!container) throw new Error('Root element #root not found'); +const root = createRoot(container); root.render(); diff --git a/js/desktop/src/lib/firestore-particles.ts b/js/desktop/src/lib/firestore-particles.ts index 2c6fe12..23b3d2d 100644 --- a/js/desktop/src/lib/firestore-particles.ts +++ b/js/desktop/src/lib/firestore-particles.ts @@ -301,7 +301,7 @@ export async function updateParticleProperties( const particleRef = typedDoc(docPath); // Take the partial and create a new object with dot notation // e.g. { title: "New Title" } becomes { "properties.title": "New Title" } - const updatedProperties: Record = {}; + const updatedProperties: Record = {}; // eslint-disable-line @typescript-eslint/no-explicit-any for (const key in properties) { updatedProperties[`properties.${key}`] = properties[key]; } @@ -352,7 +352,7 @@ export async function updateParticleVisibleTo( export async function updateParticle( docPath: string, fieldName: string, - value: any, + value: any, // eslint-disable-line @typescript-eslint/no-explicit-any ): Promise { const particleRef = typedDoc(docPath); await updateDoc(particleRef, { diff --git a/js/desktop/src/lib/image-thumbnail.ts b/js/desktop/src/lib/image-thumbnail.ts index 0856c76..c1b8e7a 100644 --- a/js/desktop/src/lib/image-thumbnail.ts +++ b/js/desktop/src/lib/image-thumbnail.ts @@ -15,7 +15,8 @@ export async function createImageThumbnail( const h = Math.round(bitmap.height * scale); const canvas = new OffscreenCanvas(w, h); - const ctx = canvas.getContext("2d")!; + const ctx = canvas.getContext("2d"); + if (!ctx) throw new Error("Failed to acquire 2D canvas context"); ctx.drawImage(bitmap, 0, 0, w, h); bitmap.close(); diff --git a/js/desktop/src/lib/platform/web.ts b/js/desktop/src/lib/platform/web.ts index 71a3347..bdd9d05 100644 --- a/js/desktop/src/lib/platform/web.ts +++ b/js/desktop/src/lib/platform/web.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ + import { useAutoplayPayloadStore } from "@/stores/autoplay-payload-store"; import type { AutoplayPayload } from "@/lib/autoplay-ipc"; import { apiClient } from "@/api/client"; diff --git a/js/desktop/src/lib/pusher-client.ts b/js/desktop/src/lib/pusher-client.ts index 631e182..807e1cb 100644 --- a/js/desktop/src/lib/pusher-client.ts +++ b/js/desktop/src/lib/pusher-client.ts @@ -138,14 +138,17 @@ export class PusherClient { event: ChannelEventType, callback: ChannelEventCallback, ): void { - if (!this.listeners.has(channelId)) { - this.listeners.set(channelId, new Map()); + let channelListeners = this.listeners.get(channelId); + if (!channelListeners) { + channelListeners = new Map(); + this.listeners.set(channelId, channelListeners); } - const channelListeners = this.listeners.get(channelId)!; - if (!channelListeners.has(event)) { - channelListeners.set(event, new Set()); + let eventListeners = channelListeners.get(event); + if (!eventListeners) { + eventListeners = new Set(); + channelListeners.set(event, eventListeners); } - channelListeners.get(event)!.add(callback); + eventListeners.add(callback); } off( diff --git a/js/desktop/src/lib/pusher-provider.tsx b/js/desktop/src/lib/pusher-provider.tsx index cf260ae..ef2cab2 100644 --- a/js/desktop/src/lib/pusher-provider.tsx +++ b/js/desktop/src/lib/pusher-provider.tsx @@ -2,7 +2,7 @@ import { createContext, useContext, useEffect, - useRef, + useMemo, useState, type ReactNode, } from "react"; @@ -15,27 +15,24 @@ const PusherStateContext = createContext("disconnected"); export function PusherProvider({ children }: { children: ReactNode }) { const token = useSessionStore((s) => s.token); - const clientRef = useRef(null); const [connectionState, setConnectionState] = useState("disconnected"); - useEffect(() => { + const client = useMemo(() => { if (!token) { - // Disconnect if token is cleared (logout) - if (clientRef.current) { - clientRef.current.disconnect(); - clientRef.current = null; - setConnectionState("disconnected"); - } - return; + return null; } - const client = new PusherClient({ + return new PusherClient({ url: appConfig.pusherUrl, getToken: () => useSessionStore.getState().token, }); + }, [token]); - clientRef.current = client; + useEffect(() => { + if (!client) { + return; + } const unsubscribeState = client.onStateChange((state) => { setConnectionState(state); @@ -46,12 +43,12 @@ export function PusherProvider({ children }: { children: ReactNode }) { return () => { unsubscribeState(); client.disconnect(); - clientRef.current = null; + setConnectionState("disconnected"); }; - }, [token]); + }, [client]); return ( - + {children} diff --git a/js/desktop/src/lib/sound-effects/engine.ts b/js/desktop/src/lib/sound-effects/engine.ts index 0f5adda..faf9700 100644 --- a/js/desktop/src/lib/sound-effects/engine.ts +++ b/js/desktop/src/lib/sound-effects/engine.ts @@ -79,7 +79,7 @@ class SoundEffectsEngine { */ preload(name: string, url: string): Promise { if (this.buffers.has(name)) { - return Promise.resolve(this.buffers.get(name)!); + return Promise.resolve(this.buffers.get(name)); } const existing = this.loading.get(name); if (existing) return existing; diff --git a/js/desktop/src/main.ts b/js/desktop/src/main.ts index 8f0f5e3..dc8b61d 100644 --- a/js/desktop/src/main.ts +++ b/js/desktop/src/main.ts @@ -4,7 +4,6 @@ import started from 'electron-squirrel-startup'; import { updateElectronApp, UpdateSourceType } from 'update-electron-app'; import { appConfig } from './config/env'; -import { logError } from './lib/errors'; import { safeHandle } from './main/ipc-utils'; import { initSentryMain } from './main/sentry'; diff --git a/js/desktop/src/renderer.tsx b/js/desktop/src/renderer.tsx index 0bbc099..7ea6609 100644 --- a/js/desktop/src/renderer.tsx +++ b/js/desktop/src/renderer.tsx @@ -5,5 +5,7 @@ import './styles/globals.css'; initSentryRenderer(); -const root = createRoot(document.getElementById('root')!); +const container = document.getElementById('root'); +if (!container) throw new Error('Root element #root not found'); +const root = createRoot(container); root.render(); diff --git a/js/desktop/src/screen_record_window/renderer.tsx b/js/desktop/src/screen_record_window/renderer.tsx index 7ef4c8e..d95f23b 100644 --- a/js/desktop/src/screen_record_window/renderer.tsx +++ b/js/desktop/src/screen_record_window/renderer.tsx @@ -5,5 +5,7 @@ import '@/styles/globals.css'; initSentryRenderer(); -const root = createRoot(document.getElementById('root')!); +const container = document.getElementById('root'); +if (!container) throw new Error('Root element #root not found'); +const root = createRoot(container); root.render(); diff --git a/js/desktop/src/web/renderer.tsx b/js/desktop/src/web/renderer.tsx index c875e2e..abaea31 100644 --- a/js/desktop/src/web/renderer.tsx +++ b/js/desktop/src/web/renderer.tsx @@ -5,5 +5,7 @@ import "@/styles/globals.css"; initSentryRenderer(); -const root = createRoot(document.getElementById("root")!); +const container = document.getElementById("root"); +if (!container) throw new Error("Root element #root not found"); +const root = createRoot(container); root.render(); diff --git a/js/desktop/yarn.lock b/js/desktop/yarn.lock index 60a0676..ede3825 100644 --- a/js/desktop/yarn.lock +++ b/js/desktop/yarn.lock @@ -1088,6 +1088,14 @@ minimist "^1.2.8" postject "^1.0.0-alpha.6" +"@emnapi/core@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.10.0.tgz#380ccc8f2412ea22d1d972df7f8ee23a3b9c7467" + integrity sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== + dependencies: + "@emnapi/wasi-threads" "1.2.1" + tslib "^2.4.0" + "@emnapi/core@^1.7.1", "@emnapi/core@^1.8.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" @@ -1096,6 +1104,13 @@ "@emnapi/wasi-threads" "1.1.0" tslib "^2.4.0" +"@emnapi/runtime@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.10.0.tgz#4b260c0d3534204e98c6110b8db1a987d26ec87c" + integrity sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== + dependencies: + tslib "^2.4.0" + "@emnapi/runtime@^1.7.1", "@emnapi/runtime@^1.8.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" @@ -1110,6 +1125,13 @@ dependencies: tslib "^2.4.0" +"@emnapi/wasi-threads@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz#28fed21a1ba1ce797c44a070abc94d42f3ae8548" + integrity sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== + dependencies: + tslib "^2.4.0" + "@epic-web/invariant@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@epic-web/invariant/-/invariant-1.0.0.tgz#1073e5dee6dd540410784990eb73e4acd25c9813" @@ -1237,7 +1259,7 @@ dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.6.1": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== @@ -2574,6 +2596,13 @@ "@emnapi/runtime" "^1.7.1" "@tybys/wasm-util" "^0.10.1" +"@napi-rs/wasm-runtime@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz#a46bbfedc29751b7170c5d23bc1d8ee8c7e3c1e1" + integrity sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow== + dependencies: + "@tybys/wasm-util" "^0.10.1" + "@noble/ciphers@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.3.0.tgz#f64b8ff886c240e644e5573c097f86e5b43676dc" @@ -4390,11 +4419,6 @@ dependencies: "@types/node" "*" -"@types/semver@^7.3.12": - version "7.7.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528" - integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== - "@types/statuses@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.6.tgz#66748315cc9a96d63403baa8671b2c124f8633aa" @@ -4439,31 +4463,30 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== +"@typescript-eslint/eslint-plugin@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz#8fc1e0a950c43270eaf0212dc060f7edaa42f9cf" + integrity sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw== dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.60.0" + "@typescript-eslint/type-utils" "8.60.0" + "@typescript-eslint/utils" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.5.0" -"@typescript-eslint/parser@^5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== +"@typescript-eslint/parser@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.60.0.tgz#38d611b8e658cb10850d4975e8a175a222fbcd6a" + integrity sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg== dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" + "@typescript-eslint/scope-manager" "8.60.0" + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/typescript-estree" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + debug "^4.4.3" "@typescript-eslint/project-service@8.57.1": version "8.57.1" @@ -4474,13 +4497,14 @@ "@typescript-eslint/types" "^8.57.1" debug "^4.4.3" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== +"@typescript-eslint/project-service@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.60.0.tgz#b82ab12e64d005d0c7163d1240c432381f1bde0f" + integrity sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/tsconfig-utils" "^8.60.0" + "@typescript-eslint/types" "^8.60.0" + debug "^4.4.3" "@typescript-eslint/scope-manager@8.57.1": version "8.57.1" @@ -4490,43 +4514,44 @@ "@typescript-eslint/types" "8.57.1" "@typescript-eslint/visitor-keys" "8.57.1" +"@typescript-eslint/scope-manager@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz#7617a4617c043fe235dcf066f9a40f106cfd2fd5" + integrity sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw== + dependencies: + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + "@typescript-eslint/tsconfig-utils@8.57.1", "@typescript-eslint/tsconfig-utils@^8.57.1": version "8.57.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz#9233443ec716882a6f9e240fd900a73f0235f3d7" integrity sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg== -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" +"@typescript-eslint/tsconfig-utils@8.60.0", "@typescript-eslint/tsconfig-utils@^8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz#3af78c48956227a407dea9626b8db8ca53f130d2" + integrity sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ== -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/type-utils@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz#6971a61bc4f3a1b2df45dcc14e26a43a88a4cb6a" + integrity sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg== + dependencies: + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/typescript-estree" "8.60.0" + "@typescript-eslint/utils" "8.60.0" + debug "^4.4.3" + ts-api-utils "^2.5.0" "@typescript-eslint/types@8.57.1", "@typescript-eslint/types@^8.57.1": version "8.57.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.57.1.tgz#54b27a8a25a7b45b4f978c3f8e00c4c78f11142c" integrity sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ== -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" +"@typescript-eslint/types@8.60.0", "@typescript-eslint/types@^8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.60.0.tgz#e77ad768e933263b1960b2fe79de75fe1cc6e7db" + integrity sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA== "@typescript-eslint/typescript-estree@8.57.1": version "8.57.1" @@ -4543,19 +4568,30 @@ tinyglobby "^0.2.15" ts-api-utils "^2.4.0" -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== +"@typescript-eslint/typescript-estree@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz#c102196a44414481190041c99eea1d854e66001b" + integrity sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g== dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" + "@typescript-eslint/project-service" "8.60.0" + "@typescript-eslint/tsconfig-utils" "8.60.0" + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/visitor-keys" "8.60.0" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.5.0" + +"@typescript-eslint/utils@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.60.0.tgz#6110cddaef87606ae4ca6f8bf81bb5949fc8e098" + integrity sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.60.0" + "@typescript-eslint/types" "8.60.0" + "@typescript-eslint/typescript-estree" "8.60.0" "@typescript-eslint/utils@^8.48.0": version "8.57.1" @@ -4567,14 +4603,6 @@ "@typescript-eslint/types" "8.57.1" "@typescript-eslint/typescript-estree" "8.57.1" -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - "@typescript-eslint/visitor-keys@8.57.1": version "8.57.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz#3af4f88118924d3be983d4b8ae84803f11fe4563" @@ -4583,11 +4611,133 @@ "@typescript-eslint/types" "8.57.1" eslint-visitor-keys "^5.0.0" +"@typescript-eslint/visitor-keys@8.60.0": + version "8.60.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz#f2c41eedd3d7b03b808369fb2e3fb40a93783ec2" + integrity sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg== + dependencies: + "@typescript-eslint/types" "8.60.0" + eslint-visitor-keys "^5.0.0" + "@ungap/structured-clone@^1.2.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== +"@unrs/resolver-binding-android-arm-eabi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz#98a9fee62c01f209747a4ab5855f1ced38a6d03a" + integrity sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w== + +"@unrs/resolver-binding-android-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz#46b7e8a1393f907462324f1576e8883529acf066" + integrity sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ== + +"@unrs/resolver-binding-darwin-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz#0ea07b00e2583ab004b853d4c02ec5f0745d490c" + integrity sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w== + +"@unrs/resolver-binding-darwin-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz#a2a6901ed58449b91b4438e582f6890cba956049" + integrity sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA== + +"@unrs/resolver-binding-freebsd-x64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz#ebe6fe7f6706b7378ea4a48a024602e9c2f48f89" + integrity sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz#e6040fedaa240124419d35b25b69c5fa15ddb499" + integrity sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz#d217a8fb59f659c131539326c140e7b62e3e3c6a" + integrity sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g== + +"@unrs/resolver-binding-linux-arm64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz#edab13c46a45783a7e01351e113825c04f352e24" + integrity sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg== + +"@unrs/resolver-binding-linux-arm64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz#e5e195db1130f7d3b6aa2fd67b3c9fe1ea4859a0" + integrity sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA== + +"@unrs/resolver-binding-linux-loong64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz#f01d22e091bae13016f4636698d9dcbbda775c3e" + integrity sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q== + +"@unrs/resolver-binding-linux-loong64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz#7d23efcb98adf076bfbcecc27b4212c36aa6697d" + integrity sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz#1f35f1eaa322f33cf2d96dac27f0626a93ffe2f6" + integrity sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz#674faa696f5ce96f214873946a1e2d6ca96723dd" + integrity sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A== + +"@unrs/resolver-binding-linux-riscv64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz#37835fdd0b472ecdcffccd4288f19018454b138c" + integrity sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w== + +"@unrs/resolver-binding-linux-s390x-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz#b6edf13db4bb0accdcd1ad482a4eea0301de9224" + integrity sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw== + +"@unrs/resolver-binding-linux-x64-gnu@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz#daddad00bf65a405202284da1eb1db8eb83b218f" + integrity sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ== + +"@unrs/resolver-binding-linux-x64-musl@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz#dfdff1e0c2bad25420b41c76a746011c3983b9bb" + integrity sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A== + +"@unrs/resolver-binding-openharmony-arm64@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz#ce07c4f5e7b42f7bfce45e7629b8659063aefefe" + integrity sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ== + +"@unrs/resolver-binding-wasm32-wasi@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz#82514f0506cfaf65f17fe16095f92d450e487183" + integrity sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A== + dependencies: + "@emnapi/core" "1.10.0" + "@emnapi/runtime" "1.10.0" + "@napi-rs/wasm-runtime" "^1.1.4" + +"@unrs/resolver-binding-win32-arm64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz#521427dd59a8f4740ddd1dc7c3bc6af1aa1d260d" + integrity sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g== + +"@unrs/resolver-binding-win32-ia32-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz#05b63286ff2da37e0ce3083b8390884385efff62" + integrity sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g== + +"@unrs/resolver-binding-win32-x64-msvc@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz#72da0da48d72b1e87831b9c0308931d3f4669027" + integrity sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA== + "@vitejs/plugin-react@^5.1.4": version "5.1.4" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz#5b477e060bf612a7394c4febacc5de33a219b0e4" @@ -5009,11 +5159,6 @@ array-includes@^3.1.9: is-string "^1.1.1" math-intrinsics "^1.1.0" -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - array.prototype.findlastindex@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" @@ -5696,7 +5841,7 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.3: +debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -5844,13 +5989,6 @@ dir-compare@^4.2.0: minimatch "^3.0.5" p-limit "^3.1.0 " -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -6239,6 +6377,19 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== +eslint-config-prettier@^10.1.8: + version "10.1.8" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== + +eslint-import-context@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe" + integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg== + dependencies: + get-tsconfig "^4.10.1" + stable-hash-x "^0.2.0" + eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" @@ -6248,6 +6399,19 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" +eslint-import-resolver-typescript@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.5.tgz#3058afec12595b3c036c34f8a1066fb9e18fff0c" + integrity sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw== + dependencies: + debug "^4.4.1" + eslint-import-context "^0.1.8" + get-tsconfig "^4.10.1" + is-bun-module "^2.0.0" + stable-hash-x "^0.2.0" + tinyglobby "^0.2.14" + unrs-resolver "^1.7.11" + eslint-module-utils@^2.12.1: version "2.12.1" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" @@ -6291,7 +6455,7 @@ eslint-plugin-react-hooks@^7.0.1: zod "^3.25.0 || ^4.0.0" zod-validation-error "^3.5.0 || ^4.0.0" -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -6307,7 +6471,7 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== @@ -6563,7 +6727,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.3: +fast-glob@^3.2.7, fast-glob@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -7045,6 +7209,13 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" +get-tsconfig@^4.10.1: + version "4.14.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz#985d85c52a9903864280ccc2448d413fbf1efed8" + integrity sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA== + dependencies: + resolve-pkg-maps "^1.0.0" + github-url-to-object@^4.0.4: version "4.0.6" resolved "https://registry.yarnpkg.com/github-url-to-object/-/github-url-to-object-4.0.6.tgz#5ea8701dc8c336b8d582dc3fa5bf964165c3b365" @@ -7128,18 +7299,6 @@ globalthis@^1.0.1, globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - google-auth-library@^9.6.3: version "9.15.1" resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928" @@ -7389,6 +7548,11 @@ ignore@^5.2.0, ignore@^5.3.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" @@ -7526,6 +7690,13 @@ is-boolean-object@^1.2.1: call-bound "^1.0.3" has-tostringtag "^1.0.2" +is-bun-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== + dependencies: + semver "^7.7.1" + is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -8440,7 +8611,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -8984,10 +9155,10 @@ nanoid@^5.0.9: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.1.11.tgz#559dbdbc41737da341ac938c25514563d2dd94c7" integrity sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== +napi-postinstall@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== natural-compare@^1.4.0: version "1.4.0" @@ -9438,11 +9609,6 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - pe-library@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pe-library/-/pe-library-1.0.1.tgz#02735430885a622576a53cd8827658b7d2fada0e" @@ -9489,6 +9655,11 @@ picomatch@^4.0.2, picomatch@^4.0.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== +picomatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -9583,6 +9754,11 @@ prettier@^3.4.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== +prettier@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.3.tgz#560f2de55bf01b4c0503bc629d5df99b9a1d09b0" + integrity sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw== + pretty-ms@^9.2.0: version "9.3.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.3.0.tgz#dd2524fcb3c326b4931b2272dfd1e1a8ed9a9f5a" @@ -10162,6 +10338,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.4: version "1.22.11" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" @@ -10421,11 +10602,16 @@ semver@^6.2.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.7.3: +semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.7.3: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== +semver@^7.7.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.1.tgz#bf4970b5e70fda0686363cc18bfe8805d5ed957e" + integrity sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg== + send@^1.1.0, send@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" @@ -10633,11 +10819,6 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" @@ -10734,6 +10915,11 @@ ssri@^9.0.0: dependencies: minipass "^3.1.1" +stable-hash-x@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" + integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ== + stack-generator@^2.0.5: version "2.0.10" resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.10.tgz#8ae171e985ed62287d4f1ed55a1633b3fb53bb4d" @@ -11062,6 +11248,14 @@ tinyexec@^1.0.1: resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251" integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== +tinyglobby@^0.2.14: + version "0.2.17" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" + integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" @@ -11147,6 +11341,11 @@ ts-api-utils@^2.4.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== +ts-api-utils@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== + ts-easing@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" @@ -11184,18 +11383,6 @@ tslib@2.8.1, tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8. resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - tw-animate-css@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/tw-animate-css/-/tw-animate-css-1.4.0.tgz#b4a06f68244cba39428aa47e65e6e4c0babc21ee" @@ -11296,6 +11483,16 @@ typed-emitter@^2.1.0: optionalDependencies: rxjs "^7.5.2" +typescript-eslint@^8.60.0: + version "8.60.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.60.0.tgz#6686fecb1f4f367c0bf0075828e93b7ecacbc62b" + integrity sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw== + dependencies: + "@typescript-eslint/eslint-plugin" "8.60.0" + "@typescript-eslint/parser" "8.60.0" + "@typescript-eslint/typescript-estree" "8.60.0" + "@typescript-eslint/utils" "8.60.0" + typescript@^5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" @@ -11417,6 +11614,36 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unrs-resolver@^1.7.11: + version "1.12.2" + resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.12.2.tgz#a6c6888396abba5adaac4cab6587df866f1d7afd" + integrity sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ== + dependencies: + napi-postinstall "^0.3.4" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.12.2" + "@unrs/resolver-binding-android-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-arm64" "1.12.2" + "@unrs/resolver-binding-darwin-x64" "1.12.2" + "@unrs/resolver-binding-freebsd-x64" "1.12.2" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.12.2" + "@unrs/resolver-binding-linux-arm64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-arm64-musl" "1.12.2" + "@unrs/resolver-binding-linux-loong64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-loong64-musl" "1.12.2" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-riscv64-musl" "1.12.2" + "@unrs/resolver-binding-linux-s390x-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-gnu" "1.12.2" + "@unrs/resolver-binding-linux-x64-musl" "1.12.2" + "@unrs/resolver-binding-openharmony-arm64" "1.12.2" + "@unrs/resolver-binding-wasm32-wasi" "1.12.2" + "@unrs/resolver-binding-win32-arm64-msvc" "1.12.2" + "@unrs/resolver-binding-win32-ia32-msvc" "1.12.2" + "@unrs/resolver-binding-win32-x64-msvc" "1.12.2" + until-async@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/until-async/-/until-async-3.0.2.tgz#447f1531fdd7bb2b4c7a98869bdb1a4c2a23865f"