From f3f927bdbb2cf0915dd1cc2f071cbbeda48e4d76 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Wed, 6 May 2026 14:32:12 +0200 Subject: [PATCH] feat(nym-wallet): delegation query cache, log UX, log webview telemetry - TanStack Query for delegation summary (5m stale, fetch on /delegation only) - Context exposes isFetching, isError, lastUpdatedAtMs; list summaries use isFetching - Delegation page: last updated label, error alert, stable 5m poll via ref - LogViewer: Copy latest/all, Clear list (clipboard plugin) - Log window: on_page_load Started/Finished logs; NYM_WALLET_LOG_WEBVIEW_DEVTOOLS=1 opens devtools - Comment linking programmatic use_https_scheme to tauri.conf --- nym-wallet/Cargo.lock | 1 + nym-wallet/package.json | 5 +- .../src-tauri/src/operations/app/window.rs | 1 + .../src-tauri/src/operations/help/log.rs | 17 + nym-wallet/src/common.tsx | 36 +- .../components/Delegation/DelegationList.tsx | 2 +- nym-wallet/src/components/LogViewer/index.tsx | 55 ++- nym-wallet/src/context/delegationQuery.ts | 46 +++ nym-wallet/src/context/delegations.tsx | 148 ++++--- nym-wallet/src/context/mocks/delegations.tsx | 3 + nym-wallet/src/pages/delegation/index.tsx | 58 ++- yarn.lock | 362 +++++++++++++++++- 12 files changed, 604 insertions(+), 130 deletions(-) create mode 100644 nym-wallet/src/context/delegationQuery.ts diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 8d18426b8f..128245b4bb 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -4736,6 +4736,7 @@ dependencies = [ "bytes", "cfg-if", "encoding_rs", + "fastrand", "hickory-resolver", "http 1.3.1", "inventory", diff --git a/nym-wallet/package.json b/nym-wallet/package.json index b3964e4947..09541d0e09 100644 --- a/nym-wallet/package.json +++ b/nym-wallet/package.json @@ -27,6 +27,7 @@ }, "dependencies": { "@babel/helper-simple-access": "^7.25.9", + "@emotion/cache": "^11.14.0", "@emotion/react": "^11.7.0", "@emotion/styled": "^11.6.0", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", @@ -38,6 +39,7 @@ "@nymproject/node-tester": "^1.3.1", "@nymproject/react": "^1.0.0", "@nymproject/types": "^1.0.0", + "@tanstack/react-query": "^5.62.0", "@tauri-apps/api": "^2.10.1", "@tauri-apps/plugin-clipboard-manager": "^2.3.2", "@tauri-apps/plugin-opener": "^2.5.3", @@ -46,7 +48,6 @@ "@tauri-apps/tauri-forage": "^1.0.0-beta.2", "big.js": "^6.2.1", "bs58": "^4.0.1", - "@emotion/cache": "^11.14.0", "clsx": "^1.1.1", "date-fns": "^2.28.0", "joi": "^17.11.0", @@ -138,4 +139,4 @@ "@types/minimatch": "5.1.2" }, "private": false -} \ No newline at end of file +} diff --git a/nym-wallet/src-tauri/src/operations/app/window.rs b/nym-wallet/src-tauri/src/operations/app/window.rs index a40c1d9688..5748fd6082 100644 --- a/nym-wallet/src-tauri/src/operations/app/window.rs +++ b/nym-wallet/src-tauri/src/operations/app/window.rs @@ -34,6 +34,7 @@ async fn create_window( ) .title("Nym Wallet") .background_color(NYM_WALLET_WEBVIEW_BG) + // Must match `app.windows[].useHttpsScheme` in tauri.conf.json or asset URLs and CSP can disagree across webviews. .use_https_scheme(true) .build() { diff --git a/nym-wallet/src-tauri/src/operations/help/log.rs b/nym-wallet/src-tauri/src/operations/help/log.rs index 0139c93da1..84b18901b5 100644 --- a/nym-wallet/src-tauri/src/operations/help/log.rs +++ b/nym-wallet/src-tauri/src/operations/help/log.rs @@ -1,5 +1,6 @@ use crate::error::BackendError; use crate::webview_theme::NYM_WALLET_WEBVIEW_BG; +use tauri::webview::PageLoadEvent; use tauri::Manager; #[tauri::command] @@ -20,7 +21,23 @@ pub fn help_log_toggle_window(app_handle: tauri::AppHandle) -> Result<(), Backen ) .title("Nym Wallet Logs") .background_color(NYM_WALLET_WEBVIEW_BG) + // Match `app.windows[].useHttpsScheme` in tauri.conf.json (see `operations/app/window.rs`). .use_https_scheme(true) + .on_page_load(|window, payload| match payload.event() { + PageLoadEvent::Started => { + log::debug!("Log webview load started: {}", payload.url()); + } + PageLoadEvent::Finished => { + log::info!("Log webview load finished: {}", payload.url()); + if std::env::var("NYM_WALLET_LOG_WEBVIEW_DEVTOOLS") + .ok() + .as_deref() + == Some("1") + { + window.open_devtools(); + } + } + }) .build() { Ok(window) => { diff --git a/nym-wallet/src/common.tsx b/nym-wallet/src/common.tsx index 03b90c8d62..15f1739f34 100644 --- a/nym-wallet/src/common.tsx +++ b/nym-wallet/src/common.tsx @@ -1,4 +1,5 @@ import React, { ComponentType, useEffect } from 'react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ErrorBoundary } from 'react-error-boundary'; import { BrowserRouter, HashRouter } from 'react-router-dom'; import { SnackbarProvider } from 'notistack'; @@ -11,6 +12,15 @@ import { useTauriTextEditingClipboard } from './hooks/useTauriTextEditingClipboa type RouterComponent = ComponentType<{ children?: React.ReactNode }>; +const walletQueryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 1, + refetchOnWindowFocus: false, + }, + }, +}); + const ClipboardBridge: FCWithChildren = ({ children }) => { useTauriTextEditingClipboard(); return children; @@ -48,18 +58,20 @@ export const AppCommon = ({ return ( - - - - {children} - - - + + + + + {children} + + + + ); diff --git a/nym-wallet/src/components/Delegation/DelegationList.tsx b/nym-wallet/src/components/Delegation/DelegationList.tsx index 51ad848a49..ee4e51c015 100644 --- a/nym-wallet/src/components/Delegation/DelegationList.tsx +++ b/nym-wallet/src/components/Delegation/DelegationList.tsx @@ -112,7 +112,7 @@ export const DelegationList: FCWithChildren<{ totalDelegations, totalRewards, totalDelegationsAndRewards, - isLoading: delegationsSummaryLoading, + isFetching: delegationsSummaryLoading, } = useDelegationContext(); const sorted = useSortDelegations(items, order, orderBy); diff --git a/nym-wallet/src/components/LogViewer/index.tsx b/nym-wallet/src/components/LogViewer/index.tsx index 037de4022a..ae76a09351 100644 --- a/nym-wallet/src/components/LogViewer/index.tsx +++ b/nym-wallet/src/components/LogViewer/index.tsx @@ -16,6 +16,7 @@ import { Typography, useTheme, } from '@mui/material'; +import { writeText } from '@tauri-apps/plugin-clipboard-manager'; import { helpLogToggleWindow } from 'src/requests/logging'; import { Console } from 'src/utils/console'; @@ -144,6 +145,33 @@ export const LogViewer: FC = () => { } }; + const formatLine = (m: RecordPayload) => `${getLogLevelName(m.level)}\t${m.message}`; + + const handleCopyAll = async () => { + if (messages.length === 0) return; + try { + const chronological = [...messages].reverse(); + await writeText(chronological.map(formatLine).join('\n')); + } catch (e) { + Console.error(e); + } + }; + + const handleCopyLatest = async () => { + const latest = messages[0]; + if (!latest) return; + try { + await writeText(formatLine(latest)); + } catch (e) { + Console.error(e); + } + }; + + const handleClearList = () => { + setMessages([]); + setMessageCount(0); + }; + return ( { color: '#666666', }} > - - - {messageCount} log entries since opening this window - - + + + + {messageCount} log entries since opening this window + + + + + + + + diff --git a/nym-wallet/src/context/delegationQuery.ts b/nym-wallet/src/context/delegationQuery.ts new file mode 100644 index 0000000000..0739ea1d21 --- /dev/null +++ b/nym-wallet/src/context/delegationQuery.ts @@ -0,0 +1,46 @@ +import type { DelegationWithEverything, WrappedDelegationEvent } from '@nymproject/types'; +import { getAllPendingDelegations } from 'src/requests'; +import { getDelegationSummary } from 'src/requests/delegation'; +import { decCoinToDisplay } from 'src/utils'; + +export const delegationQueryKeys = { + all: ['nym-wallet', 'delegations'] as const, + summary: (address: string) => [...delegationQueryKeys.all, 'summary', address] as const, +}; + +export type DelegationSummaryQueryResult = { + delegations: (DelegationWithEverything | WrappedDelegationEvent)[]; + pendingDelegations: WrappedDelegationEvent[]; + totalDelegations: string; + totalRewards: string; + totalDelegationsAndRewards: string; +}; + +export async function fetchDelegationSummaryQuery(): Promise { + const data = await getDelegationSummary(); + const pending = await getAllPendingDelegations(); + + const pendingOnNewNodes = pending.filter((event) => { + const some = data.delegations.some(({ node_identity }) => node_identity === event.node_identity); + return !some; + }); + const items = data.delegations.map((delegation) => ({ + ...delegation, + amount: decCoinToDisplay(delegation.amount), + unclaimed_rewards: delegation.unclaimed_rewards && decCoinToDisplay(delegation.unclaimed_rewards), + cost_params: delegation.cost_params && { + ...delegation.cost_params, + interval_operating_cost: decCoinToDisplay(delegation.cost_params.interval_operating_cost), + }, + })); + + const delegationsAndRewards = (+data.total_delegations.amount + +data.total_rewards.amount).toFixed(6); + + return { + delegations: [...items, ...pendingOnNewNodes], + pendingDelegations: pending, + totalDelegations: `${data.total_delegations.amount} ${data.total_delegations.denom}`, + totalRewards: `${data.total_rewards.amount} ${data.total_rewards.denom}`, + totalDelegationsAndRewards: `${delegationsAndRewards} ${data.total_delegations.denom}`, + }; +} diff --git a/nym-wallet/src/context/delegations.tsx b/nym-wallet/src/context/delegations.tsx index 6eae7a9dfd..3d4f21b788 100644 --- a/nym-wallet/src/context/delegations.tsx +++ b/nym-wallet/src/context/delegations.tsx @@ -1,6 +1,7 @@ -import React, { createContext, FC, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; +import React, { createContext, FC, useCallback, useContext, useEffect, useMemo } from 'react'; import { useLocation } from 'react-router-dom'; -import { getDelegationSummary, undelegateFromMixnode } from 'src/requests/delegation'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import { undelegateFromMixnode } from 'src/requests/delegation'; import { DecCoin, DelegationWithEverything, @@ -10,16 +11,11 @@ import { WrappedDelegationEvent, } from '@nymproject/types'; import type { Network } from 'src/types'; -import { - delegateToMixnode, - getAllPendingDelegations, - vestingDelegateToMixnode, - vestingUndelegateFromMixnode, -} from 'src/requests'; +import { delegateToMixnode, vestingDelegateToMixnode, vestingUndelegateFromMixnode } from 'src/requests'; import { TPoolOption } from 'src/components'; -import { decCoinToDisplay } from 'src/utils'; import { Console } from 'src/utils/console'; import { AppContext } from 'src/context/main'; +import { delegationQueryKeys, fetchDelegationSummaryQuery } from './delegationQuery'; export type TDelegationRefreshOptions = { /** When true, do not flip the global loading state (keeps cached list visible during refetch). */ @@ -29,6 +25,9 @@ export type TDelegationRefreshOptions = { export type TDelegationContext = { delegationItemErrors?: { nodeId: string; errors: string }; isLoading: boolean; + isFetching: boolean; + isError: boolean; + lastUpdatedAtMs: number; delegations?: TDelegations; pendingDelegations?: WrappedDelegationEvent[]; totalDelegations?: string; @@ -60,6 +59,9 @@ export const isDelegation = (delegation: DelegationWithEvent): delegation is Del export const DelegationContext = createContext({ isLoading: false, + isFetching: false, + isError: false, + lastUpdatedAtMs: 0, refresh: async (_opts?: TDelegationRefreshOptions) => undefined, addDelegation: async () => { throw new Error('Not implemented'); @@ -73,23 +75,50 @@ export const DelegationContext = createContext({ setDelegationItemErrors: () => undefined, }); +function isDelegationRoutePath(pathname: string): boolean { + return pathname === '/delegation' || pathname.endsWith('/delegation'); +} + export const DelegationContextProvider: FC<{ network?: Network; children: React.ReactNode; // eslint-disable-next-line @typescript-eslint/no-unused-vars }> = ({ network, children }) => { const location = useLocation(); + const queryClient = useQueryClient(); const { clientDetails } = useContext(AppContext); const clientAddress = clientDetails?.client_address; - const [isLoading, setIsLoading] = useState(false); - const [delegationItemErrors, setDelegationItemErrors] = useState<{ nodeId: string; errors: string }>(); - const [delegations, setDelegations] = useState(); - const [totalDelegations, setTotalDelegations] = useState(); - const [totalRewards, setTotalRewards] = useState(); - const [totalDelegationsAndRewards, setTotalDelegationsAndRewards] = useState(); - const [pendingDelegations, setPendingDelegations] = useState(); - const delegationsRef = useRef(undefined); - delegationsRef.current = delegations; + const onDelegationRoute = isDelegationRoutePath(location.pathname); + + const [delegationItemErrors, setDelegationItemErrors] = React.useState<{ nodeId: string; errors: string }>(); + + const query = useQuery({ + queryKey: delegationQueryKeys.summary(clientAddress ?? ''), + queryFn: fetchDelegationSummaryQuery, + enabled: Boolean(clientAddress) && onDelegationRoute, + staleTime: 5 * 60 * 1000, + gcTime: 30 * 60 * 1000, + }); + + useEffect(() => { + if (!clientAddress) { + queryClient.removeQueries({ queryKey: delegationQueryKeys.all }); + } + }, [clientAddress, queryClient]); + + const bundle = clientAddress && onDelegationRoute ? query.data : undefined; + + const refresh = useCallback( + async (_opts?: TDelegationRefreshOptions) => { + if (!clientAddress) { + return; + } + await queryClient.invalidateQueries({ + queryKey: delegationQueryKeys.summary(clientAddress), + }); + }, + [clientAddress, queryClient], + ); const addDelegation = async (data: { mix_id: number; amount: DecCoin }, tokenPool: TPoolOption, fee?: FeeDetails) => { try { @@ -107,70 +136,24 @@ export const DelegationContextProvider: FC<{ } }; - const refresh = useCallback(async (opts?: TDelegationRefreshOptions) => { - if (!opts?.background) { - setIsLoading(true); - } - try { - const data = await getDelegationSummary(); - const pending = await getAllPendingDelegations(); + const delegations = bundle?.delegations; + const pendingDelegations = bundle?.pendingDelegations; + const totalDelegations = bundle?.totalDelegations; + const totalRewards = bundle?.totalRewards; + const totalDelegationsAndRewards = bundle?.totalDelegationsAndRewards; - const pendingOnNewNodes = pending.filter((event) => { - const some = data.delegations.some(({ node_identity }) => node_identity === event.node_identity); - return !some; - }); - const items = data.delegations.map((delegation) => ({ - ...delegation, - amount: decCoinToDisplay(delegation.amount), - unclaimed_rewards: delegation.unclaimed_rewards && decCoinToDisplay(delegation.unclaimed_rewards), - cost_params: delegation.cost_params && { - ...delegation.cost_params, - interval_operating_cost: decCoinToDisplay(delegation.cost_params.interval_operating_cost), - }, - })); - - const delegationsAndRewards = (+data.total_delegations.amount + +data.total_rewards.amount).toFixed(6); - - setPendingDelegations(pending); - setDelegations([...items, ...pendingOnNewNodes]); - setTotalDelegations(`${data.total_delegations.amount} ${data.total_delegations.denom}`); - setTotalRewards(`${data.total_rewards.amount} ${data.total_rewards.denom}`); - setTotalDelegationsAndRewards(`${delegationsAndRewards} ${data.total_delegations.denom}`); - } catch (e) { - Console.error(e); - } - setIsLoading(false); - }, []); - - useEffect(() => { - if (!clientAddress) { - setDelegations(undefined); - setPendingDelegations(undefined); - setTotalDelegations(undefined); - setTotalRewards(undefined); - setTotalDelegationsAndRewards(undefined); - setIsLoading(false); - } - }, [clientAddress]); - - useEffect(() => { - if (!clientAddress) { - return; - } - const onDelegationRoute = location.pathname === '/delegation' || location.pathname.endsWith('/delegation'); - if (!onDelegationRoute) { - return; - } - const hasCache = delegationsRef.current !== undefined; - refresh(hasCache ? { background: true } : undefined).catch((err) => { - Console.error(err); - }); - }, [clientAddress, location.pathname, refresh]); + const isLoading = Boolean(clientAddress) && onDelegationRoute && query.isPending; + const isFetching = Boolean(clientAddress) && onDelegationRoute && query.isFetching; + const isError = Boolean(clientAddress) && onDelegationRoute && query.isError && !query.data; + const lastUpdatedAtMs = bundle ? query.dataUpdatedAt : 0; const memoizedValue = useMemo( () => ({ delegationItemErrors, isLoading, + isFetching, + isError, + lastUpdatedAtMs, delegations, pendingDelegations, totalDelegations, @@ -183,9 +166,12 @@ export const DelegationContextProvider: FC<{ undelegateVesting: vestingUndelegateFromMixnode, }), [ - isLoading, - delegations, delegationItemErrors, + isLoading, + isFetching, + isError, + lastUpdatedAtMs, + delegations, pendingDelegations, totalDelegations, totalRewards, @@ -194,6 +180,12 @@ export const DelegationContextProvider: FC<{ ], ); + useEffect(() => { + if (query.isError && query.error) { + Console.error(query.error); + } + }, [query.isError, query.error]); + return {children}; }; diff --git a/nym-wallet/src/context/mocks/delegations.tsx b/nym-wallet/src/context/mocks/delegations.tsx index 69c53d09dc..783ed2b4dd 100644 --- a/nym-wallet/src/context/mocks/delegations.tsx +++ b/nym-wallet/src/context/mocks/delegations.tsx @@ -237,6 +237,9 @@ export const MockDelegationContextProvider: FCWithChildren = ({ children }) => { delegationItemErrors, setDelegationItemErrors, isLoading, + isFetching: isLoading, + isError: Boolean(error), + lastUpdatedAtMs: 0, error, delegations, totalDelegations, diff --git a/nym-wallet/src/pages/delegation/index.tsx b/nym-wallet/src/pages/delegation/index.tsx index 024bf3e8de..07e96aa7fa 100644 --- a/nym-wallet/src/pages/delegation/index.tsx +++ b/nym-wallet/src/pages/delegation/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useContext, useEffect, useRef, useState } from 'react'; +import React, { FC, useCallback, useContext, useEffect, useRef, useState } from 'react'; import { OpenInNew } from '@mui/icons-material'; import { Alert, AlertTitle, Box, Button, CircularProgress, LinearProgress, Stack, Typography } from '@mui/material'; import { alpha, useTheme } from '@mui/material/styles'; @@ -11,6 +11,7 @@ import { Console } from 'src/utils/console'; import { OverSaturatedBlockerModal } from 'src/components/Delegation/DelegateBlocker'; import { getSpendableCoins, migrateVestedDelegations, userBalance } from 'src/requests'; import { LoadingModal } from 'src/components/Modals/LoadingModal'; +import { format } from 'date-fns'; import { getIntervalAsDate, toPercentIntegerString } from 'src/utils'; import { isDelegation, TDelegations, useDelegationContext } from '../../context/delegations'; import { useRewardsContext } from '../../context/rewards'; @@ -44,6 +45,9 @@ export const DelegationPage: FC = () => { const { delegations, isLoading, + isFetching, + isError, + lastUpdatedAtMs, addDelegation, undelegate, undelegateVesting, @@ -57,8 +61,6 @@ export const DelegationPage: FC = () => { const { claimRewards } = useRewardsContext(); - const refresh = async () => refreshDelegations(delegations !== undefined ? { background: true } : undefined); - // If an action modal is open, don't show the loading modal const isActionModalOpen = showNewDelegationModal || @@ -83,23 +85,29 @@ export const DelegationPage: FC = () => { }; }; - const getNextInterval = async () => { + const getNextInterval = useCallback(async () => { try { const { nextEpoch: newNextEpoch } = await getIntervalAsDate(); setNextEpoch(newNextEpoch); } catch { setNextEpoch(Error()); } - }; + }, []); - const refreshWithIntervalUpdate = async () => { - refresh(); - getNextInterval(); - }; + const refreshWithIntervalUpdate = useCallback(async () => { + await refreshDelegations(); + await getNextInterval(); + }, [refreshDelegations, getNextInterval]); + + const refreshWithIntervalUpdateRef = useRef(refreshWithIntervalUpdate); + refreshWithIntervalUpdateRef.current = refreshWithIntervalUpdate; - // Refresh the rewards and delegations periodically when page is mounted useEffect(() => { - const timer = setInterval(refreshWithIntervalUpdate, 5 * 60 * 1000); // every 5 minutes + const timer = setInterval(() => { + refreshWithIntervalUpdateRef.current().catch((err) => { + Console.error(err); + }); + }, 5 * 60 * 1000); return () => clearInterval(timer); }, []); @@ -322,11 +330,21 @@ export const DelegationPage: FC = () => { const delegationsComponent = (delegationItems: TDelegations | undefined) => { if (delegationItems === undefined) { - return ( - - - - ); + if (isError) { + return ( + + Could not load delegation data. Check your connection and try again. + + ); + } + if (isLoading) { + return ( + + + + ); + } + return null; } if (delegationItems.length > 0) { @@ -483,7 +501,7 @@ export const DelegationPage: FC = () => { )} - {isLoading && delegations !== undefined && !isActionModalOpen && ( + {isFetching && delegations !== undefined && !isActionModalOpen && ( { /> )} + {lastUpdatedAtMs > 0 && ( + + Last updated {format(lastUpdatedAtMs, 'PPpp')} + + )} + {delegationsComponent(delegations)} diff --git a/yarn.lock b/yarn.lock index 71d2ce1626..ca139999cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1463,7 +1463,7 @@ "@cosmjs/math" "^0.32.4" "@cosmjs/utils" "^0.32.4" -"@cosmjs/cosmwasm-stargate@^0.32.3", "@cosmjs/cosmwasm-stargate@^0.32.4": +"@cosmjs/cosmwasm-stargate@^0.32.3": version "0.32.4" resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.4.tgz#2ee93f2cc0b1c146ac369b2bf8ef9ee2e159fd50" integrity sha512-Fuo9BGEiB+POJ5WeRyBGuhyKR1ordvxZGLPuPosFJOH9U0gKMgcjwKMCgAlWFkMlHaTB+tNdA8AifWiHrI7VgA== @@ -1851,18 +1851,41 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.4.0", "@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== +"@eslint/config-array@^0.21.2": + version "0.21.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" + integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.5" + +"@eslint/config-helpers@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" + +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== + dependencies: + "@types/json-schema" "^7.0.15" + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -1878,11 +1901,44 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.3.5": + version "3.3.5" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.5.tgz#c131793cfc1a7b96f24a83e0a8bbd4b881558c60" + integrity sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg== + dependencies: + ajv "^6.14.0" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.1" + minimatch "^3.1.5" + strip-json-comments "^3.1.1" + "@eslint/js@8.57.1": version "8.57.1" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@eslint/js@9.39.4": + version "9.39.4" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.4.tgz#a3f83bfc6fd9bf33a853dfacd0b49b398eb596c1" + integrity sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw== + +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== + dependencies: + "@eslint/core" "^0.17.0" + levn "^0.4.1" + "@ethersproject/address@^5.6.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" @@ -2035,6 +2091,27 @@ resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.9.11.tgz#9ce96e7746625a89239f68ca57c4f654264c17ef" integrity sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ== +"@humanfs/core@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" + integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== + dependencies: + "@humanfs/types" "^0.15.0" + +"@humanfs/node@^0.16.6": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" + integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== + dependencies: + "@humanfs/core" "^0.19.2" + "@humanfs/types" "^0.15.0" + "@humanwhocodes/retry" "^0.4.0" + +"@humanfs/types@^0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" + integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== + "@humanwhocodes/config-array@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" @@ -2054,6 +2131,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" @@ -6209,6 +6291,11 @@ dependencies: remove-accents "0.5.0" +"@tanstack/query-core@5.100.9": + version "5.100.9" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.100.9.tgz#dcf44ef25cf42a4da229bcab1d8d33e80a740a99" + integrity sha512-SJSFw1S8+kQ0+knv/XGfrbocWoAlT7vDKsSImtLx3ZPQmEcR46hkDjLSvynSy25N8Ms4tIEini1FuBd5k7IscQ== + "@tanstack/query-core@5.90.5": version "5.90.5" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.90.5.tgz#0175f9f517514906db8ab379589ed3f96694ecc4" @@ -6231,6 +6318,13 @@ resolved "https://registry.yarnpkg.com/@tanstack/react-query-next-experimental/-/react-query-next-experimental-5.90.2.tgz#4454119d2e5ac7aa42dfb540ba300e956f4336df" integrity sha512-f7vJ9SHRO5GjiTBIpaSdLTczPlDybu6OzLG2thcNev55Qi69JkYsSOyUVWKpa3tGgufyJx1kDAO5lJjv4jF/bw== +"@tanstack/react-query@^5.62.0": + version "5.100.9" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.100.9.tgz#0c701bf56f38b484602255a92d4c9e452a04807d" + integrity sha512-Oa44XkaI3kCNN6ME0KByU3xT3SEUNOMfZpHxL6+wFoTm+OeUFYHKdeYVe0aOXlRDm/f15sgLwEt2HDorIdW8+A== + dependencies: + "@tanstack/query-core" "5.100.9" + "@tanstack/react-query@^5.64.2": version "5.90.5" resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.90.5.tgz#545e61282c787bd87ac5785da9a4943462f78ef6" @@ -6286,7 +6380,7 @@ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz#1dff176df9cc8f93c78c5e46bcea11079b397578" integrity sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA== -"@tauri-apps/api@2.10.1", "@tauri-apps/api@^2.10.1", "@tauri-apps/api@^2.8.0": +"@tauri-apps/api@^2.10.1", "@tauri-apps/api@^2.8.0": version "2.10.1" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.10.1.tgz#57c1bae6114ec33d977eb2b50dfefc25fa84fc93" integrity sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw== @@ -6682,7 +6776,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.8": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== @@ -7186,7 +7280,7 @@ resolved "https://registry.yarnpkg.com/@types/zxcvbn/-/zxcvbn-4.4.5.tgz#8ce8623ed7a36e3a76d1c0b539708dfb2e859bc0" integrity sha512-FZJgC5Bxuqg7Rhsm/bx6gAruHHhDQ55r+s0JhDh8CQ16fD7NsJJ+p8YMMQDhSQoIrSmjpqqYWA96oQVMNkjRyA== -"@typescript-eslint/eslint-plugin@5.62.0", "@typescript-eslint/eslint-plugin@^5.13.0", "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/eslint-plugin@^8.56.1": +"@typescript-eslint/eslint-plugin@^5.13.0", "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.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== @@ -7202,6 +7296,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^8.56.1": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz#f37b2c189a0177141fe3de3b08f2a83991bfdbfa" + integrity sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.59.2" + "@typescript-eslint/type-utils" "8.59.2" + "@typescript-eslint/utils" "8.59.2" + "@typescript-eslint/visitor-keys" "8.59.2" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.5.0" + "@typescript-eslint/experimental-utils@^5.3.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" @@ -7209,7 +7317,7 @@ dependencies: "@typescript-eslint/utils" "5.62.0" -"@typescript-eslint/parser@5.62.0", "@typescript-eslint/parser@^5.13.0", "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser@^8.56.1": +"@typescript-eslint/parser@^5.13.0", "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.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== @@ -7219,6 +7327,26 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" +"@typescript-eslint/parser@^8.56.1": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.59.2.tgz#e2fd0084baa5dd0c24cd789af1c72cbc3a7a1c62" + integrity sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ== + dependencies: + "@typescript-eslint/scope-manager" "8.59.2" + "@typescript-eslint/types" "8.59.2" + "@typescript-eslint/typescript-estree" "8.59.2" + "@typescript-eslint/visitor-keys" "8.59.2" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.59.2.tgz#f8b8cbf8692e3a51c2c394acf8cf6900f7e755af" + integrity sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.59.2" + "@typescript-eslint/types" "^8.59.2" + 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" @@ -7227,6 +7355,19 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz#63cbd0af2e3180949d6be81122cc555bc71e736d" + integrity sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg== + dependencies: + "@typescript-eslint/types" "8.59.2" + "@typescript-eslint/visitor-keys" "8.59.2" + +"@typescript-eslint/tsconfig-utils@8.59.2", "@typescript-eslint/tsconfig-utils@^8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz#6e92bc412083753185a79c9f1431e78169d9232f" + integrity sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw== + "@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" @@ -7237,11 +7378,27 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz#a60a1192a804fa472a92c41656853ac6a9ba7176" + integrity sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ== + dependencies: + "@typescript-eslint/types" "8.59.2" + "@typescript-eslint/typescript-estree" "8.59.2" + "@typescript-eslint/utils" "8.59.2" + debug "^4.4.3" + ts-api-utils "^2.5.0" + "@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/types@8.59.2", "@typescript-eslint/types@^8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.2.tgz#01caabcd7e4715c33ad5e11cab260829714d6b9c" + integrity sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q== + "@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" @@ -7255,6 +7412,21 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz#6a217ef65b18dbd12c718fc86a675d1d7a1414cc" + integrity sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg== + dependencies: + "@typescript-eslint/project-service" "8.59.2" + "@typescript-eslint/tsconfig-utils" "8.59.2" + "@typescript-eslint/types" "8.59.2" + "@typescript-eslint/visitor-keys" "8.59.2" + 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@5.62.0", "@typescript-eslint/utils@^5.10.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -7269,6 +7441,16 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.59.2.tgz#ff619a6a3075f4017fa91b8610b752a8ca3366aa" + integrity sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.59.2" + "@typescript-eslint/types" "8.59.2" + "@typescript-eslint/typescript-estree" "8.59.2" + "@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" @@ -7277,6 +7459,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@8.59.2": + version "8.59.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz#5ccc486913cd347883d69158836b1189a660bfe6" + integrity sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA== + dependencies: + "@typescript-eslint/types" "8.59.2" + eslint-visitor-keys "^5.0.0" + "@uidotdev/usehooks@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@uidotdev/usehooks/-/usehooks-2.4.1.tgz#4b733eaeae09a7be143c6c9ca158b56cc1ea75bf" @@ -7999,6 +8189,16 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.14.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^8.0.0, ajv@^8.9.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" @@ -8695,6 +8895,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + base-x@^3.0.2, base-x@^3.0.6: version "3.0.11" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" @@ -8917,6 +9122,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +brace-expansion@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== + dependencies: + balanced-match "^4.0.2" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -10745,7 +10957,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, 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.4.0, debug@^4.4.1: +debug@4, debug@^4.0.0, 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.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== @@ -11871,12 +12083,30 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + 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: 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== -eslint@8.57.1, eslint@^8.57.1, eslint@^9, eslint@^9.26.0: +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint-visitor-keys@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + +eslint@^8.57.1: version "8.57.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== @@ -11920,6 +12150,55 @@ eslint@8.57.1, eslint@^8.57.1, eslint@^9, eslint@^9.26.0: strip-ansi "^6.0.1" text-table "^0.2.0" +eslint@^9, eslint@^9.26.0: + version "9.39.4" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.4.tgz#855da1b2e2ad66dc5991195f35e262bcec8117b5" + integrity sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.2" + "@eslint/config-helpers" "^0.4.2" + "@eslint/core" "^0.17.0" + "@eslint/eslintrc" "^3.3.5" + "@eslint/js" "9.39.4" + "@eslint/plugin-kit" "^0.4.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.14.0" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.5" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -11934,7 +12213,7 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.4.2, esquery@^1.5.0: version "1.7.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== @@ -12330,6 +12609,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -12474,6 +12760,14 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -13067,6 +13361,11 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + globalthis@^1.0.0, globalthis@^1.0.1, globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -13781,6 +14080,11 @@ ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: 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== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -15594,6 +15898,13 @@ js-yaml@^3.10.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -15814,7 +16125,7 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -17070,6 +17381,13 @@ minimatch@^10.0.3: dependencies: "@isaacs/brace-expansion" "^5.0.0" +minimatch@^10.2.2: + version "10.2.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== + dependencies: + brace-expansion "^5.0.5" + minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -17077,7 +17395,7 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.5: +minimatch@^3.0.5, minimatch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -18523,6 +18841,11 @@ 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== + pidtree@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" @@ -20593,7 +20916,7 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.3.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.7.2, semver@^7.7.4: +semver@^7.7.2, semver@^7.7.3, semver@^7.7.4: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== @@ -21904,6 +22227,14 @@ tinyglobby@^0.2.13: fdir "^6.5.0" picomatch "^4.0.3" +tinyglobby@^0.2.15: + version "0.2.16" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tinyrainbow@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" @@ -22063,6 +22394,11 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== +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-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5"